1. 14 Sep, 2024 27 commits
    • Sergei Golubchik's avatar
      mhnsw: don't guess whether it's insert or update · b2a6dc71
      Sergei Golubchik authored
      we know it every time
      b2a6dc71
    • Sergei Golubchik's avatar
      mhnsw: refactor FVector* classes · ab43c7e8
      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.
      ab43c7e8
    • Sergei Golubchik's avatar
      mhnsw: fix memory management · 148f57b8
      Sergei Golubchik authored
      move everything into a query-local memroot which is freed at the end
      148f57b8
    • Sergei Golubchik's avatar
      mhnsw: simplify memory management of returned results · 43942796
      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.
      43942796
    • Sergei Golubchik's avatar
      misc changes · 3407e355
      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
      3407e355
    • Vicențiu Ciorbaru's avatar
      Initial HNSW implementation · 16b55b46
      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>
      16b55b46
    • Vicențiu Ciorbaru's avatar
      cleanup: simplify Queue<>, add const · 43cc18c5
      Vicențiu Ciorbaru authored
      also add const to methods in List<> and Hash_set<>
      while we're at it
      43cc18c5
    • Sergei Golubchik's avatar
      d284d93f
    • Sergei Golubchik's avatar
      HA_KEY_ALG_MHNSW->HA_KEY_ALG_VECTOR · 80af4579
      Sergei Golubchik authored
      80af4579
    • Sergei Golubchik's avatar
      initial support for vector indexes · 18ed16b5
      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.
      18ed16b5
    • Sergei Golubchik's avatar
      cleanup: init_tmp_table_share(bool thread_specific) · ac24a9ba
      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
      ac24a9ba
    • Sergei Golubchik's avatar
      cleanup: thd->alloc<>() and thd->calloc<>() · a75d0367
      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.
      a75d0367
    • Sergei Golubchik's avatar
      Revert "MDEV-15458 Segfault in heap_scan() upon UPDATE after ADD SYSTEM VERSIONING" · 244906a0
      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
      244906a0
    • Sergei Golubchik's avatar
      cleanup: unused function argument · bbea4fa9
      Sergei Golubchik authored
      bbea4fa9
    • Sergei Golubchik's avatar
      open frm for DROP TABLE · 7337dea5
      Sergei Golubchik authored
      needed to get partitioning and information about
      secondary objects
      7337dea5
    • Sergei Golubchik's avatar
      b3368216
    • Sergei Golubchik's avatar
      44e6fb3e
    • Sergei Golubchik's avatar
      f1109b47
    • Sergei Golubchik's avatar
    • Sergei Golubchik's avatar
      cleanup: key algorithm vs key flags · 5727ae3e
      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
      5727ae3e
    • Sergei Golubchik's avatar
      cleanup: Queue and Bounded_queue · 80f1c882
      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
      80f1c882
    • Sergei Golubchik's avatar
      cleanup: lex_string_set3() · 2a12af93
      Sergei Golubchik authored
      2a12af93
    • Sergei Golubchik's avatar
      cleanup: remove unconditional #ifdef's · 2853d779
      Sergei Golubchik authored
      2853d779
    • Sergei Golubchik's avatar
      cleanup: const in List::push_front() · c35b0edc
      Sergei Golubchik authored
      c35b0edc
    • Sergei Golubchik's avatar
      2970fbff
    • Sergei Golubchik's avatar
      03d4607c
    • Sergei Golubchik's avatar
      cleanup: CREATE_TYPELIB_FOR() helper · 9e49417b
      Sergei Golubchik authored
      9e49417b
  2. 11 Sep, 2024 5 commits
  3. 10 Sep, 2024 1 commit
  4. 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
  5. 04 Sep, 2024 3 commits
  6. 29 Aug, 2024 3 commits
    • Marko Mäkelä's avatar
      Merge 11.2 into 11.4 · 44733aa8
      Marko Mäkelä authored
      44733aa8
    • Marko Mäkelä's avatar
      Merge 10.11 into 11.2 · e91a7994
      Marko Mäkelä authored
      e91a7994
    • Marko Mäkelä's avatar
      MDEV-34750 SET GLOBAL innodb_log_file_size is not crash safe · 984606d7
      Marko Mäkelä authored
      The recent commit 4ca355d8 (MDEV-33894)
      caused a serious regression for online InnoDB ib_logfile0 resizing,
      breaking crash-safety unless the memory-mapped log file interface is
      being used. However, the log resizing was broken also before this.
      
      To prevent such regressions in the future, we extend the test
      innodb.log_file_size_online with a kill and restart of the server
      and with some writes running concurrently with the log size change.
      When run enough many times, this test revealed all the bugs that
      are being fixed by the code changes.
      
      log_t::resize_start(): Do not allow the resized log to start before
      the current log sequence number. In this way, there is no need to
      copy anything to the first block of resize_buf. The previous logic
      regarding that was incorrect in two ways. First, we would have to
      copy from the last written buffer (buf or flush_buf). Second, we failed
      to ensure that the mini-transaction end marker bytes would be 1
      in the buffer. If the source ib_logfile0 had wrapped around an odd number
      of times, the end marker would be 0. This was occasionally observed
      when running the test innodb.log_file_size_online.
      
      log_t::resize_write_buf(): To adjust for the resize_start() change,
      do not write anything that would be before the resize_lsn.
      Take the buffer (resize_buf or resize_flush_buf) as a parameter.
      Starting with commit 4ca355d8
      we no longer swap buffers when rewriting the last log block.
      
      log_t::append(): Define as a static function; only some debug
      assertions need to refer to the log_sys object.
      
      innodb_log_file_size_update(): Wake up the buf_flush_page_cleaner()
      if needed, and wait for it to complete a batch while waiting for
      the log resizing to be completed. If the current LSN is behind the
      resize target LSN, we will write redundant FILE_CHECKPOINT records to
      ensure that the log resizing completes. If the buf_pool.flush_list is
      empty or the buf_flush_page_cleaner() is stuck for some reason, our wait
      will time out in 5 seconds, so that we can periodically check if the
      execution of SET GLOBAL innodb_log_file_size was aborted. Previously,
      we could get into a busy loop here while the buf_flush_page_cleaner()
      would remain idle.
      984606d7