diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-06-16 10:50:58 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-06-16 10:50:58 +0300 |
commit | a8c22dae8b4ef478ede71ac9ea9978ab43d8951a (patch) | |
tree | 302856061b52a4ac26e4efbe8ba4a8e13e7b6ba1 | |
parent | 42d3a7b63d9313bffa91d4c6c5977fda42005d26 (diff) | |
parent | 5bb90cb2ac7b93f40c8ca4672ec7e2c18f0ea238 (diff) | |
download | mariadb-git-a8c22dae8b4ef478ede71ac9ea9978ab43d8951a.tar.gz |
Merge 10.6 into 10.7
-rw-r--r-- | extra/mariabackup/xtrabackup.cc | 38 | ||||
-rw-r--r-- | storage/innobase/buf/buf0buf.cc | 11 | ||||
-rw-r--r-- | storage/innobase/buf/buf0lru.cc | 8 | ||||
-rw-r--r-- | storage/innobase/handler/handler0alter.cc | 2 | ||||
-rw-r--r-- | storage/innobase/include/buf0buf.h | 2 | ||||
-rw-r--r-- | storage/innobase/include/buf0types.h | 6 |
6 files changed, 42 insertions, 25 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 06c4eccd3d6..3ef5ce1b40c 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -4616,32 +4616,32 @@ fail: reread_log_header: dberr_t err = recv_find_max_checkpoint(&max_cp_field); - if (err != DB_SUCCESS) { + if (err != DB_SUCCESS) msg("Error: cannot read redo log header"); -unlock_and_fail: - mysql_mutex_unlock(&log_sys.mutex); - } - - if (log_sys.log.format == 0) { + else if (log_sys.log.format == 0) { msg("Error: cannot process redo log before MariaDB 10.2.2"); - goto unlock_and_fail; + err = DB_ERROR; } + else { + byte* buf = log_sys.checkpoint_buf; + checkpoint_lsn_start = log_sys.log.get_lsn(); + checkpoint_no_start = log_sys.next_checkpoint_no; - byte* buf = log_sys.checkpoint_buf; - checkpoint_lsn_start = log_sys.log.get_lsn(); - checkpoint_no_start = log_sys.next_checkpoint_no; - - log_sys.log.read(max_cp_field, {buf, OS_FILE_LOG_BLOCK_SIZE}); - - if (checkpoint_no_start != mach_read_from_8(buf + LOG_CHECKPOINT_NO) - || checkpoint_lsn_start - != mach_read_from_8(buf + LOG_CHECKPOINT_LSN) - || log_sys.log.get_lsn_offset() - != mach_read_from_8(buf + LOG_CHECKPOINT_OFFSET)) - goto reread_log_header; + log_sys.log.read(max_cp_field, {buf, OS_FILE_LOG_BLOCK_SIZE}); + if (checkpoint_no_start + != mach_read_from_8(buf + LOG_CHECKPOINT_NO) + || checkpoint_lsn_start + != mach_read_from_8(buf + LOG_CHECKPOINT_LSN) + || log_sys.log.get_lsn_offset() + != mach_read_from_8(buf + LOG_CHECKPOINT_OFFSET)) + goto reread_log_header; + } mysql_mutex_unlock(&log_sys.mutex); + if (err != DB_SUCCESS) + goto fail; + xtrabackup_init_datasinks(); if (!select_history()) { diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index e50f32632e3..9a9b299a2ba 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -2869,7 +2869,9 @@ ibuf_merge_corrupted: *err = e; } - buf_pool.corrupted_evict(&block->page, state); + if (block->page.id().is_corrupted()) { + buf_pool.corrupted_evict(&block->page, state); + } return nullptr; } @@ -3207,6 +3209,7 @@ static buf_block_t *buf_page_create_low(page_id_t page_id, ulint zip_size, free_block->initialise(page_id, zip_size, buf_page_t::MEMORY); buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(page_id.fold()); +retry: mysql_mutex_lock(&buf_pool.mutex); buf_page_t *bpage= buf_pool.page_hash.get(page_id, chain); @@ -3225,6 +3228,12 @@ static buf_block_t *buf_page_create_low(page_id_t page_id, ulint zip_size, { mysql_mutex_unlock(&buf_pool.mutex); bpage->lock.x_lock(); + const page_id_t id{bpage->id()}; + if (UNIV_UNLIKELY(id != page_id)) + { + ut_ad(id.is_corrupted()); + goto retry; + } mysql_mutex_lock(&buf_pool.mutex); } diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 92f4efb7747..c01b0e4ee66 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -1218,14 +1218,14 @@ void buf_pool_t::corrupted_evict(buf_page_t *bpage, uint32_t state) ut_ad(!bpage->oldest_modification()); bpage->set_corrupt_id(); - auto unfix= state - buf_page_t::UNFIXED; + auto unfix= state - buf_page_t::FREED; auto s= bpage->zip.fix.fetch_sub(unfix) - unfix; bpage->lock.x_unlock(true); - while (s != buf_page_t::UNFIXED) + while (s != buf_page_t::FREED || bpage->lock.is_locked_or_waiting()) { - ut_ad(s > buf_page_t::UNFIXED); - ut_ad(s < buf_page_t::READ_FIX); + ut_ad(s >= buf_page_t::FREED); + ut_ad(s < buf_page_t::UNFIXED); /* Wait for other threads to release the fix count before releasing the bpage from LRU list. */ (void) LF_BACKOFF(); diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 0b69bdb9d09..36db7f17fd4 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -7614,6 +7614,7 @@ ha_innobase::prepare_inplace_alter_table( if (!(ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE)) { /* Nothing to do */ DBUG_ASSERT(!m_prebuilt->trx->dict_operation_lock_mode); + m_prebuilt->trx_id = 0; DBUG_RETURN(false); } @@ -10423,6 +10424,7 @@ handle_error: sql_print_error("InnoDB: %s: %s\n", op, ut_strerr(error)); DBUG_ASSERT(error == DB_IO_ERROR + || error == DB_LOCK_TABLE_FULL || error == DB_DECRYPTION_FAILED || error == DB_PAGE_CORRUPTED || error == DB_CORRUPTION); diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index b620e818798..0c61888e5cc 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -2007,7 +2007,7 @@ inline void buf_page_t::set_corrupt_id() is_write_locked()); } #endif - id_= page_id_t(~0ULL); + id_.set_corrupted(); } /** Set oldest_modification when adding to buf_pool.flush_list */ diff --git a/storage/innobase/include/buf0types.h b/storage/innobase/include/buf0types.h index bad3fd79571..6c13f5ee308 100644 --- a/storage/innobase/include/buf0types.h +++ b/storage/innobase/include/buf0types.h @@ -148,6 +148,12 @@ public: constexpr ulonglong raw() const { return m_id; } + /** Flag the page identifier as corrupted. */ + void set_corrupted() { m_id= ~0ULL; } + + /** @return whether the page identifier belongs to a corrupted page */ + constexpr bool is_corrupted() const { return m_id == ~0ULL; } + private: /** The page identifier */ uint64_t m_id; |