1. 31 Aug, 2017 11 commits
    • Jan Lindström's avatar
      MDEV-12741: innodb.ibuf_not_empty failed in buildbot with "InnoDB: Trying to... · aa22981d
      Jan Lindström authored
      MDEV-12741: innodb.ibuf_not_empty failed in buildbot with "InnoDB: Trying to do I/O to a tablespace which does not exist"
      
      Background thread is doing ibuf merge, in buf0rea.cc buf_read_ibuf_merge_pages().
      It first tries to get page_size and if space is not found it deletes them, but
      as we do not hold any mutexes, space can be marked as stopped between that
      and buf_read_page_low() for same space. This naturally leads seen error
      message on log.
      
      buf_read_page_low(): Add parameter ignore_missing_space = false that
      is passed to fil_io()
      
      buf_read_ibuf_merge_pages(): call buf_read_page_low with
      ignore_missing_space = true, this function will handle missing
      space error code after buf_read_page_low returns.
      
      fil_io(): if ignore_missing_space = true do not print error
      message about trying to do I/0 for missing space, just return
      correct error code that is handled later.
      aa22981d
    • Sergei Petrunia's avatar
      MDEV-13669: Some MyRocks test take a long time · 0e45edf3
      Sergei Petrunia authored
      Make rocksdb.bloomfilter* tests 1.8x faster by doing loading in bulk
      0e45edf3
    • Marko Mäkelä's avatar
      Merge 10.1 into 10.2 · 2000a900
      Marko Mäkelä authored
      2000a900
    • Marko Mäkelä's avatar
      MDEV-13684 InnoDB race condition between fil_crypt_thread and btr_scrub_init · 38ca9be4
      Marko Mäkelä authored
      There is a race condition in InnoDB startup. A number of
      fil_crypt_thread are created by fil_crypt_threads_init(). These threads
      may call btr_scrub_complete_space() before btr_scrub_init() was called.
      Those too early calls would be accessing an uninitialized scrub_stat_mutex.
      
      innobase_start_or_create_for_mysql(): Invoke btr_scrub_init() before
      fil_crypt_threads_init().
      
      fil_crypt_complete_rotate_space(): Only invoke btr_scrub_complete_space()
      if scrubbing is enabled. There is no need to update the statistics if
      it is not enabled.
      38ca9be4
    • Marko Mäkelä's avatar
      Merge 10.1 into 10.2 · 2f20be94
      Marko Mäkelä authored
      2f20be94
    • Marko Mäkelä's avatar
      Add ATTRIBUTE_NORETURN and ATTRIBUTE_COLD · 4386ee8c
      Marko Mäkelä authored
      ATTRIBUTE_NORETURN is supported on all platforms (MSVS and GCC-like).
      It declares that a function will not return; instead, the thread or
      the whole process will terminate.
      
      ATTRIBUTE_COLD is supported starting with GCC 4.3. It declares that
      a function is supposed to be executed rarely. Rarely used error-handling
      functions and functions that emit messages to the error log should be
      tagged such.
      4386ee8c
    • Marko Mäkelä's avatar
      Fix some badly written Galera tests · 03a8eaa0
      Marko Mäkelä authored
      galera.galera_kill_applier: Make the test less likely to fail
      by adding sleep time.
      
      galera.query_cache: Remove data truncation.
      
      Part of the test file looks like it has been misinterpreted as latin1
      and wrongly converted to UTF-8 encoding. In MariaDB 10.1, the server would
      only warn about data truncation and not issue an error. 10.2 is stricter.
      (The test should be carefully reviewed if it really makes sense.)
      03a8eaa0
    • Marko Mäkelä's avatar
      Merge 10.1 into 10.2 · a36c369b
      Marko Mäkelä authored
      For running the Galera tests, the variable my_disable_leak_check
      was set to true in order to avoid assertions due to memory leaks
      at shutdown.
      
      Some adjustments due to MDEV-13625 (merge InnoDB tests from MySQL 5.6)
      were performed. The most notable behaviour changes from 10.0 and 10.1
      are the following:
      
      * innodb.innodb-table-online: adjustments for the DROP COLUMN
      behaviour change (MDEV-11114, MDEV-13613)
      
      * innodb.innodb-index-online-fk: the removal of a (1,NULL) record
      from the result; originally removed in MySQL 5.7 in the
      Oracle Bug #16244691 fix
      https://github.com/mysql/mysql-server/commit/377774689bf6a16af74182753fe950d514c2c6dd
      
      * innodb.create-index-debug: disabled due to MDEV-13680
      (the MySQL Bug #77497 fix was not merged from 5.6 to 5.7.10)
      
      * innodb.innodb-alter-autoinc: MariaDB 10.2 behaves like MySQL 5.6/5.7,
      while MariaDB 10.0 and 10.1 assign different values when
      auto_increment_increment or auto_increment_offset are used.
      Also MySQL 5.6/5.7 exhibit different behaviour between
      LGORITHM=INPLACE and ALGORITHM=COPY, so something needs to be tested
      and fixed in both MariaDB 10.0 and 10.2.
      
      * innodb.innodb-wl5980-alter: disabled because it would trigger an
      InnoDB assertion failure (MDEV-13668 may need additional effort in 10.2)
      a36c369b
    • Jan Lindström's avatar
      Fixed test failure on innodb_encryption · 28b2896a
      Jan Lindström authored
      After MDEV-13583: Improvements for MTR rebootstrap introduced in
      MDEV-12042 bootsrap correctly creates mysql/innodb_table_stats
      and mysql/innodb_index_stats InnoDB tables before innodb_encryption
      test starts. These tables are also encrypted or decrypted, thus
      we need to wait also these tables (if not we could randomly
      get different results as system tablespace and these tables
      are encrypted or decrypted in parallel).
      28b2896a
    • Jan Lindström's avatar
      Fix test failures on embedded server. · b29f26d7
      Jan Lindström authored
      Problem was incorrect definition of wsrep_recovery,
      trx_sys_update_wsrep_checkpoint and
      trx_sys_read_wsrep_checkpoint functions causing
      innodb_plugin not to load as there was undefined symbols.
      b29f26d7
    • Jan Lindström's avatar
      MDEV-13557: Startup failure, unable to decrypt ibdata1 · eca238ae
      Jan Lindström authored
      Fixes also MDEV-13488: InnoDB writes CRYPT_INFO even though
      encryption is not enabled.
      
      Fixes also MDEV-13093: Leak of Datafile::m_crypt_info on
      shutdown after failed startup.
      
      Problem was that we created encryption metadata (crypt_data) for
      system tablespace even when no encryption was enabled and too early.
      System tablespace can be encrypted only using key rotation.
      
      Test innodb-key-rotation-disable, innodb_encryption, innodb_lotoftables
      require adjustment because INFORMATION_SCHEMA INNODB_TABLESPACES_ENCRYPTION
      contain row only if tablespace really has encryption metadata.
      
      xb_load_single_table_tablespace(): Do not call
      fil_space_destroy_crypt_data() any more, because Datafile::m_crypt_data
      has been removed.
      
      fil_crypt_realloc_iops(): Avoid divide by zero.
      
      fil_crypt_set_thread_cnt(): Set fil_crypt_threads_event if
      encryption threads exist. This is required to find tablespaces
      requiring key rotation if no other changes happen.
      
      fil_crypt_find_space_to_rotate(): Decrease the amount of time waiting
      when nothing happens to better enable key rotation on startup.
      
      fil_ibd_open(), fil_ibd_load(): Load possible crypt_data from first
      page.
      
      class Datafile, class SysTablespace : remove m_crypt_info field.
      
      Datafile::get_first_page(): Return a pointer to first page buffer.
      
      fsp_header_init(): Write encryption metadata to page 0 only if
      tablespace is encrypted or encryption is disabled by table option.
      
      i_s_dict_fill_tablespaces_encryption(): Skip tablespaces that do not
      contain encryption metadata. This is required to avoid too early
      wait condition trigger in encrypted -> unencrypted state transfer.
      eca238ae
  2. 30 Aug, 2017 8 commits
  3. 29 Aug, 2017 10 commits
    • Marko Mäkelä's avatar
      WL#8845: Clarify the message about redo log format incompatibility · e634fdcd
      Marko Mäkelä authored
      recv_find_max_checkpoint(): Refer to MariaDB 10.2.2 instead of
      MySQL 5.7.9. Do not hint that a binary downgrade might be possible,
      because there are many changes in InnoDB 5.7 that could make
      downgrade impossible: a column appended to SYS_INDEXES, added
      SYS_* tables, undo log format changes, and so on.
      e634fdcd
    • Daniel Black's avatar
      submodules.cmake: git returns 128 if not in a repository · acaac7c2
      Daniel Black authored
      It is possible that a .git directory isn't definitive on the
      existance of a working git tree. A git worktree over sshfs
      for instance will fail to build unless the main repository
      also exists in the same directory. Adding this extra test
      will make the detection that little more ruggardised for these
      odd build environments.
      Signed-off-by: default avatarDaniel Black <daniel.black@au.ibm.com>
      acaac7c2
    • Jan Lindström's avatar
    • Marko Mäkelä's avatar
    • Marko Mäkelä's avatar
      Merge innodb.create-index test changes from MySQL 5.6 to MariaDB · 9e9a3b8e
      Marko Mäkelä authored
      Import the MySQL 5.6 addition from innodb.create-index to a new debug-only
      test, innodb.create-index-debug. The existing test innodb.create-index
      also runs on a debug server.
      9e9a3b8e
    • Marko Mäkelä's avatar
      Adjust the imported MySQL 5.6 tests for MariaDB · f56bd70f
      Marko Mäkelä authored
      FIXME: MDEV-13668 InnoDB unnecessarily rebuilds table
      
      FIXME: MDEV-13671 InnoDB should use case-insensitive column name comparisons
      like the rest of the server
      
      FIXME: MDEV-13640 / Properly fix MDEV-9469 'Incorrect key file' on ALTER TABLE
      
      FIXME: investigate result difference in innodb.innodb-alter-autoinc
      and ensure that MariaDB does the right thing with auto_increment_increment
      and auto_increment_offset, for both ALGORITHM=INPLACE and ALGORITHM=COPY
      (Oracle MySQL behaviour differs between those two).
      f56bd70f
    • Marko Mäkelä's avatar
      MDEV-13625 Merge InnoDB test cases from MySQL 5.6 (part 1) · 8d929816
      Marko Mäkelä authored
      Import some ALTER TABLE test cases from MySQL 5.6 without modification.
      The adjustments will be in a separate commit.
      8d929816
    • Jan Lindström's avatar
      MDEV-13557: Startup failure, unable to decrypt ibdata1 · 352d27ce
      Jan Lindström authored
      Fixes also MDEV-13488: InnoDB writes CRYPT_INFO even though
      encryption is not enabled.
      
      Problem was that we created encryption metadata (crypt_data) for
      system tablespace even when no encryption was enabled and too early.
      System tablespace can be encrypted only using key rotation.
      
      Test innodb-key-rotation-disable, innodb_encryption, innodb_lotoftables
      require adjustment because INFORMATION_SCHEMA INNODB_TABLESPACES_ENCRYPTION
      contain row only if tablespace really has encryption metadata.
      
      fil_crypt_set_thread_cnt: Send message to background encryption threads
      if they exits when they are ready. This is required to find tablespaces
      requiring key rotation if no other changes happen.
      
      fil_crypt_find_space_to_rotate: Decrease the amount of time waiting
      when nothing happens to better enable key rotation on startup.
      
      fsp_header_init: Write encryption metadata to page 0 only if tablespace is
      encrypted or encryption is disabled by table option.
      
      i_s_dict_fill_tablespaces_encryption : Skip tablespaces that do not
      contain encryption metadata. This is required to avoid too early
      wait condition trigger in encrypted -> unencrypted state transfer.
      
      open_or_create_data_files: Do not create encryption metadata
      by default to system tablespace.
      352d27ce
    • Andrei Elkin's avatar
      MDEV-13437 InnoDB fails to return error for XA COMMIT or XA ROLLBACK in read-only mode · 888a8b69
      Andrei Elkin authored
      Assertions failed due to incorrect handling of the --tc-heuristic-recover
      option when InnoDB is in read-only mode either due to innodb_read_only=1
      or innodb_force_recovery>3. InnoDB failed to refuse a XA COMMIT or
      XA ROLLBACK operation, and there were errors in the error handling in
      the upper layer.
      
      This was fixed by making InnoDB XA operations respect the
      high_level_read_only flag. The InnoDB part of the fix and
      parts of the test main.tc_heuristic_recover were provided
      by Marko Mäkelä.
      
      LOCK_log mutex lock/unlock had to be added to fix MDEV-13438.
      The measure is confirmed by mysql sources as well.
      
      For testing of the conflicting option combination, mysql-test-run is
      made to export a new $MYSQLD_LAST_CMD. It holds the very last value
      generated by mtr.mysqld_start().  Even though the options have been
      also always stored in $mysqld->{'started_opts'} there were no access
      to them beyond the automatic server restart by mtr through the expect
      file interface.
      
      Effectively therefore $MYSQLD_LAST_CMD represents a more general
      interface to $mysqld->{'started_opts'} which can be used in wider
      scopes including server launch with incompatible options.
      
      Notice another existing method to restart the server with incompatible
      options relying on $MYSQLD_CMD is is aware of $mysqld->{'started_opts'}
      (the actual options that the server is launched by mtr). In order to use
      this method they would have to be provided manually.
      
      NOTE: When merging to 10.2, the file search_pattern_in_file++.inc
      should be replaced with the pre-existing search_pattern_in_file.inc.
      888a8b69
    • Marko Mäkelä's avatar
      Merge 10.1 into 10.2 · f192b48d
      Marko Mäkelä authored
      f192b48d
  4. 28 Aug, 2017 9 commits
    • Vladislav Vaintroub's avatar
      AWS Key Management : Introduce "mock" variable, available in debug build. · dda40b93
      Vladislav Vaintroub authored
      If this variable is set, skip actual AWS calls, and fake/mock
      both generation and encryption of the keys.
      
      The advantage of having a mock mode is that more aws_key_management tests
      can be enabled on buildbot.
      dda40b93
    • Elena Stepanova's avatar
      MDEV-13583 Improvements for MTR rebootstrap introduced in MDEV-12042 · 05e7d35e
      Elena Stepanova authored
      - make re-bootstrap run with all extra options, not only InnoDB ones
      - re-use previously created bootstrap.sql
      - add --console
      - fix debian patch to keep it applicable
      05e7d35e
    • Elena Stepanova's avatar
    • Marko Mäkelä's avatar
      Merge 10.0 into 10.1 · 11352d52
      Marko Mäkelä authored
      11352d52
    • Marko Mäkelä's avatar
      309fe35f
    • Jan Lindström's avatar
      bbfd53cd
    • Jan Lindström's avatar
      MDEV-13591: InnoDB: Database page corruption on disk or a failed file read and assertion failure · 61096ff2
      Jan Lindström authored
      Problem is that page 0 and its possible enrryption information
      is not read for undo tablespaces.
      
      fil_crypt_get_latest_key_version(): Do not send event to
      encryption threads if event does not yet exists. Seen
      on regression testing.
      
      fil_read_first_page: Add new parameter does page belong to
      undo tablespace and if it does, we do not read FSP_HEADER.
      
      srv_undo_tablespace_open : Read first page of the tablespace
      to get crypt_data if it exists and pass it to fil_space_create.
      
      Tested using innodb_encryption with combinations with
      innodb-undo-tablespaces.
      61096ff2
    • Elena Stepanova's avatar
    • Marko Mäkelä's avatar
      MDEV-13637 InnoDB change buffer housekeeping can cause redo log overrun and possibly deadlocks · f87cb652
      Marko Mäkelä authored
      The function ibuf_remove_free_page() may be called while the caller
      is holding several mutexes or rw-locks. Because of this, this
      housekeeping loop may cause performance glitches for operations that
      involve tables that are stored in the InnoDB system tablespace.
      Also deadlocks might be possible.
      
      The worst impact of all is that due to the mutexes being held, calls to
      log_free_check() had to be skipped during this housekeeping.
      This means that the cyclic InnoDB redo log may be overwritten.
      If the system crashes during this, it would be unable to recover.
      
      The entry point to the problematic code is ibuf_free_excess_pages().
      It would make sense to call it before acquiring any mutexes or rw-locks,
      in any 'pessimistic' operation that involves the system tablespace.
      
      fseg_create_general(), fseg_alloc_free_page_general(): Do not call
      ibuf_free_excess_pages() while potentially holding some latches.
      
      ibuf_remove_free_page(): Do call log_free_check(), like every operation
      that is about to generate redo log should do.
      
      ibuf_free_excess_pages(): Remove some assertions that are replaced
      by stricter assertions in the log_free_check() that is now called by
      ibuf_remove_free_page().
      
      row_mtr_start(): New function, to perform necessary preparations when
      starting a mini-transaction for row operations. For pessimistic operations
      on secondary indexes that are located in the system tablespace,
      this includes calling ibuf_free_excess_pages().
      
      row_undo_ins_remove_sec_low(), row_undo_mod_del_mark_or_remove_sec_low(),
      row_undo_mod_del_unmark_sec_and_undo_update(): Call row_mtr_start().
      
      row_ins_sec_index_entry(): Call ibuf_free_excess_pages() if the operation
      may involve allocating pages and change buffering in the system tablespace.
      
      row_upd_sec_index_entry(): Slightly refactor the code. The
      delete-marking of the old entry is done in-place. It could be
      change-buffered, but the old code should be unlikely to have
      invoked ibuf_free_excess_pages() in this case.
      f87cb652
  5. 25 Aug, 2017 1 commit
    • Marko Mäkelä's avatar
      MDEV-13637 InnoDB change buffer housekeeping can cause redo log overrun and possibly deadlocks · 582545a3
      Marko Mäkelä authored
      The function ibuf_remove_free_page() may be called while the caller
      is holding several mutexes or rw-locks. Because of this, this
      housekeeping loop may cause performance glitches for operations that
      involve tables that are stored in the InnoDB system tablespace.
      Also deadlocks might be possible.
      
      The worst impact of all is that due to the mutexes being held, calls to
      log_free_check() had to be skipped during this housekeeping.
      This means that the cyclic InnoDB redo log may be overwritten.
      If the system crashes during this, it would be unable to recover.
      
      The entry point to the problematic code is ibuf_free_excess_pages().
      It would make sense to call it before acquiring any mutexes or rw-locks,
      in any 'pessimistic' operation that involves the system tablespace.
      
      fseg_create_general(), fseg_alloc_free_page_general(): Do not call
      ibuf_free_excess_pages() while potentially holding some latches.
      
      ibuf_remove_free_page(): Do call log_free_check(), like every operation
      that is about to generate redo log should do.
      
      ibuf_free_excess_pages(): Remove some assertions that are replaced
      by stricter assertions in the log_free_check() that is now called by
      ibuf_remove_free_page().
      
      row_ins_sec_index_entry(), row_undo_ins_remove_sec_low(),
      row_undo_mod_del_mark_or_remove_sec_low(),
      row_undo_mod_del_unmark_sec_and_undo_update(): Call
      ibuf_free_excess_pages() if the operation may involve allocating pages
      and change buffering in the system tablespace.
      582545a3
  6. 24 Aug, 2017 1 commit