summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-06-16 10:50:58 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2022-06-16 10:50:58 +0300
commita8c22dae8b4ef478ede71ac9ea9978ab43d8951a (patch)
tree302856061b52a4ac26e4efbe8ba4a8e13e7b6ba1
parent42d3a7b63d9313bffa91d4c6c5977fda42005d26 (diff)
parent5bb90cb2ac7b93f40c8ca4672ec7e2c18f0ea238 (diff)
downloadmariadb-git-a8c22dae8b4ef478ede71ac9ea9978ab43d8951a.tar.gz
Merge 10.6 into 10.7
-rw-r--r--extra/mariabackup/xtrabackup.cc38
-rw-r--r--storage/innobase/buf/buf0buf.cc11
-rw-r--r--storage/innobase/buf/buf0lru.cc8
-rw-r--r--storage/innobase/handler/handler0alter.cc2
-rw-r--r--storage/innobase/include/buf0buf.h2
-rw-r--r--storage/innobase/include/buf0types.h6
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;