Skip to content
Snippets Groups Projects
  1. Nov 13, 2017
  2. Nov 10, 2017
  3. Nov 06, 2017
  4. Nov 04, 2017
  5. Nov 03, 2017
    • Vladimir Davydov's avatar
      Fix compilation on Mac OS · e9c7a713
      Vladimir Davydov authored
      > src/tarantool/src/box/vinyl.c:2111:33: error: initializer element is not a compile-time constant
      >         static const double weight = 1 - exp(-VY_QUOTA_UPDATE_INTERVAL /
      >                                      ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      
      Remove the "static" qualifier. It is not really needed as any sane
      compiler will pre-calculate the value of 'weight' at compile time
      (checked on gcc 6.3.0 with -O0).
      e9c7a713
    • Vladimir Davydov's avatar
      vinyl: cleanup global statistics · 64a4b538
      Vladimir Davydov authored
       - Remove vy_stat::rmean statistics, which were left from Sophia, as now
         we have per index statistics which are much more verbose than those.
      
       - Move vy_stat::dump_bw to vy_env and remove struct vy_stat as there's
         nothing left in it.
      
       - Move quota statistics from box.info.vinyl().performance.memory to
         box.info.vinyl().quota. Remove 'ratio', which equals used / limit, as
         this kind of calculations should be done by a script aggregating
         statistics. Report 'use_rate' and 'dump_bandwidth' there.
      
       - Report 'limit' in cache statistics to make them consistent with
         'quota' statistics, where 'limit' is reported. Rename 'cache.count'
         to 'cache.tuples'. Remove vy_cache_env::cache_count, use mempool
         stats instead.
      
       - Move 'tx_allocated', 'txv_allocated', 'read_interval', 'read_view'
         from box.info.vinyl().performance to box.info.vinyl().tx and name
         them 'transactions', 'statements', 'gap_locks', and 'read_views',
         respectively. Remove vy_tx_stat::active and 'tx.active' as the same
         value is shown by 'tx.transactions', extracted from the mempool.
      
       - Zap box.info.vinyl().performance - there's nothing left there.
      
      Now global statistics look like:
      
        tarantool> box.info.vinyl()
        ---
        - cache:
            limit: 134217728
            tuples: 32344
            used: 34898794
          tx:
            conflict: 1
            commit: 324
            rollback: 13
            statements: 10
            transactions: 3
            gap_locks: 4
            read_views: 1
          quota:
            dump_bandwidth: 10000000
            watermark: 119488351
            use_rate: 1232703
            limit: 134217728
            used: 34014634
        ...
      
      Closes #2861
      64a4b538
    • Vladimir Davydov's avatar
      vinyl: do not use rmean for calculating quota use rate · 5e28b70a
      Vladimir Davydov authored
      We have a timer for updating watermark every second. Let's reuse it for
      quota use rate calculation. This will allow us to get rid of legacy
      vinyl statistics.
      
      Also, let's use EWMA for calculating the average. It is a more efficient
      and common method, which allows to easily tune the period over which the
      value is averaged.
      5e28b70a
    • Roman Tsisyk's avatar
      box: add box.NULL alias for msgpack.NULL · 043ba278
      Roman Tsisyk authored
      Follow up #1557
      043ba278
  6. Nov 02, 2017
    • Alexandr Lyapunov's avatar
      Reject attempts to create non-string index part with collation · 4c10b711
      Alexandr Lyapunov authored
      Collation was simply ignored for non-string parts, that could
      confuse potential user.
      
      Generate a readable error in this case.
      
      Fix #2862 part 2
      4c10b711
    • Alexandr Lyapunov's avatar
      Make collation work with scalar fields · 2601fcd3
      Alexandr Lyapunov authored
      Now collation is silently ignored for type='scalar' parts.
      
      Use collation for string scalar fields.
      
      Fix #2862 part 1
      2601fcd3
    • Alexandr Lyapunov's avatar
      Show collation in lua index object · 76b6e110
      Alexandr Lyapunov authored
      Show collation name (if present) in space.index.name.parts[no].
      
      Fix #2862 part 4
      76b6e110
    • Alexandr Lyapunov's avatar
      Make collation by name lookup case insensitive · 3f9a73a7
      Alexandr Lyapunov authored
      test:create_index('unicode_s1', {parts = {{1, 'STR', collation =
      'UNICODE'}}}) will work now.
      
      Fix #2862 part 3
      3f9a73a7
    • Vladislav Shpilevoy's avatar
      schema: allow to store smaller field count that specified in format · 2f53308e
      Vladislav Shpilevoy authored
      If a field is not indexed and no more indexed or not nullable
      fields after that, than allow to skip it in insertion. Such field
      value looks like MP_NIL, but MP_NIL is not explicitly stored.
      Named access to this field in lua returns nil.
      
      Example:
      format =
      {{'field1'},
       {'field2'},
       {'field3', is_nullable = true},
       {'field4', is_nullable = true}}
      
      t = space:insert{1, 2} -- ok.
      
      t.field1 == 1, t.field2 == 2, t.field3 == nil, t.field4 == nil
      
      Closes #2880
      2f53308e
    • Vladislav Shpilevoy's avatar
      schema: allow to store custom fields in format's field definition · f688ef36
      Vladislav Shpilevoy authored
      Some users store in format fields their custom keys. But current
      opts parser does not allow to store any unknown keys. Lets allow it.
      
      Example:
      format = {}
      format[1] = {name = 'field1', type = 'unsigned', custom_field = 'custom_value'}
      s = box.schema.create_space('test', {format = format})
      s:format()[1].custom_field == 'custom_value'
      
      Closes #2839
      f688ef36
    • Vladimir Davydov's avatar
      vinyl: forbid DDL/DML if wal is disabled · b75ab0e0
      Vladimir Davydov authored
      Using DML/DDL on a Vinyl index with wal_mode = 'none' is likely to
      result in unrecoverable errors like:
      
        F> can't initialize storage: Invalid VYLOG file: Index 512/0 created twice
      
      To avoid data corruption in case the user tries to use an existing Vinyl
      database in conjunction with wal_mode = 'none', let's explicitly forbid
      it until we figure out how to fix it.
      
      Workaround #2278
      b75ab0e0
    • Vladimir Davydov's avatar
      vinyl: ignore quota timeout during bootstrap from master · 19ac10c9
      Vladimir Davydov authored
      During initial join, a replica receives all data accumulated on the
      master for its whole lifetime, which may be quota a lot. If the network
      connection is fast enough, the replica might fail to keep up with dumps,
      in which case replication fails with ER_VY_QUOTA_TIMEOUT. To avoid that,
      let's ignore quota timeout until bootstrap is complete.
      
      Note, replication may still fail during the 'subscribe' stage for the
      same reason, but it's unlikely, because the rate at which the master
      sends data is limited by the number of requests served by the master per
      a unit of time, and it should become nearly impossible once throttling
      is introduced (See #1862).
      
      Closes #2873
      19ac10c9
    • Vladimir Davydov's avatar
      vinyl: abort bootstrap if vinyl directory is not empty · 4d796a8c
      Vladimir Davydov authored
      If the user sets snap_dir to an empty directory by mistake while leaving
      vinyl_dir the same, tarantool will still bootstrap, but there is likely
      to be errors like:
      
        vinyl.c:835 E> 512/0: dump failed: file './512/0/00000000000000000001.run' already exists
        vy_log.c:1095 E> failed to rotate metadata log: file './00000000000000000005.vylog' already exists
      
      Even worse, it may eventually fail to restart with:
      
        vy_log.c:886 E> ER_MISSING_SNAPSHOT: Can't find snapshot
      
      To avoid that, let's check the vinyl_dir on bootstrap and abort if it
      contains vylog files left from previous setups.
      
      Closes #2872
      4d796a8c
    • Vladimir Davydov's avatar
      vinyl: embed scheduler in env · 76481655
      Vladimir Davydov authored
      The only reason why it was allocated is that struct vy_scheduler was
      defined after struct vy_env, which is not a problem any more. Embedding
      it allows us to drop the extra argument to vy_scheduler_need_dump_f().
      76481655
    • Vladimir Davydov's avatar
      vinyl: move scheduler implementation to separate source file · 9f140646
      Vladimir Davydov authored
      It's a big independent entity, let's isolate its code in
      a separate file.
      
      While we are at it, add missing comments to vy_scheduler
      struct members.
      9f140646
    • Vladimir Davydov's avatar
      vinyl: remove dependency of scheduler on environment · 32da4d7c
      Vladimir Davydov authored
      Instead of storing a pointer to vy_env in vy_scheduler, let's:
      
       - Add pointers to tx_manager::read_views and vy_env::run_env to
         vy_scheduler struct. They are needed to create a write iterator
         for a dump/compaction task.
      
       - Add a callback to struct vy_scheduler that is called upon dump
         completion to free memory. This allows us to eliminate accesses
         vy_env::quota and vy_env::allocator from vy_scheduler code.
      
       - Move the assert that assures that the scheduler isn't started during
         local recovery from vy_scheduler_f() to vy_env_quota_exceeded_cb()
         callback so that we don't need to access vy_env::status from the
         scheduler code. Note, after this change we have to set vy_env::status
         to VINYL_ONLINE before calling vy_quota_set_limit(), because the
         latter might schedule a dump.
      
       - Check if we have anything to dump from vy_begin_checkpoint() instead
         of vy_scheduler_begin_checkpoint().
      
      This will allow us to isolate the scheduler code in a separate file.
      32da4d7c
    • Vladimir Davydov's avatar
      vinyl: rework dump trigger · f927a87b
      Vladimir Davydov authored
      Currently, dump is triggered (by bumping the memory generation) by the
      scheduler fiber while quota consumers just wake it up. As a result, the
      scheduler depends on the quota - it has to access the quota to check if
      it needs to trigger dump. In order to move the scheduler to a separate
      source file, we need to get rid of this dependency.
      
      Let's rework this code as follows:
      
       - Remove vy_scheduler_trigger_dump() from vy_scheduler_peek_dump(). The
         scheduler fiber now just dumps all indexes eligible for dump and
         completes dump by bumping dump_generation. It doesn't trigger dump by
         bumping generation anymore. As a result, it doesn't need to access
         the quota.
      
       - Make quota consumers call vy_scheduler_trigger_dump() instead of just
         waking up the scheduler. This function will become a public one once
         the scheduler is moved out of vinyl.c. The function logic is changed
         a bit. First, besides bumping generation, it now also wakes up the
         scheduler fiber. Second, it does nothing if dump is already in
         progress or can't be scheduled because of concurrent checkpoint.
         In the latter case it sets a special flag though that will force the
         scheduler trigger dump upon checkpoint completion.
      
       - vy_scheduler_begin_checkpoint() can't use vy_scheduler_trigger_dump()
         anymore due to additional checks added to the function, so it bumps
         the generation directly. This looks fine.
      
       - Such a design has a subtlety regarding how quota consumers notify the
         scheduler and how they are notified back about available quota.
         In extreme cases, quota released by a dump may be not enough to
         satisfy all consumers, in which case we need to reschedule dump.
         Since the scheduler doesn't check the quota anymore and doesn't
         reschedule dump, it has to be done by the left consumers. So
         consumers has to call the quota_exceeded_cb (which triggers a dump
         now) callback every time they are woken up and see there's not enough
         quota. The vy_quota_use() is reworked accordingly.
      
         Also, since the quota usage may exceed the limit (because of
         vy_quota_force_use()), the quota usage may remain higher than the
         limit after a dump completion, in which case vy_quota_release()
         doesn't wake up consumers and again there's no one to trigger another
         dump. So we must wake up all consumers every time vy_quota_release()
         is called.
      f927a87b
    • Vladimir Davydov's avatar
      vinyl: move throttling code to vy_quota · 0d751d84
      Vladimir Davydov authored
      quota_cond, which is used for throttling quota consumers, doesn't really
      belong to vy_scheduler. It would fit much better in vy_quota. Let's move
      it there. This also allows us to remove the two callbacks from vy_quota
      struct, quota_throttled_cb and quota_released_cb, and make the code more
      straightforward.
      
      While we are at it, let's also rename vy_scheduler_quota_exceeded_cb()
      to vy_env_quota_exceeded_cb().
      0d751d84
  7. Nov 01, 2017
  8. Oct 31, 2017
Loading