Skip to content
Snippets Groups Projects
  1. Aug 04, 2022
    • Vladimir Davydov's avatar
      Use bps_tree_size instead of accessing size directly · 5855fd30
      Vladimir Davydov authored
      We have a method for getting the number of elements stored in a BPS
      tree. Let's use it instead of accessing BPS tree internals directly
      so that we can freely refactor BPS tree internals.
      
      NO_DOC=refactoring
      NO_TEST=refactoring
      NO_CHANGELOG=refactoring
      5855fd30
    • Vladimir Davydov's avatar
      salad: minor bps tree code cleanup · 2fa28b41
      Vladimir Davydov authored
       - Add bps_tree_delete_value to the comment and declarations.
         (All other public methods are there.)
       - Fix typo in a comment: approxiamte -> approximate.
       - Fix comment to bps_tree_random.
       - Remove repeated word 'count' from comments.
      
      NO_DOC=no change
      NO_TEST=no change
      NO_CHANGELOG=no change
      2fa28b41
    • Vladimir Davydov's avatar
      salad: rename a few bps_tree methods · c84990ad
      Vladimir Davydov authored
       - Rename bps_tree_iterator_are_equal to bps_tree_iterator_is_equal for
         consistency with other methods that check two objects for equality
         (for example, tt_uuid_is_equal).
      
       - Rename bps_tree_iterator_first and bps_tree_iterator_last to
         bps_tree_first and bps_tree_last, because these are methods of
         bps_tree, not bps_tree_iterator. Omitting _iterator is also
         consistent with bps_tree_lower_bound and bps_tree_upper_bound
         methods, which also create bps_tree_iterator objects.
      
      NO_DOC=refactoring
      NO_TEST=refactoring
      NO_CHANGELOG=refactoring
      c84990ad
    • Georgiy Lebedev's avatar
      memtx: fix reverse iterators gap tracking · fda38e66
      Georgiy Lebedev authored
      In case of reverse iterators, due to index limitations, we need to clarify
      the successor tuple early: this implies that the successor's story is not
      always at the top of the history chain, whilst we need to add the gap item
      to the story currently present in index — fix this by reusing the
      iterators' check logic to set the current iterator's tuple (which is
      considered the successor) to a tuple in index.
      
      CLoses #7409
      
      NO_DOC=bugfix
      fda38e66
    • Georgiy Lebedev's avatar
      memtx: remove `tree_iterator_set_current_tuple` on clarified tuples · 837e0524
      Georgiy Lebedev authored
      All the 'base' TREE index iterator `next` methods (including
      `tree_iterator_start`) internally set the iterator's current tuple to the
      one found in the index satisfying the conditions: setting the iterator's
      current tuple to the clarified one is redundant and moreover gives a
      performance penalty each iteration because of the iterator check logic.
      
      Needed for #7409
      
      NO_CHANGELOG=refactoring
      NO_DOC=refactoring
      NO_TEST=refactoring
      837e0524
    • Georgiy Lebedev's avatar
      memtx: fix HASH index 'GT' iterator `next` method set incorrectly · 5c0d7117
      Georgiy Lebedev authored
      The `next` method of memtx HASH index 'GT' iterator is initially set to
      'GT' and is supposed to be set to 'GE' after first iteration: it is
      mistakenly set to the 'base' method instead of the full method which also
      does tuple clarification — this allows dirty reads. Move the `next` method
      change on first iteration to `WRAP_ITERATOR_METHOD` for clarity and
      correctness.
      
      Closes #7477
      
      NO_DOC=bugfix
      5c0d7117
    • Vladimir Davydov's avatar
      salad: rework light hash read view API · b595f212
      Vladimir Davydov authored
      Currently, there's no notion of a LIGHT hash table read view per se -
      one can create an iterator over a regular hash table and then "freeze"
      it. This works just fine for snapshotting and joining replicas, but this
      spartan API doesn't let us implement user read views, because to do that
      we need to do lookups and create iterators over a frozen hash table as
      many times as we want, not just once.
      
      So this patch introduces a concept of LIGHT(view), which contains a
      frozen image of a LIGHT(core) and implements a subset of non-modifying
      LIGHT(core) methods:
      
       - LIGHT(view_count)
       - LIGHT(view_find)
       - LIGHT(view_find_key)
       - LIGHT(view_get)
       - LIGHT(view_iterator_begin)
       - LIGHT(view_iterator_key)
       - LIGHT(view_iterator_get_and_next)
      
      Note, LIGHT(core) and LIGHT(view) share LIGHT(iterator), because
      iterator methods (begin, key, get_and_next) take LIGHT(core) or
      LIGHT(view). The LIGHT(iterator) now contains only a hash table slot.
      
      We could also implement the rest of non-modifying methods, but didn't do
      that, because they are not needed to implement user read views:
      
       - LIGHT(random)
       - LIGHT(selfcheck)
      
      To create a LIGHT(view) from a LIGHT(core), one is supposed to call
      LIGHT(view_create). If a LIGHT(view) is no longer needed, it should be
      destroyed with LIGHT(view_destroy).
      
      Old methods used for creating frozen iterators were dropped:
      
       - LIGHT(iterator_freeze)
       - LIGHT(iterator_destroy)
      
      To avoid code duplication, we factored out the common part of
      LIGHT(core) and LIGHT(view) into a new structure, named LIGHT(common).
      Basically, the new structure contains all LIGHT(core) members except
      matras, which is stored in LIGHT(core). The difference between
      LIGHT(view) and LIGHT(core) is that the latter stores matras_view
      instead of matras. The common part contains pointers to matras and
      matras_view, which are used by internal implementation to look up
      LIGHT(record).
      
      All internal methods now take LIGHT(common) instead of LIGHT(core).
      For all public methods that are implemented both for LIGHT(core) and
      LIGHT(view), we have the common implementation defined in _impl suffixed
      private function, which is called by the corresponding public functions.
      
      To ensure that a modifying method isn't called on LIGHT(common) object
      corresponding to a LIGHT(view) because of a bug in the LIGHT code, we
      added !matras_is_read_view_created assertion to LIGHT(touch_record),
      LIGHT(prepare_first_insert), and LIGHT(grow).
      
      Closes #7192
      
      NO_DOC=refactoring
      NO_CHANGELOG=refactoring
      b595f212
    • Vladimir Davydov's avatar
      salad: add helpers to get/touch light records · 8fc5776d
      Vladimir Davydov authored
      Currently, matras_get and matras_touch are called directly. Since soon
      we'll need to pass a matras_view to those methods, let's add convenience
      wrappers.
      
      Needed for #7192
      
      NO_DOC=refactoring
      NO_TEST=refactoring
      NO_CHANGELOG=refactoring
      8fc5776d
    • Vladimir Davydov's avatar
      salad: add LIGHT(random) method · 76add786
      Vladimir Davydov authored
      This commit moves the code that gets the index of a random light
      record from the memtx hash index implementation to a new light method.
      This gives us more freedom of refactoring the light internals without
      modifying the code using it.
      
      After this change, LIGHT(pos_valid) isn't needed anymore so it's
      inlined in LIGHT(random).
      
      Needed for #7192
      
      NO_DOC=refactoring
      NO_TEST=refactoring
      NO_CHANGELOG=refactoring
      76add786
    • Vladimir Davydov's avatar
      salad: add LIGHT(count) method · 77b552fe
      Vladimir Davydov authored
      This commit adds a function that retrieves the number of records stored
      in a light hash table and makes light users use it instead of accessing
      the light count directly. This gives us more freedom of refactoring the
      light internals without modifying the code using it.
      
      Needed for #7192
      
      NO_DOC=refactoring
      NO_TEST=refactoring
      NO_CHANGELOG=refactoring
      77b552fe
    • Gleb Kashkin's avatar
      lua: exclude `_` prefix vars from unused check · 39deec83
      Gleb Kashkin authored
      Update luacheckrc to suppress all warnings from lua vars with `_` prefix.
      This allows to declare a function with an expected standardized interface
      without unused var warning.
      Fix luacheck warnings in src/box/console.lua.
      
      Closes #5032
      
      NO_CHANGELOG=warning fix
      NO_DOC=warning fix
      NO_TEST=warning fix
      39deec83
    • Vladimir Davydov's avatar
      prbuf: fix prbuf_open for empty buffer · 943ce3ca
      Vladimir Davydov authored
      prbuf_check, which is called by prbuf_open, proceeds to scanning the
      buffer even if it's empty. On debug build, this results in prbuf_open
      reporting that the buffer is corrupted, because we trash the buffer in
      prbuf_create. On a release build, this may lead to a hang, in case the
      buffer is zeroed out. Let's fix this by returning success from
      prbuf_check if the buffer is empty. Note, prbuf_iterator_next doesn't
      call prbuf_first_record if the buffer is empty, either.
      
      Needed for https://github.com/tarantool/tarantool-ee/issues/187
      
      NO_DOC=bug fix
      NO_CHANGELOG=will be added to EE
      943ce3ca
    • Alexander Turenko's avatar
      cmake: clean up list of API headers · 5bfa6729
      Alexander Turenko authored
      This list contains several header files, which has no
      `/** cond public */` and `/** \endcond public */` instructions.
      
      While I'm on it, drop `/** \endcond public */` from box.cc.
      
      NO_DOC=pure code health patch, no visible changes
      NO_TEST=pure code health patch, no visible changes
      NO_CHANGELOG=pure code health patch, no visible changes
      5bfa6729
    • Alexander Turenko's avatar
      cmake: eliminate warning about source properties · c457608d
      Alexander Turenko authored
      The GENERATED and HEADER_FILE_ONLY source file properties should be
      followed by a boolean value. CMake 3.20+ warns if it is not so, see [1].
      
      It seems, the module.h properties do not actually change anything
      visible in our case.
      
      [1]: https://cmake.org/cmake/help/latest/policy/CMP0118.html
      
      NO_DOC=pure code health patch, no visible changes
      NO_TEST=pure code health patch, no visible changes
      NO_CHANGELOG=pure code health patch, no visible changes
      c457608d
    • Alexander Turenko's avatar
      decimal: add the library into the module API · 5c1bc3da
      Alexander Turenko authored
      The main decision made in this patch is how large the public
      `box_decimal_t` type should be. Let's look on some calculations.
      
      We're interested in the following values.
      
      * How much decimal digits is stored?
      * Size of an internal decimal type (`sizeof(decimal_t)`).
      * Size of a buffer to store a string representation of any valid
        `decimat_t` value.
      * Largest signed integer type fully represented in decimal_t (number of
        bits).
      * Largest unsigned integer type fully represented in decimal_t (number
        of bits).
      
      Now `decimal_t` is defined to store 38 decimal digits. It means the
      following values:
      
      | digits | sizeof | string | int???_t | uint???_t |
      | ------ | ------ | ------ | -------- | --------- |
      | 38     | 36     | 52     | 126      | 127       |
      
      In fact, decNumber (the library we currently use under the hood) allows
      to vary the 'decimal digits per unit' parameter, which is 3 by default,
      so we can choose density of the representation. For example, for given
      38 digits the sizeof is 36 by default, but it may vary from 28 to 47
      bytes:
      
      | digits | sizeof     | string | int???_t | uint???_t |
      | ------ | ---------- | ------ | -------- | --------- |
      | 38     | 36 (28-47) | 52     | 126      | 127       |
      
      If we'll want to store `int128_t` and `uint128_t` ranges, we'll need 39
      digits:
      
      | digits | sizeof     | string | int???_t | uint???_t |
      | ------ | ---------- | ------ | -------- | --------- |
      | 39     | 36 (29-48) | 53     | 130      | 129       |
      
      If we'll want to store `int256_t` and `uint256_t` ranges:
      
      | digits | sizeof     | string | int???_t | uint???_t |
      | ------ | ---------- | ------ | -------- | --------- |
      | 78     | 62 (48-87) | 92     | 260      | 259       |
      
      If we'll want to store `int512_t` and `uint512_t` ranges:
      
      | digits | sizeof       | string | int???_t | uint???_t |
      | ------ | ------------ | ------ | -------- | --------- |
      | 155    | 114 (84-164) | 169    | 515      | 514       |
      
      The decision here is what we consdider as possible and what as unlikely.
      The patch freeze the maximum amount of bytes in `decimal_t` as 64. So
      we'll able to store 256 bit integers and will NOT able to store 512 bit
      integers in a future (without the ABI breakage at least).
      
      The script, which helps to calculate those tables, is at end of the
      commit message.
      
      Next, how else `box_decimal_*()` library is different from the internal
      `decimal_*()`?
      
      * Added a structure that may hold any decimal value from any current or
        future tarantool version.
      * Added `box_decimal_copy()`.
      * Left `strtodec()` out of scope -- we can add it later.
      * Left `decimal_str()` out of scope -- it looks dangerous without at
        least a good explanation when data in the static buffer are
        invalidated. There is `box_decimal_to_string()` that writes to an
        explicitly provided buffer.
      * Added `box_decimal_mp_*()` for encoding to/decoding from msgpack.
        Unlike `mp_decimal.h` functions, here we always have `box_decimal_t`
        as the first parameter.
      * Left `decimal_pack()` out of scope, because a user unlikely wants to
        serialize a decimal value piece-by-piece.
      * Exposed `decimal_unpack()` as `box_decimal_mp_decode_data()` to keep a
        consistent terminogoly around msgpack encoding/decoding.
      * More detailed API description, grouping by functionality.
      
      The script, which helps to calculate sizes around `decimal_t`:
      
      ```lua
      -- See notes in decNumber.h.
      
      -- DECOPUN: DECimal Digits Per UNit
      local function unit_size(DECOPUN)
          assert(DECOPUN > 0 and DECOPUN < 10)
          if DECOPUN <= 2 then
              return 1
          elseif DECOPUN <= 4 then
              return 2
          end
          return 4
      end
      
      function sizeof_decimal_t(digits, DECOPUN)
          -- int32_t digits;
          -- int32_t exponent;
          -- uint8_t bits;
          -- <..padding..>
          -- <..units..>
          local us = unit_size(DECOPUN)
          local padding = us - 1
          local unit_count = math.ceil(digits / DECOPUN)
          return 4 + 4 + 1 + padding + us * unit_count
      end
      
      function string_buffer(digits)
          -- -9.{9...}E+999999999# (# is '\0')
          -- ^ ^      ^^^^^^^^^^^^
          return digits + 14
      end
      
      function binary_signed(digits)
          local x = 1
          while math.log10(2 ^ (x - 1)) < digits do
              x = x + 1
          end
          return x - 1
      end
      
      function binary_unsigned(digits)
          local x = 1
          while math.log10(2 ^ x) < digits do
              x = x + 1
          end
          return x - 1
      end
      
      function digits_for_binary_signed(x)
          return math.ceil(math.log10(2 ^ (x - 1)))
      end
      
      function digits_for_binary_unsigned(x)
          return math.ceil(math.log10(2 ^ x))
      end
      
      function summary(digits)
          print('digits', digits)
          local sizeof_min = math.huge
          local sizeof_max = 0
          local DECOPUN_sizeof_min
          local DECOPUN_sizeof_max
          for DECOPUN = 1, 9 do
              local sizeof = sizeof_decimal_t(digits, DECOPUN)
              print('sizeof', sizeof, 'DECOPUN', DECOPUN)
              if sizeof < sizeof_min then
                  sizeof_min = sizeof
                  DECOPUN_sizeof_min = DECOPUN
              end
              if sizeof > sizeof_max then
                  sizeof_max = sizeof
                  DECOPUN_sizeof_max = DECOPUN
              end
          end
          print('sizeof min', sizeof_min, 'DECOPUN', DECOPUN_sizeof_min)
          print('sizeof max', sizeof_max, 'DECOPUN', DECOPUN_sizeof_max)
          print('string', string_buffer(digits))
          print('int???_t', binary_signed(digits))
          print('uint???_t', binary_unsigned(digits))
      end
      ```
      
      Part of #7228
      
      @TarantoolBot document
      Title: Module API for decimals
      
      See the declarations in `src/box/decimal.h` in tarantool sources.
      5c1bc3da
    • Alexander Turenko's avatar
      decimal: mark decimal_is_int() argument as const · 5b8690b3
      Alexander Turenko authored
      This is preparatory commit for exposing decimals into the module API.
      We'll mark the argument in the public function as const, so it would be
      more accurate to have it marked as const in the internal API as well.
      
      Part of #7228
      
      NO_DOC=this is internal API, no user-visible changes
      NO_TEST=no behavior changes
      NO_CHANGELOG=no user-visible changes
      5b8690b3
    • Alexander Turenko's avatar
      decimal: include decimal.h as core/decimal.h · 62906a9c
      Alexander Turenko authored
      It is preparatory commit to add box/decimal.h header, which will hold
      module API for decimals.
      
      Part of #7228
      
      NO_DOC=no user-visible changes
      NO_TEST=no behavior changes
      NO_CHANGELOG=no user-visible changes
      62906a9c
  2. Aug 03, 2022
    • Yaroslav Lobankov's avatar
      ci: fix submodule bump for tarantool-ee 2.10 · 91595e31
      Yaroslav Lobankov authored
      This patch fixes the following issue: the submodule_update.yml workflow
      always updated the tarantool submodule in the tarantool-ee repo to the
      last commit from the `master` branch, even if it was tarantool-ee 2.10.
      Now it is fixed.
      
      NO_DOC=ci
      NO_TEST=ci
      NO_CHANGELOG=ci
      91595e31
    • Igor Munkin's avatar
      luajit: bump new version · e5bc192a
      Igor Munkin authored
      * Call error function on rethrow after trace exit.
      * Fix handling of errors during snapshot restore.
      
      Part of #7230
      
      NO_DOC=LuaJIT submodule bump
      NO_TEST=LuaJIT submodule bump
      e5bc192a
    • Serge Petrenko's avatar
      build: fix check-dependencies test on OS X · 116993d2
      Serge Petrenko authored
      Commit ed16c1e5 ("build: fix bundled
      libcurl and c-ares build on OS X") fixed building libcurl with ares by
      adding a dependency on libresolv for Mac OS X. It was forgotten to add
      libresolv to check-dependencies exceptions for static build. Do this now.
      
      NO_DOC=CI stuff
      NO_TEST=CI stuff
      NO_CHANGELOG=CI stuff
      116993d2
    • Serge Petrenko's avatar
      build: update decNumber library · 89e827bb
      Serge Petrenko authored
      Integrate Matthew Haggerty's patches silencing a bunch of gcc build
      warnings.
      
      NO_DOC=build
      NO_TEST=build
      NO_CHANGELOG=build
      89e827bb
    • Serge Petrenko's avatar
      build: bump bundled c-ares version to 1.18.1 · 344d5735
      Serge Petrenko authored
      Previous version was an intermediate one - 1.15.0-35
      
      The update brings a bunch of CVE fixes:
       * CVE-2020-14354 fixed in c-ares 1.16.1
       * CVE-2020-8277 fixed in c-ares 1.17.0
       * CVE-2021-3672 fixed in c-ares 1.17.2
      
      And a bunch of other security fixes
      
      NO_DOC=build
      NO_TEST=build
      NO_CHANGELOG=build
      344d5735
    • Serge Petrenko's avatar
      cmake: add BUNDLED_LIBCURL_USE_ARES to options list · 076701c4
      Serge Petrenko authored
      The option was forgotten back when bundled c-ares was just introduced.
      Let's fix this now for the sake of consistency with other options.
      
      NO_DOC=build fix
      NO_TEST=build fix
      NO_CHANGELOG=build fix
      076701c4
    • Serge Petrenko's avatar
      build: fix bundled libcurl and c-ares build on OS X · ed16c1e5
      Serge Petrenko authored
      c-ares relies on libresolv on OS X, and when built statically, brings
      the same dependency on to libcurl.
      
      Link libcurl with libresolv explicitly when linking with c-ares
      
      NO_DOC=build fix
      NO_TEST=build fix
      NO_CHANGELOG=build fix
      ed16c1e5
    • Vladimir Davydov's avatar
      static-build: update zlib to version 1.2.12 · 5da1f6be
      Vladimir Davydov authored
      NO_DOC=build
      NO_TEST=build
      5da1f6be
    • Alexander Turenko's avatar
      static-build: update libiconv to 1.17 (Mac OS) · 3ca56bc4
      Alexander Turenko authored
      The static build for Linux leans on glibc provided iconv functions. On
      Mac OS it links GNU libiconv statically. This patch updates the libiconv
      version from 1.16 (released in 2019) to 1.17 (released in 2022).
      
      It is just regular maintenance update. No behaviour changes are
      expected. The libiconv 1.17 changelog (see the NEWS file in the archive)
      does not mention anything that may have influence on behavior of
      tarantool's iconv built-in module.
      
      NO_DOC=no user-visible changes
      NO_TEST=no user-visible changes
      NO_CHANGELOG=no user-visible changes
      3ca56bc4
    • Vladimir Davydov's avatar
      build: bump zstd submodule · ec02a6ad
      Vladimir Davydov authored
      Updated third_party/zstd submodule from v1.5.0 to 1.5.2 version.
      The new version fixes a few bugs found by fuzzing testing.
      
      Note, the new zstd version contains a .S source file so we need to
      include ASM to the CMake project languages.
      
      NO_DOC=build
      NO_TEST=build
      ec02a6ad
    • Vladimir Davydov's avatar
      Fix FP compilation warning in box_select · ccd4e774
      Vladimir Davydov authored
      When I bumped ZSTD (see the next commit), Fedora 34, 35, 36 workflows
      started to fail with the following error:
      
      NO_WRAP
      In function ‘txn_commit_ro_stmt’,
          inlined from ‘box_select’ at /build/usr/src/debug/tarantool-2.11.0~entrypoint.306.dev/src/box/box.cc:2569:20:
      /build/usr/src/debug/tarantool-2.11.0~entrypoint.306.dev/src/box/txn.h:812:32: error: ‘svp.region’ may be used uninitialized [-Werror=maybe-uninitialized]
        812 |                 region_truncate(svp->region, svp->region_used);
            |                                ^
      /build/usr/src/debug/tarantool-2.11.0~entrypoint.306.dev/src/box/box.cc: In function ‘box_select’:
      /build/usr/src/debug/tarantool-2.11.0~entrypoint.306.dev/src/box/box.cc:2523:33: note: ‘svp.region’ was declared here
       2523 |         struct txn_ro_savepoint svp;
            |                                 ^
      In function ‘txn_commit_ro_stmt’,
          inlined from ‘box_select’ at /build/usr/src/debug/tarantool-2.11.0~entrypoint.306.dev/src/box/box.cc:2569:20:
      /build/usr/src/debug/tarantool-2.11.0~entrypoint.306.dev/src/box/txn.h:812:32: error: ‘svp.region_used’ may be used uninitialized [-Werror=maybe-uninitialized]
        812 |                 region_truncate(svp->region, svp->region_used);
            |                                ^
      /build/usr/src/debug/tarantool-2.11.0~entrypoint.306.dev/src/box/box.cc: In function ‘box_select’:
      /build/usr/src/debug/tarantool-2.11.0~entrypoint.306.dev/src/box/box.cc:2523:33: note: ‘svp.region_used’ was declared here
       2523 |         struct txn_ro_savepoint svp;
            |                                 ^
      NO_WRAP
      
      This is clearly a false-positive error, because we initialize and use
      txn_ro_savepoint iff txn == NULL. Interestingly, we use txn_ro_savepoint
      in exactly the same way in box_index_get, but get no error there. Looks
      like a compiler bug. I failed to reproduce the issue locally in a Docker
      container.
      
      Let's suppress this false-positive error by always initializing
      txn_ro_savepoint in txn_begin_ro_stmt - it's cheap.
      
      NO_DOC=compilation fix
      NO_TEST=compilation fix
      NO_CHANGELOG=compilation fix
      ccd4e774
  3. Aug 02, 2022
Loading