Commit a8c22dae authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.6 into 10.7

parents 42d3a7b6 5bb90cb2
...@@ -4616,32 +4616,32 @@ static bool xtrabackup_backup_func() ...@@ -4616,32 +4616,32 @@ static bool xtrabackup_backup_func()
reread_log_header: reread_log_header:
dberr_t err = recv_find_max_checkpoint(&max_cp_field); 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"); msg("Error: cannot read redo log header");
unlock_and_fail: else if (log_sys.log.format == 0) {
mysql_mutex_unlock(&log_sys.mutex);
}
if (log_sys.log.format == 0) {
msg("Error: cannot process redo log before MariaDB 10.2.2"); 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; log_sys.log.read(max_cp_field, {buf, OS_FILE_LOG_BLOCK_SIZE});
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;
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); mysql_mutex_unlock(&log_sys.mutex);
if (err != DB_SUCCESS)
goto fail;
xtrabackup_init_datasinks(); xtrabackup_init_datasinks();
if (!select_history()) { if (!select_history()) {
......
...@@ -2869,7 +2869,9 @@ buf_page_get_low( ...@@ -2869,7 +2869,9 @@ buf_page_get_low(
*err = e; *err = e;
} }
buf_pool.corrupted_evict(&block->page, state); if (block->page.id().is_corrupted()) {
buf_pool.corrupted_evict(&block->page, state);
}
return nullptr; return nullptr;
} }
...@@ -3207,6 +3209,7 @@ static buf_block_t *buf_page_create_low(page_id_t page_id, ulint zip_size, ...@@ -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); 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()); buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(page_id.fold());
retry:
mysql_mutex_lock(&buf_pool.mutex); mysql_mutex_lock(&buf_pool.mutex);
buf_page_t *bpage= buf_pool.page_hash.get(page_id, chain); 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, ...@@ -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); mysql_mutex_unlock(&buf_pool.mutex);
bpage->lock.x_lock(); 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); mysql_mutex_lock(&buf_pool.mutex);
} }
......
...@@ -1218,14 +1218,14 @@ void buf_pool_t::corrupted_evict(buf_page_t *bpage, uint32_t state) ...@@ -1218,14 +1218,14 @@ void buf_pool_t::corrupted_evict(buf_page_t *bpage, uint32_t state)
ut_ad(!bpage->oldest_modification()); ut_ad(!bpage->oldest_modification());
bpage->set_corrupt_id(); 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; auto s= bpage->zip.fix.fetch_sub(unfix) - unfix;
bpage->lock.x_unlock(true); 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::FREED);
ut_ad(s < buf_page_t::READ_FIX); ut_ad(s < buf_page_t::UNFIXED);
/* Wait for other threads to release the fix count /* Wait for other threads to release the fix count
before releasing the bpage from LRU list. */ before releasing the bpage from LRU list. */
(void) LF_BACKOFF(); (void) LF_BACKOFF();
......
...@@ -7614,6 +7614,7 @@ ha_innobase::prepare_inplace_alter_table( ...@@ -7614,6 +7614,7 @@ ha_innobase::prepare_inplace_alter_table(
if (!(ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE)) { if (!(ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE)) {
/* Nothing to do */ /* Nothing to do */
DBUG_ASSERT(!m_prebuilt->trx->dict_operation_lock_mode); DBUG_ASSERT(!m_prebuilt->trx->dict_operation_lock_mode);
m_prebuilt->trx_id = 0;
DBUG_RETURN(false); DBUG_RETURN(false);
} }
...@@ -10423,6 +10424,7 @@ commit_try_norebuild( ...@@ -10423,6 +10424,7 @@ commit_try_norebuild(
sql_print_error("InnoDB: %s: %s\n", op, sql_print_error("InnoDB: %s: %s\n", op,
ut_strerr(error)); ut_strerr(error));
DBUG_ASSERT(error == DB_IO_ERROR DBUG_ASSERT(error == DB_IO_ERROR
|| error == DB_LOCK_TABLE_FULL
|| error == DB_DECRYPTION_FAILED || error == DB_DECRYPTION_FAILED
|| error == DB_PAGE_CORRUPTED || error == DB_PAGE_CORRUPTED
|| error == DB_CORRUPTION); || error == DB_CORRUPTION);
......
...@@ -2007,7 +2007,7 @@ inline void buf_page_t::set_corrupt_id() ...@@ -2007,7 +2007,7 @@ inline void buf_page_t::set_corrupt_id()
is_write_locked()); is_write_locked());
} }
#endif #endif
id_= page_id_t(~0ULL); id_.set_corrupted();
} }
/** Set oldest_modification when adding to buf_pool.flush_list */ /** Set oldest_modification when adding to buf_pool.flush_list */
......
...@@ -148,6 +148,12 @@ class page_id_t ...@@ -148,6 +148,12 @@ class page_id_t
constexpr ulonglong raw() const { return m_id; } 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: private:
/** The page identifier */ /** The page identifier */
uint64_t m_id; uint64_t m_id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment