Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-27887

InnoDB may crash when required compression plugins are not loaded

    XMLWordPrintable

Details

    Description

      The tests plugins.compression and mariabackup.compression_providers_unloaded crash very often on the ASAN builder. AddressSanitizer probably only matters for the timing characteristics.

      Here is a 10.7 run where both tests crash:

      10.7 9055db2f28b9e6b2c16810fb78d4cc23f86d005e

      mariabackup.compression_providers_unloaded 'lzo' w6 [ fail ]
              Test ended at 2022-02-09 03:15:18
       
      CURRENT_TEST: mariabackup.compression_providers_unloaded
      2022-02-09  3:15:15 0 [ERROR] InnoDB: Failed to read page 2 from file './test/t1.ibd': Table is compressed or encrypted but uncompress or decrypt failed.
      mariadbd: /home/buildbot/buildbot/build/mariadb-10.7.3/storage/innobase/buf/buf0buf.cc:2897: buf_block_t* buf_page_get_low(page_id_t, ulint, ulint, buf_block_t*, ulint, mtr_t*, dberr_t*, bool): Assertion `block->page.id() == page_id' failed.
      buf/buf0buf.cc:2902(buf_page_get_low(page_id_t, unsigned long, unsigned long, buf_block_t*, unsigned long, mtr_t*, dberr_t*, bool))[0x55d0fa79416a]
      buf/buf0buf.cc:2993(buf_page_get_gen(page_id_t, unsigned long, unsigned long, buf_block_t*, unsigned long, mtr_t*, dberr_t*, bool))[0x55d0fa8529e0]
      dict/dict0load.cc:2367(dict_load_table_one(st_::span<char const> const&, dict_err_ignore_t, std::deque<char const*, ut_allocator<char const*, true> >&))[0x55d0fa85399a]
      dict/dict0load.cc:2461(dict_sys_t::load_table(st_::span<char const> const&, dict_err_ignore_t))[0x55d0fa854298]
      dict/dict0load.cc:2549(dict_load_table_on_id(unsigned long, dict_err_ignore_t))[0x55d0fa818123]
      dict/dict0dict.cc:851(dict_table_open_on_id(unsigned long, bool, dict_table_op_t, THD*, MDL_ticket**))[0x55d0fa594d34]
      row/row0purge.cc:1028(row_purge_parse_undo_rec(purge_node_t*, unsigned char*, que_thr_t*, bool*))[0x55d0fa5965e6]
      

      and

      10.7 9055db2f28b9e6b2c16810fb78d4cc23f86d005e

      plugins.compression 'innodb-lzo'         w4 [ fail ]
              Test ended at 2022-02-09 03:15:51
       
      CURRENT_TEST: plugins.compression
      mysqltest: At line 43: query 'select a, left(b, 9), length(b) from t1' failed with wrong errno <Unknown> (2013): 'Lost connection to server during query', instead of ER_PROVIDER_NOT_LOADED (4185)...
      buf/buf0buf.cc:2902(buf_page_get_low(page_id_t, unsigned long, unsigned long, buf_block_t*, unsigned long, mtr_t*, dberr_t*, bool))[0x56031b5f316a]
      buf/buf0buf.cc:2993(buf_page_get_gen(page_id_t, unsigned long, unsigned long, buf_block_t*, unsigned long, mtr_t*, dberr_t*, bool))[0x56031b6b19e0]
      dict/dict0load.cc:2367(dict_load_table_one(st_::span<char const> const&, dict_err_ignore_t, std::deque<char const*, ut_allocator<char const*, true> >&))[0x56031b6b299a]
      dict/dict0load.cc:2461(dict_sys_t::load_table(st_::span<char const> const&, dict_err_ignore_t))[0x56031b6b3298]
      dict/dict0load.cc:2549(dict_load_table_on_id(unsigned long, dict_err_ignore_t))[0x56031b677123]
      dict/dict0dict.cc:851(dict_table_open_on_id(unsigned long, bool, dict_table_op_t, THD*, MDL_ticket**))[0x56031b3f3d34]
      row/row0purge.cc:1028(row_purge_parse_undo_rec(purge_node_t*, unsigned char*, que_thr_t*, bool*))[0x56031b3f55e6]
      

      In the latter crash, the table is being opened for the purge of history of committed transactions.

      It is not sufficient to block access to the table at the SQL layer. InnoDB may open tables internally, either for purging history, or for rolling back changes to recovered transactions.

      If you want to prevent such crashes, then the server should be started with innodb_force_recovery=3. There has been no requirement to ensure that everything has been rolled back and purged before upgrading the server. We only require a clean shutdown from an earlier version, when upgrading to 10.2, 10.3, 10.5, 10.8. For the upgrade to 10.3 it is due to an undo log format change (MDEV-12288); an upgrade sanity check was implemented in MDEV-15912. For other versions, it is due to a redo log format change (MDEV-12353 in 10.5 and MDEV-14425 in 10.8).

      I encountered also failures like this:

      plugins.compression 'innodb-snappy'      w5 [ fail ]
              Test ended at 2022-02-17 15:33:40
       
      CURRENT_TEST: plugins.compression
      mysqltest: At line 43: query 'select a, left(b, 9), length(b) from t1' succeeded - should have failed with error ER_PROVIDER_NOT_LOADED (4185)...
      

      Attachments

        Issue Links

          Activity

            People

              serg Sergei Golubchik
              marko Marko Mäkelä
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.