Skip to content
Snippets Groups Projects
  1. Jun 16, 2017
    • Vladimir Davydov's avatar
      box: replace info_append_{u32,u64} with info_append_int · ab4e9e9b
      Vladimir Davydov authored
      It's no use having a separate method for every kind of integer we want
      to append to box info - int64_t should suit everyone.
      ab4e9e9b
    • Vladimir Davydov's avatar
      vinyl: fix dump bandwidth calculation · 0b173065
      Vladimir Davydov authored
      We compute dump bandwidth basing on the time it takes a run writing task
      to complete. While it used to work when we didn't have data compression
      and indexes didn't share in-memory tuples, today the logic behind dump
      bandwidth calculation is completely flawed:
      
       - Due to data compression, the amount of memory we dump may be much
         greater than the amount of data we write to disk, in which case dump
         bandwidth will be underestimated.
      
       - If a space has several indexes, dumping it may result in writing more
         data than is actually stored in-memory, because tuples of the same
         space are shared among its indexes in-memory, but stored separately
         when written to disk. In this case, dump bandwidth will be
         overestimated.
      
      This results in quota watermark being set incorrectly and, as a result,
      either stalling transactions or dumping memory non-stop.
      
      Obviously, to resolve both issues, we need to account memory freed per
      unit of time instead of data written to disk. So this patch makes
      vy_scheduler_trigger_dump() remember the time when dump was started and
      vy_scheduler_complete_dump() update dump bandwidth basing on the amount
      of memory dumped and the time dump took.
      0b173065
    • Vladimir Davydov's avatar
      vinyl: do not call vy_scheduler_complete_dump on index deletion · 824ceb32
      Vladimir Davydov authored
      Currently, vy_scheduler_remove_mem() calls vy_scheduler_complete_dump()
      if vy_scheduler_dump_in_progress() returns false, but the latter doesn't
      necessarily mean that the dump has just been completed. The point is
      that vy_scheduler_remove_mem() is called not only for a memory tree that
      has just been dumped to disk, but also for all memory trees of a dropped
      index, i.e. dropping an index when there's no dump in progress results
      in vy_scheduler_complete_dump() invocation. This doesn't do any harm
      now, but looks ugly. Besides, I'm planning to account dump bandwidth in
      vy_scheduler_complete_dump(), which must only be done on actual dump
      completion.
      824ceb32
    • Vladimir Davydov's avatar
      vinyl: factor out functions for memory dump start and completion · 9719b28a
      Vladimir Davydov authored
      Following patches will add more logic to them, so it's better to factor
      them out now to keep the code clean. No functional changes.
      9719b28a
    • Vladimir Davydov's avatar
      vinyl: fix crash if snapshot is called while dump is in progress · dbfd515f
      Vladimir Davydov authored
      Currently, to force dumping all in-memory trees, box.snapshot()
      increments scheduler->generation directly. If dump is in progress and
      there's a space that has more than one index and all its secondary
      indexes have been dumped by the time box.snapshot() is called and its
      primary index is being dumped, incrementing the generation will force
      the scheduler to start dumping secondary indexes of this space again
      (provided, of course, the space has fresh data). Then, creating a dump
      task for a secondary index will attempt to pin the primary index - see
      vy_task_dump_new() => vy_scheduler_pin_index() - which will crash,
      because the primary index is being dumped and hence can't be removed
      from the scheduler by vy_scheduler_pin_index():
      
        Segmentation fault
        #0  0x40c3a4 in sig_fatal_cb(int)+214
        #1  0x7f6ac7981890 in ?
        #2  0x4610bd in vy_scheduler_remove_index+46
        #3  0x4610fe in vy_scheduler_pin_index+49
        #4  0x45f93e in vy_task_dump_new+1478
        #5  0x46137e in vy_scheduler_peek_dump+282
        #6  0x461467 in vy_schedule+47
        #7  0x461bf8 in vy_scheduler_f+1143
      
      To fix that let's trigger dump (by bumping generation) only from the
      scheduler fiber, from vy_scheduler_peek_dump(). The checkpoint will
      force the scheduler to schedule dump by setting checkpoint_in_progress
      flag and setting checkpoint_generation.
      
      Closes #2508
      dbfd515f
    • Konstantin Osipov's avatar
      40d86fe6
    • Vladimir Davydov's avatar
      alter: init space truncate_count after recovering snapshot · 99d6a4f4
      Vladimir Davydov authored
      The replace trigger of _truncate system space (on_replace_dd_truncate)
      does nothing on insertion into or deletion from the space - it only
      updates space truncate_count when a tuple gets updated. As a result,
      space truncate_count isn't initialized properly after recovering
      snapshot. This does no harm to memtx, because it doesn't use space
      truncate_count at all, but it breaks the assumption made by vinyl that
      if space truncate_count is less than index truncate_count (which is
      loaded from vylog), the space will be truncated during WAL recovery and
      hence there's no point in applying statements to the space (see
      vy_is_committed_one). As a result, all statements inserted into a vinyl
      space after snapshot following truncation of the space, are ignored on
      WAL recovery. To fix that, we must initialize space truncate_count when
      a tuple is inserted into _truncate system space.
      
      Closes #2521
      99d6a4f4
    • Roman Tsisyk's avatar
      72be507f
    • Ilya's avatar
      Add HTTP client based on libcurl · 7e62ac79
      Ilya authored
      Inpspired by tarantool/curl module by Vasiliy Soshnikov.
      Reviewed and refactored by Roman Tsisyk.
      
      Closes #2083
      7e62ac79
    • Roman Tsisyk's avatar
      Fix name clash in reflection.h · 414635ed
      Roman Tsisyk authored
      Rename `struct type` to `struct type_info` and `struct method` to
      `struct method_info` to fix name clash with curl/curl.h
      414635ed
  2. Jun 15, 2017
  3. Jun 14, 2017
    • Vladislav Shpilevoy's avatar
      vinyl: decrease usage of vy_mem_older_lsn · 9b8062d5
      Vladislav Shpilevoy authored
      Do not call vy_mem_older_lsn on each UPSERT commit. Older lsn
      statement is used to squash big count of upserts and to turn
      UPSERT into REPLACE, if the older statement has appeared to be
      not UPSERT.
      But n_upserts could be calculated on prepare phase almost free,
      because the bps has method bps_insert_get_iterator, which
      returns iterator to the inserted statement. We can move this
      iterator forward to the older lsn without searching in the tree and
      update n_upserts.
      
      On a commit phase we can get the n_upserts, calculated on a prepare
      phase, and call vy_mem_older_lsn only if there is a sense to
      optimize the UPSERT.
      
      Closes #1988
      9b8062d5
    • Vladislav Shpilevoy's avatar
      vinyl: rename vy_tx_prepare.replace to vy_tx_prepare.repsert · 95e9a101
      Vladislav Shpilevoy authored
      According to the code, 'replace' tuple can also have UPSERT type.
      Lets name it 'repsert' = 'replace' + 'upsert'.
      95e9a101
  4. Jun 13, 2017
  5. Jun 12, 2017
  6. Jun 10, 2017
  7. Jun 09, 2017
    • Vladimir Davydov's avatar
      Improve output of vinyl/gc test · 90901285
      Vladimir Davydov authored
      In case of failure, print files that were not deleted and
      the output of box.internal.gc.info().
      
      Needed for #2486
      90901285
    • Vladimir Davydov's avatar
      Rename box.cfg.vinyl_threads to vinyl_write_threads · c568a658
      Vladimir Davydov authored
      To match box.cfg.vinyl_read_threads introduced by the previous patch.
      c568a658
    • Vladimir Davydov's avatar
      vinyl: use cbus instead of coeio for reading run pages · de885dbf
      Vladimir Davydov authored
      vy_run_iterator_load_page() uses coeio, which is extremely inefficient
      for our cases:
      
       - it locks/unlocks mutexes every time when a task is queued, scheduled,
         or finished
       - it invokes ev_async_send(), which writes to eventfd and wakes up TX
         loop every time on every task completion
       - it blocks tasks until a free worker is available, which leads to
         unpredictable delays
      
      This patch replaces coeio with cbus in the similar way we do TX <-> WAL
      interaction. The number of reader threads is set by a new configuration
      option, vinyl_read_threads, which is set to 1 by default.
      
      Note, this patch doesn't bother adjusting cbus queue length, i.e. it is
      set to INT_MAX as per default. While this is OK when there are a lot of
      concurrent read requests, this might be suboptimal for low-bandwidth
      workloads, resulting in higher latencies. We should probably update the
      queue length dynamically depending on how many clients are out there.
      
      Closes #2493
      de885dbf
  8. Jun 08, 2017
    • bigbes's avatar
      Fix for couple of build problems · 2ba51ab2
      bigbes authored
      2ba51ab2
    • Vladimir Davydov's avatar
      Add engine/truncate test · e9fc8d48
      Vladimir Davydov authored
      e9fc8d48
    • Vladimir Davydov's avatar
      Rework space truncation · 353bcdc5
      Vladimir Davydov authored
      Space truncation that we have now is not atomic: we recreate all indexes
      of the truncated space one by one. This can result in nasty failures if
      a tuple insertion races with the space truncation and sees some indexes
      truncated and others not.
      
      This patch redesigns space truncation as follows:
      
       - Truncate is now triggered by bumping a counter in a new system space
         called _truncate. As before, space truncation is implemented by
         recreating all of its indexes, but now this is done internally in one
         go, inside the space alter trigger. This makes the operation atomic.
      
       - New indexes are created with Handler::createIndex method, old indexes
         are deleted with Index::~Index. Neither Index::commitCreate nor
         Index::commitDrop are called in case of truncation, in contrast to
         space alter. Since memtx needs to release tuples referenced by old
         indexes, and vinyl needs to log space truncation in the metadata log,
         new Handler methods are introduced, prepareTruncateSpace and
         commitTruncateSpace, which are passed the old and new spaces. They
         are called before and after truncate record is written to WAL,
         respectively.
      
       - Since Handler::commitTruncateSpace must not fail while vylog write
         obviously may, we reuse the technique used by commitCreate and
         commitDrop methods of VinylIndex, namely leave the record we failed
         to write in vylog buffer to be either flushed along with the next
         write or replayed on WAL recovery. To be able to detect if truncation
         was logged while recovering WAL, we introduce a new vylog record
         type, VY_LOG_TRUNCATE_INDEX which takes truncate_count as a key: if
         on WAL recovery index truncate_count happens to be <= space
         truncate_count, then it it means that truncation was not logged and
         we need to log it again.
      
      Closes #618
      Closes #2060
      353bcdc5
    • Vladimir Davydov's avatar
      vinyl: convert vy_index->tree to pointer · 801f32c7
      Vladimir Davydov authored
      Space truncate rework done by the next patch requires the ability to
      swap data stored on disk between two indexes on recovery so as not to
      reload all runs every time a space gets truncated. Since we can't swap
      content of two rb tree (due to rbt_nil), convert vy_index->tree to a
      pointer.
      801f32c7
    • Roman Tsisyk's avatar
      Fix -Wunused on on Clang · 85009195
      Roman Tsisyk authored
      85009195
    • Georgy Kirichenko's avatar
      Lock schema for space and index alteration · 5a200cb3
      Georgy Kirichenko authored
      Lock schema before any changes to space and index dictionary and unlock
      only after commit or rollback. This allow many parallel data definition
      statements. Issue #2075
      5a200cb3
    • Georgy Kirichenko's avatar
      Add before statement trigger for spaces · c60fa224
      Georgy Kirichenko authored
      We need to lock box schema while editing a ddl space. This lock should
      be done before any changes in a ddl space. Before trigger is the good
      place to issue a schema lock. See #2075
      c60fa224
Loading