1. 26 Sep, 2024 30 commits
    • Sergei Golubchik's avatar
      mhnsw: don't guess whether it's insert or update · 8a46a959
      Sergei Golubchik authored
      we know it every time
      8a46a959
    • Sergei Golubchik's avatar
      mhnsw: refactor FVector* classes · 25b345e6
      Sergei Golubchik authored
      Now there's an FVector class which is a pure vector, an array of floats.
      It doesn't necessarily corresponds to a row in the table, and usually
      there is only one FVector instance - the one we're searching for.
      
      And there's an FVectorNode class, which is a node in the graph.
      It has a ref (identifying a row in the source table), possibly an array
      of floats (or not — in which case it will be read lazily from the
      source table as needed). There are many FVectorNodes and they're
      cached to avoid re-reading them from the disk.
      25b345e6
    • Sergei Golubchik's avatar
      mhnsw: fix memory management · 45b29ebc
      Sergei Golubchik authored
      move everything into a query-local memroot which is freed at the end
      45b29ebc
    • Sergei Golubchik's avatar
      mhnsw: simplify memory management of returned results · 5d7f0531
      Sergei Golubchik authored
      instead of pointers to FVectorRef's (which are stored elsewhere)
      let's return one big array of all refs. Freeing this array will
      free the complete result set.
      5d7f0531
    • Sergei Golubchik's avatar
      misc changes · fea4c942
      Sergei Golubchik authored
      * sysvars should be REQUIRED_ARG
      * fix a mix of US and UK spelling (use US)
      * use consistent naming
      * work if VEC_DISTANCE arguments are in the swapped order (const, col)
      * work if VEC_DISTANCE argument is NULL/invalid or wrong length
      * abort INSERT if the value is invalid or wrong length
      * store the "number of neighbors" in a blob in endianness-independent way
      * use field->store(longlong, bool) not field->store(double)
      * a lot more error checking everywhere
      * cleanup after errors
      * simplify calling conventions, remove reinterpret_cast's
      * todo/XXX comments
      * whitespaces
      * use float consistently
      
      memory management is still totally PoC quality
      
      Initial HNSW implementation
      fea4c942
    • Vicențiu Ciorbaru's avatar
      Initial HNSW implementation · bc8267b2
      Vicențiu Ciorbaru authored
      This commit includes the work done in collaboration with Hugo Wen from
      Amazon:
      
          MDEV-33408 Alter HNSW graph storage and fix memory leak
      
          This commit changes the way HNSW graph information is stored in the
          second table. Instead of storing connections as separate records, it now
          stores neighbors for each node, leading to significant performance
          improvements and storage savings.
      
          Comparing with the previous approach, the insert speed is 5 times faster,
          search speed improves by 23%, and storage usage is reduced by 73%, based
          on ann-benchmark tests with random-xs-20-euclidean and
          random-s-100-euclidean datasets.
      
          Additionally, in previous code, vector objects were not released after
          use, resulting in excessive memory consumption (over 20GB for building
          the index with 90,000 records), preventing tests with large datasets.
          Now ensure that vectors are released appropriately during the insert and
          search functions. Note there are still some vectors that need to be
          cleaned up after search query completion. Needs to be addressed in a
          future commit.
      
          All new code of the whole pull request, including one or several files
          that are either new files or modified ones, are contributed under the
          BSD-new license. I am contributing on behalf of my employer Amazon Web
          Services, Inc.
      
      As well as the commit:
      
          Introduce session variables to manage HNSW index parameters
      
          Three variables:
      
          hnsw_max_connection_per_layer
          hnsw_ef_constructor
          hnsw_ef_search
      
          ann-benchmark tool is also updated to support these variables in commit
          https://github.com/HugoWenTD/ann-benchmarks/commit/e09784e for branch
          https://github.com/HugoWenTD/ann-benchmarks/tree/mariadb-configurable
      
          All new code of the whole pull request, including one or several files
          that are either new files or modified ones, are contributed under the
          BSD-new license. I am contributing on behalf of my employer Amazon Web
          Services, Inc.
      Co-authored-by: default avatarHugo Wen <wenhug@amazon.com>
      bc8267b2
    • Vicențiu Ciorbaru's avatar
      cleanup: simplify Queue<>, add const · 9fe5988d
      Vicențiu Ciorbaru authored
      also add const to methods in List<> and Hash_set<>
      while we're at it
      9fe5988d
    • Sergei Golubchik's avatar
      6cebb6b0
    • Sergei Golubchik's avatar
      initial support for vector indexes · 68a2f45b
      Sergei Golubchik authored
      MDEV-33407 Parser support for vector indexes
      
      The syntax is
      
        create table t1 (... vector index (v) ...);
      
      limitation:
      * v is a binary string and NOT NULL
      * only one vector index per table
      * temporary tables are not supported
      
      MDEV-33404 Engine-independent indexes: subtable method
      
      added support for so-called "high level indexes", they are not visible
      to the storage engine, implemented on the sql level. For every such
      an index in a table, say, t1, the server implicitly creates a second
      table named, like, t1#i#05 (where "05" is the index number in t1).
      This table has a fixed structure, no frm, not accessible directly,
      doesn't go into the table cache, needs no MDLs.
      
      MDEV-33406 basic optimizer support for k-NN searches
      
      for a query like SELECT ... ORDER BY func() optimizer will use
      item_func->part_of_sortkey() to decide what keys can be used
      to resolve ORDER BY.
      68a2f45b
    • Sergei Golubchik's avatar
      MDEV-32885 VEC_DISTANCE() function · c139076d
      Sergei Golubchik authored
      c139076d
    • Sergei Golubchik's avatar
      cleanup: init_tmp_table_share(bool thread_specific) · e382d670
      Sergei Golubchik authored
      let the caller tell init_tmp_table_share() whether the table
      should be thread_specific or not.
      
      In particular, internal tmp tables created in the slave thread
      are perfectly thread specific
      e382d670
    • Sergei Golubchik's avatar
      cleanup: thd->alloc<>() and thd->calloc<>() · 321f4c48
      Sergei Golubchik authored
      create templates
      
        thd->alloc<X>(n) to use instead of (X*)thd->alloc(sizeof(X)*n)
      
      and the same for thd->calloc(). By the default the type is char,
      so old usage of thd->alloc(size) works too.
      321f4c48
    • Sergei Golubchik's avatar
      Revert "MDEV-15458 Segfault in heap_scan() upon UPDATE after ADD SYSTEM VERSIONING" · 63d298db
      Sergei Golubchik authored
      This partially reverts 43623f04
      
      Engines have to set ::position() after ::write_row(), otherwise
      the server won't be able to refer to the row just inserted.
      This is important for high-level indexes.
      
      heap part isn't reverted, so heap doesn't support high-level indexes.
      to fix this, it'll need info->lastpos in addition to info->current_ptr
      63d298db
    • Sergei Golubchik's avatar
      cleanup: unused function argument · 86b27206
      Sergei Golubchik authored
      86b27206
    • Sergei Golubchik's avatar
      open frm for DROP TABLE · e80e47c9
      Sergei Golubchik authored
      needed to get partitioning and information about
      secondary objects
      e80e47c9
    • Sergei Golubchik's avatar
      d5141749
    • Sergei Golubchik's avatar
      98e7a3ee
    • Sergei Golubchik's avatar
      9173b2cd
    • Sergei Golubchik's avatar
    • Sergei Golubchik's avatar
      cleanup: key algorithm vs key flags · 8d2bd8dd
      Sergei Golubchik authored
      the information about index algorithm was stored in two
      places inconsistently split between both.
      
      BTREE index could have key->algorithm == HA_KEY_ALG_BTREE, if the user
      explicitly specified USING BTREE or HA_KEY_ALG_UNDEF, if not.
      
      RTREE index had key->algorithm == HA_KEY_ALG_RTREE
      and always had key->flags & HA_SPATIAL
      
      FULLTEXT index had  key->algorithm == HA_KEY_ALG_FULLTEXT
      and always had key->flags & HA_FULLTEXT
      
      HASH index had key->algorithm == HA_KEY_ALG_HASH or HA_KEY_ALG_UNDEF
      
      long unique index always had key->algorithm == HA_KEY_ALG_LONG_HASH
      
      In this commit:
      
      All indexes except BTREE and HASH always have key->algorithm
      set, HA_SPATIAL and HA_FULLTEXT flags are not used anymore (except
      for storage to keep frms backward compatible).
      
      As a side effect ALTER TABLE now detects FULLTEXT index renames correctly
      8d2bd8dd
    • Sergei Golubchik's avatar
      cleanup: Queue and Bounded_queue · 6a268ed6
      Sergei Golubchik authored
      Bounded_queue<> pretended to be a typesafe C++ wrapper
      on top of pure C queues.h.
      
      But it wasn't, it was tightly bounded to filesort and only useful there.
      
      * implement Queue<> - a typesafe C++ wrapper on top of QUEUE
      * move Bounded_queue to filesort.cc, remove pointless "generalizations"
        change it to use Queue.
      * remove bounded_queue.h
      * change subselect_rowid_merge_engine to use Queue, not QUEUE
      6a268ed6
    • Sergei Golubchik's avatar
      cleanup: lex_string_set3() · f1ab7e41
      Sergei Golubchik authored
      f1ab7e41
    • Sergei Golubchik's avatar
      cleanup: remove unconditional #ifdef's · 7c4076a9
      Sergei Golubchik authored
      7c4076a9
    • Sergei Golubchik's avatar
      cleanup: const in List::push_front() · f325e2e0
      Sergei Golubchik authored
      f325e2e0
    • Sergei Golubchik's avatar
      3cc8d95c
    • Sergei Golubchik's avatar
      cleanup: pass TABLE_SHARE to store_key_options() · 37b7f524
      Sergei Golubchik authored
      preparation for indexes that can be in TABLE_SHARE but not in TABLE
      37b7f524
    • Sergei Golubchik's avatar
      cleanup: get_float convenience helper · 5935e9ef
      Sergei Golubchik authored
      more helpers like that can be added as needed
      5935e9ef
    • Sergei Golubchik's avatar
      cleanup: CREATE_TYPELIB_FOR() helper · 04255c95
      Sergei Golubchik authored
      04255c95
    • Sergei Golubchik's avatar
      cleanup: spaces, casts, comments · 25ab4658
      Sergei Golubchik authored
      25ab4658
    • Sergei Golubchik's avatar
      memroot improvement: fix savepoint support · be5b3f15
      Sergei Golubchik authored
      savepoint support was added a year ago as get_last_memroot_block()
      and free_all_new_blocks(), but it didn't work and was disabled.
      
      * fix it to work
      * instead of freeing the memory, only mark blocks free - this feature
        is supposed to be used inside a loop (otherwise there is no need
        to free anything, end of statement will do it anyway). And freeing
        blocks inside a loop is a bad idea, as they'll be all malloc-ed
        on the next iteration again. So, don't.
      * fix a bug in mark_blocks_free() - it doesn't change the number of blocks
      be5b3f15
  2. 23 Sep, 2024 7 commits
  3. 19 Sep, 2024 1 commit
  4. 10 Sep, 2024 1 commit
  5. 05 Sep, 2024 1 commit
    • Libing Song's avatar
      MDEV-33853 Async rollback prepared transactions during binlog · 5bbda971
      Libing Song authored
                 crash recovery
      
      Summary
      =======
      When doing server recovery, the active transactions will be rolled
      back by InnoDB background rollback thread automatically. The
      prepared transactions will be committed or rolled back accordingly
      by binlog recovery. Binlog recovery is done in main thread before
      the server can provide service to users. If there is a big
      transaction to rollback, the server will not available for a long
      time.
      
      This patch provides a way to rollback the prepared transactions
      asynchronously. Thus the rollback will not block server startup.
      
      Design
      ======
      - Handler::recover_rollback_by_xid()
        This patch provides a new handler interface to rollback transactions
        in recover phase. InnoDB just set the transaction's state to active.
        Then the transaction will be rolled back by the background rollback
        thread.
      
      - Handler::signal_tc_log_recover_done()
        This function is called after tc log is opened(typically binlog opened)
        has done. When this function is called, all transactions will be rolled
        back have been reverted to ACTIVE state. Thus it starts rollback thread
        to rollback the transactions.
      
      - Background rollback thread
        With this patch, background rollback thread is defered to run until binlog
        recovery is finished. It is started by innobase_tc_log_recovery_done().
      5bbda971