Skip to content
Snippets Groups Projects
  1. Apr 06, 2018
  2. Apr 05, 2018
    • Vladimir Davydov's avatar
      vinyl: do not use space_vtab::commit_alter for preparing new indexes · 48a47600
      Vladimir Davydov authored
      Currently, space_vtab::commit_alter is called before WAL write so we can
      use it for preparing new indexes in vinyl. However, this is going to
      change soon, because actually space_vtab::commit_alter should be called
      after WAL write, like index_vtab::commit_drop or commit_create. Calling
      it before WAL write may result in use-after-free in memtx (see #3289).
      Besides, using this function for iterating over space indexes just feels
      wrong, as we have index methods invoked by AlterSpaceOp descendants for
      this.
      
      So let's move all the operations performed by vinyl_space_commit_alter
      somewhere else. Fortunately, it's easy to do without damaging code
      readability or efficiency:
      
       - Update of vy_lsm::pk can be done by vinyl_space_swap_index and
         vinyl_build_secondary_key.
      
       - vy_lsm->check_is_unique can be computed by vinyl_engine_create_space
         and then set by vinyl_space_swap_index.
      
       - Call to key_def_update_optionality is implied by key_def_swap, which
         is already called by vinyl_space_swap_index, hence it can be removed.
      
      Needed for #3289
      48a47600
    • Vladimir Davydov's avatar
      memtx: don't call begin_buid and end_build for new pk after recovery · 30db003a
      Vladimir Davydov authored
      Basically, index_begin_build() followed by index_end_build() is a no-op.
      There's absolutely no point in calling it for primary indexes after
      initial recovery has completed.
      30db003a
    • Vladislav Shpilevoy's avatar
      netbox: reuse _request() to do SQL execute() · 9401c4f9
      Vladislav Shpilevoy authored
      _request() is a wrapper for perform_request, that detects schema
      changes, and waits until it is reloaded. Lets use _request()
      instead of direct perform_request() for execute(). The reason why
      the _request() was not used earlier was my attempt to avoid
      multiple return values in _request(), that leads to minor fixes
      in non-execute methods like index.select or eval/call_16, which
      return the _request() directly.
      
      But diplicating schema reloading logic for execute() is worse.
      
      Closes #3323
      Closes #3322
      9401c4f9
    • Vladislav Shpilevoy's avatar
      netbox: forbid conn:timeout():execute(...) · 3874ab58
      Vladislav Shpilevoy authored
      This API is deprecated in 1.7.4, so it must not be
      supported in new methods like execute().
      3874ab58
    • Vladimir Davydov's avatar
      vinyl: use disk_format in vy_run_rebuild_index · 828a33bf
      Vladimir Davydov authored
      We read tuples from disk hence we should use disk_format, not
      mem_format. Fix it. While we are at it, let's also update the
      outdated comment to vy_run_rebuild_index.
      828a33bf
    • Vladimir Davydov's avatar
      memtx: rtree: remove pointless index_vtab::begin_build implementation · 50fcc202
      Vladimir Davydov authored
      The rtree is empty when this function is called (in fact, it is called
      right after creating the index), there's no need to purge it.
      50fcc202
    • Vladimir Davydov's avatar
      vinyl: allow to modify key definition if it does not require rebuild · a0299db8
      Vladimir Davydov authored
      To allow extending key definition for non-empty vinyl spaces, this patch
      performs the following steps:
      
       - Revert commit c31dd19a ("vinyl: forbid vinyl index key definition
         alter") that forbade any key def alter. It isn't needed anymore.
      
       - Update key_def and cmp_def in vinyl_space_swap_index(). We simply
         swap the definitions between the old and new indexes in memory.
         Since all vinyl objects reference either vy_lsm::key_def or
         vy_lsm::cmp_def or both, and the change is compatible (does not
         change the order for existing tuples), this should work just fine.
      
       - Update key definition in vylog on ALTER. For this, we introduce a new
         vylog record type, VY_LOG_MODIFY_LSM, which updates key definition.
         To be able to replay it on recovery in case we failed to flush it
         before restart, we also store the LSN of the WAL record that
         triggered the ALTER.
      
      It also adds the following test cases:
      
       - Modify key definition of primary and secondary indexes of a non-empty
         space (engine/ddl).
      
       - Modify key definition before snapshot and relay it to a newly joined
         replica (engine/replica_join).
      
       - Make sure key definition is updated in vylog on ALTER (vinyl/layout).
      a0299db8
    • Vladimir Davydov's avatar
      vinyl: do not write VY_LOG_DUMP_LSM record to snapshot · 48e97cd3
      Vladimir Davydov authored
      There's no point in writing this record to snapshot, because we can
      store LSN of the last index dump right in VY_LOG_CREATE_LSM record.
      48e97cd3
    • Vladimir Davydov's avatar
      vinyl: rename vy_log_record::commit_lsn to create_lsn · aadd7901
      Vladimir Davydov authored
      So as to draw the line between LSN of index creation and LSN of last
      index modification, which is introduced by later in the series.
      aadd7901
    • Nikita Pettik's avatar
      sql: rework 'DROP INDEX' and 'DROP TABLE' handling · 41616a28
      Nikita Pettik authored
      As a part of SQL data dictionary integration, 'DROP INDEX' and
      'DROP TABLE' statements proccessing has been refactored in order
      to avoid using SQL specific internal structures.
      However, triggers still aren't transfered to server, so to drop them
      it is required to lookup SQL table and emit apporpriate opcodes.
      Also, added comments and fixed codestyle for functions processing
      'DROP' routine.
      
      Part of #3222.
      41616a28
    • Nikita Pettik's avatar
      sql: remove obsolete SQLite routine · 4e4f8529
      Nikita Pettik authored
      Some of legacy functions seem to be useless, since they serve as
      wrappers around others; the rest rely on capabilities which are no
      longer relevant. This patch provides slight refactoring of such
      functions or removes them at all.
      4e4f8529
    • Vladimir Davydov's avatar
      vinyl: use source tuple format when copying field map · d647f27a
      Vladimir Davydov authored
      There are two functions in vy_stmt.c that blindly copy tuple field map,
      vy_stmt_dup() and vy_stmt_replace_from_upsert(). Both these functions
      take a tuple format to use for the new statement and require this format
      to be the same as the source tuple format in terms of fields definition,
      otherwise they'll just crash. The only reason why we did that is that
      back when these functions were written we used a separate format for
      UPSERT statements so we needed this extra argument for creating a
      REPLACE from UPSERT. Now it's not needed, and we can use the source
      tuple format instead. Moreover, passing the current tuple format to any
      of those functions is even harmful, because tuple format can be extended
      by ALTER, in which case these functions will crash if called on a
      statement created before ALTER. That being said, let's drop the tuple
      format argument.
      d647f27a
    • Vladimir Davydov's avatar
      vinyl: remove pointless is_nullable initialization for disk_format · b2469121
      Vladimir Davydov authored
      space->format and cmp_def must be compatible, i.e. space->format has
      is_nullable flag set for a field iff it is set for all key parts
      indexing this field. Therefore there's no point to set is_nullable for
      disk_format as it must have been initialized by tuple_format_create().
      Remove the pointless loop.
      
      Also, while we are at it, fix the minor memory leak - disk_format is
      referenced twice for the primary key.
      b2469121
    • Vladimir Davydov's avatar
      vinyl: zap vy_mem_update_formats · 0ce7381f
      Vladimir Davydov authored
      A piece of code left from the inglorious past, which doesn't even have
      a forward declaration, let alone used anywhere. Remove it.
      0ce7381f
    • Vladimir Davydov's avatar
      vinyl: zap vy_lsm_validate_formats · fac96568
      Vladimir Davydov authored
      We allocate index formats in the only place, vy_lsm_new, so there's no
      point in this debug-only check anymore.
      fac96568
    • Vladimir Davydov's avatar
      vinyl: do not reallocate tuple formats on alter · d75c24a4
      Vladimir Davydov authored
      We create new formats for all indexes of the new space in
      vinyl_space_commit_alter() while we don't actually need to
      do this, because the new formats have already been created
      by vy_lsm_new() - all we need to do is reuse them somehow.
      
      This patch does the trick: it implements the swap_index()
      space virtual method for vinyl so that it swaps tuple formats
      between the old and new spaces.
      d75c24a4
    • Vladimir Davydov's avatar
      space: make space_swap_index method virtual · 1cb16edb
      Vladimir Davydov authored
      This function is called by MoveIndex and ModifyIndex ALTER operations,
      i.e. when the index definition is not changed at all or is extended.
      Making this method virtual will allow to avoid reallocation of vinyl
      formats in vinyl_space_commit_alter().
      1cb16edb
    • Vladimir Davydov's avatar
      alter: do not rebuild secondary indexes on compatible pk changes · 7e214255
      Vladimir Davydov authored
      If the new cmp_def of a secondary index is compatible with the old one
      after the primary key parts have changed, we don't need to rebuild it,
      we just need to update its definition.
      7e214255
    • Nikita Pettik's avatar
      sql: remove obsolete pragmas · 86aaf3e8
      Nikita Pettik authored
      Some pragmas turn out to be useless and can't be applied to Tarantool's SQL.
      Moreover, couple of them lead to assertion faults.
      List or removed pragmas:
      - synchronous
      - empty_result_callbacks
      - WAL_autocheckpoint
      - WAL_checkpoint
      - secure_delete
      - database_list
      - data_version
      - compile_options
      - application_id
      - user_version
      - pragmas connected with HAS_CODEC macro
      - pragmas connected with heap memory managment
      86aaf3e8
    • Vladimir Davydov's avatar
      alter: require rebuild of all secondary vinyl indexes if pk changes · d6d3e2c0
      Vladimir Davydov authored
      If the primary key is modified, we schedule rebuild of all non-unique
      (including nullable) secondary TREE indexes. This is valid for memtx,
      but is not quite right for vinyl. For vinyl we have to rebuild all
      secondary indexes, because they are all non-clustered (i.e. point to
      tuples via primary key parts). This doesn't result in any bugs for now,
      because rebuild of vinyl indexes is not supported, but hopefully this is
      going to change soon. So let's introduce a new virtual index method,
      index_vtab::depends_on_pk, which returns true iff the index needs to be
      updated if the primary key changes, and define this new method for vinyl
      and memtx TREE indexes.
      d6d3e2c0
    • vanyail's avatar
      sql: ban of REINDEX syntax · 73445865
      vanyail authored
      This change removes REINDEX from keywords and also disables tests
      which were using this syntax.
      
      This patch affects only parser, REINDEX implementation still exists,
      because it is planned to be fixed and enabled in the scope of #3195.
      
      Note that REINDEX keyword is still in '%fallback' directive in
      'parse.y'. Reserved keywords included there to avoid situation when
      a keyword has no usages within 'parse.y' file.
      
      Fixes #2174
      73445865
    • Vladimir Davydov's avatar
      index: add commit_modify virtual method · 28c31d69
      Vladimir Davydov authored
      The new method is called after successful update of index definition.
      It is passed the signature of the WAL record that committed the
      operation. It will be used by Vinyl to update key definition in vylog.
      28c31d69
    • Bulat Niatshin's avatar
      sql: fix non-working 'INDEXED BY' clause · e4537700
      Bulat Niatshin authored
      Fix non-working 'INDEXED BY' clause for SELECT statement,
      which caused syntax-error during execution.
      
      Closes #2996
      e4537700
    • Vladislav Shpilevoy's avatar
      sql: remove useless branching in insertOrReplace · cc5e57d9
      Vladislav Shpilevoy authored
      Type of an operation for struct request can be passed directly
      with no "proxying" by special codes.
      cc5e57d9
    • Vladislav Shpilevoy's avatar
      sql: simplify lua SQL executor · 04ab1b01
      Vladislav Shpilevoy authored
      1) Code is completely unreadable and complicated by strange
         optimizations;
      2) It still supposes, that there can be multiple statements in a
         single string;
      3) It pushes first letter of affinity together with column names
         - why? It is not used anywhere.
      
      Lets remove prepared statements list, affinity first letters
      pushing.
      04ab1b01
    • Vladislav Shpilevoy's avatar
      sql: light error codes refactoring · 4dcffa84
      Vladislav Shpilevoy authored
      Remove unused error codes, use enum instead of
      defines. Later the prefix SQLITE_ must be removed -
      see #3315.
      4dcffa84
    • Vladislav Shpilevoy's avatar
      sql: remove unused operands from OP_IdxInsert/Replace · 5668add4
      Vladislav Shpilevoy authored
      And rework sqlite3CompleteInsertion. Before the patch it
      * accepts actually unused pTab;
      * array of records to insert in different indexes, but inserts
        only one;
      * has sqlite code style.
      
      Code style fix is obvious. PTab is used only to check, that it is
      not a view and to check, that a first index is primary:
      1) caller functions already guarantee the pTab is not a view;
      2) regardless of a first index nature: primary or not - it is not
         used here. It is useless check. With the same success we can
         check this in each function, that uses struct Table.
      
      Array of records to insert makes no sense, since insertion is
      being done in a primary index only. It is enough to pass a
      register with a primary index tuple.
      5668add4
    • Konstantin Osipov's avatar
    • Ilya Markov's avatar
      log: Fix syslog logger · 7c7a2fa1
      Ilya Markov authored
      * Remove rewriting format of default logger in case of syslog option.
      * Add facility option parsing and use parsed results in format message
        according to RFC3164. Possible values and default value of syslog
        facility are taken from nginx (https://nginx.ru/en/docs/syslog.html)
      * Move initialization of logger type and format fucntion before
        initialization of descriptor in log_XXX_init, so that we can test
        format function of syslog logger.
      
      Closes gh-3244.
      7c7a2fa1
  3. Apr 04, 2018
  4. Apr 03, 2018
    • Konstantin Osipov's avatar
    • Vladimir Davydov's avatar
      vinyl: fail transaction immediately if it does not fit in memory · 8f63d5d9
      Vladimir Davydov authored
      If the size of a transaction is greater than the configured memory
      limit (box.cfg.vinyl_memory), the transaction will hang on commit
      for 60 seconds (box.cfg.vinyl_timeout) and then fail with the
      following error message:
      
        Timed out waiting for Vinyl memory quota
      
      This is confusing. Let's fail such transactions immediately with
      OutOfMemory error.
      
      Closes #3291
      8f63d5d9
    • Kirill Yukhin's avatar
      sql: move default col values to Tarantool's core · b9c9792d
      Kirill Yukhin authored
      Extract expressions parsing into separate routine to
      allow Tarantool's backend compile DEFAULT statements w/o
      SQL machinery at all. So far, for DEFAULT values no context
      is needed: only constant expressions and built-ins are allowed.
      In future, table context will be added to allow use column
      values for CHECK constraint expressions.
      
      Move DEFAULT string value to space_def. Move compiled expresion
      to field_def as well. Reason not to move compiled expression
      to tuple_field as follows: we do not want to engage parser
      during tuple validation. So, do it in alter.cc.
      
      In order to allow expression duplication in alter.cc: expose
      those routines from expr.c and make their names correspond to
      coding style.
      
      Since recovery is performed before SQL fronend initialization:
      split it into two pieces: 1. create SQL handler, enable
      all subsystems 2. Do recovery.  This will allow to run
      parser during recovery, since it needs db handle so far.
      
      Part of #3235
      b9c9792d
Loading