summaryrefslogtreecommitdiff
path: root/storage/innobase/log
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/log')
-rw-r--r--storage/innobase/log/log0log.cc3
-rw-r--r--storage/innobase/log/log0recv.cc246
2 files changed, 151 insertions, 98 deletions
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index bda34a21960..92ec2d2e18d 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -1003,6 +1003,7 @@ ATTRIBUTE_COLD void logs_empty_and_mark_files_at_shutdown()
dict_stats_shutdown();
btr_defragment_shutdown();
+ ut_d(srv_master_thread_enable());
srv_shutdown_state = SRV_SHUTDOWN_CLEANUP;
if (srv_buffer_pool_dump_at_shutdown &&
@@ -1077,7 +1078,7 @@ wait_suspend_loop:
ut_ad(!srv_any_background_activity());
if (srv_n_fil_crypt_threads_started) {
- os_event_set(fil_crypt_threads_event);
+ fil_crypt_threads_signal(true);
thread_name = "fil_crypt_thread";
goto wait_suspend_loop;
}
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc
index 0aedc9c0bd4..ea7629b8695 100644
--- a/storage/innobase/log/log0recv.cc
+++ b/storage/innobase/log/log0recv.cc
@@ -54,6 +54,7 @@ Created 9/20/1997 Heikki Tuuri
#include "buf0rea.h"
#include "srv0srv.h"
#include "srv0start.h"
+#include "sync0sync.h"
#include "fil0pagecompress.h"
/** Read-ahead area in applying log records to file pages */
@@ -260,7 +261,7 @@ public:
record_corrupted:
if (!srv_force_recovery)
{
- recv_sys.found_corrupt_log= true;
+ recv_sys.set_corrupt_log();
return applied;
}
next_not_same_page:
@@ -312,7 +313,7 @@ public:
{
page_corrupted:
ib::error() << "Set innodb_force_recovery=1 to ignore corruption.";
- recv_sys.found_corrupt_log= true;
+ recv_sys.set_corrupt_log();
return applied;
}
break;
@@ -627,7 +628,7 @@ public:
@return whether the state was changed */
bool add(const page_id_t page_id, lsn_t lsn)
{
- ut_ad(mutex_own(&recv_sys.mutex));
+ mysql_mutex_assert_owner(&recv_sys.mutex);
const init init = { lsn, false };
std::pair<map::iterator, bool> p = inits.insert(
map::value_type(page_id, init));
@@ -646,7 +647,7 @@ public:
not valid after releasing recv_sys.mutex. */
init& last(page_id_t page_id)
{
- ut_ad(mutex_own(&recv_sys.mutex));
+ mysql_mutex_assert_owner(&recv_sys.mutex);
return inits.find(page_id)->second;
}
@@ -656,7 +657,7 @@ public:
@return whether page_id will be freed or initialized after lsn */
bool will_avoid_read(page_id_t page_id, lsn_t lsn) const
{
- ut_ad(mutex_own(&recv_sys.mutex));
+ mysql_mutex_assert_owner(&recv_sys.mutex);
auto i= inits.find(page_id);
return i != inits.end() && i->second.lsn > lsn;
}
@@ -664,7 +665,7 @@ public:
/** At the end of each recovery batch, reset the 'created' flags. */
void reset()
{
- ut_ad(mutex_own(&recv_sys.mutex));
+ mysql_mutex_assert_owner(&recv_sys.mutex);
ut_ad(recv_no_ibuf_operations);
for (map::value_type& i : inits) {
i.second.created = false;
@@ -677,7 +678,7 @@ public:
@param[in,out] mtr dummy mini-transaction */
void mark_ibuf_exist(mtr_t& mtr)
{
- ut_ad(mutex_own(&recv_sys.mutex));
+ mysql_mutex_assert_owner(&recv_sys.mutex);
mtr.start();
for (const map::value_type& i : inits) {
@@ -708,12 +709,12 @@ public:
mtr.start();
continue;
}
- mutex_exit(&recv_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
block->page.ibuf_exist = ibuf_page_exists(
block->page.id(), block->zip_size());
mtr.commit();
mtr.start();
- mutex_enter(&recv_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
}
}
@@ -736,7 +737,7 @@ inline void recv_sys_t::trim(const page_id_t page_id, lsn_t lsn)
DBUG_LOG("ib_log",
"discarding log beyond end of tablespace "
<< page_id << " before LSN " << lsn);
- ut_ad(mutex_own(&mutex));
+ mysql_mutex_assert_owner(&mutex);
for (recv_sys_t::map::iterator p = pages.lower_bound(page_id);
p != pages.end() && p->first.space() == page_id.space();) {
recv_sys_t::map::iterator r = p++;
@@ -854,7 +855,7 @@ same_space:
<< " has been found in two places: '"
<< f.name << "' and '" << name << "'."
" You must delete one of them.";
- recv_sys.found_corrupt_fs = true;
+ recv_sys.set_corrupt_fs();
}
break;
@@ -906,7 +907,7 @@ same_space:
" disk is broken, and you cannot"
" remove the .ibd file, you can set"
" --innodb_force_recovery.";
- recv_sys.found_corrupt_fs = true;
+ recv_sys.set_corrupt_fs();
break;
}
@@ -927,9 +928,9 @@ void recv_sys_t::close()
if (is_initialised())
{
dblwr.pages.clear();
- ut_d(mutex_enter(&mutex));
+ ut_d(mysql_mutex_lock(&mutex));
clear();
- ut_d(mutex_exit(&mutex));
+ ut_d(mysql_mutex_unlock(&mutex));
if (buf)
{
@@ -938,7 +939,8 @@ void recv_sys_t::close()
}
last_stored_lsn= 0;
- mutex_free(&mutex);
+ mysql_mutex_destroy(&mutex);
+ mysql_cond_destroy(&cond);
}
recv_spaces.clear();
@@ -952,7 +954,8 @@ void recv_sys_t::create()
{
ut_ad(this == &recv_sys);
ut_ad(!is_initialised());
- mutex_create(LATCH_ID_RECV_SYS, &mutex);
+ mysql_mutex_init(recv_sys_mutex_key, &mutex, nullptr);
+ mysql_cond_init(0, &cond, nullptr);
apply_log_recs = false;
apply_batch_on = false;
@@ -980,7 +983,7 @@ void recv_sys_t::create()
/** Clear a fully processed set of stored redo log records. */
inline void recv_sys_t::clear()
{
- ut_ad(mutex_own(&mutex));
+ mysql_mutex_assert_owner(&mutex);
apply_log_recs= false;
apply_batch_on= false;
ut_ad(!after_apply || !UT_LIST_GET_LAST(blocks));
@@ -995,6 +998,8 @@ inline void recv_sys_t::clear()
buf_block_free(block);
block= prev_block;
}
+
+ mysql_cond_broadcast(&cond);
}
/** Free most recovery data structures. */
@@ -1002,7 +1007,7 @@ void recv_sys_t::debug_free()
{
ut_ad(this == &recv_sys);
ut_ad(is_initialised());
- mutex_enter(&mutex);
+ mysql_mutex_lock(&mutex);
recovery_on= false;
pages.clear();
@@ -1010,12 +1015,12 @@ void recv_sys_t::debug_free()
buf= nullptr;
- mutex_exit(&mutex);
+ mysql_mutex_unlock(&mutex);
}
inline void *recv_sys_t::alloc(size_t len)
{
- ut_ad(mutex_own(&mutex));
+ mysql_mutex_assert_owner(&mutex);
ut_ad(len);
ut_ad(len <= srv_page_size);
@@ -1059,7 +1064,7 @@ inline void recv_sys_t::free(const void *data)
{
ut_ad(!ut_align_offset(data, ALIGNMENT));
data= page_align(data);
- ut_ad(mutex_own(&mutex));
+ mysql_mutex_assert_owner(&mutex);
/* MDEV-14481 FIXME: To prevent race condition with buf_pool.resize(),
we must acquire and hold the buffer pool mutex here. */
@@ -1176,7 +1181,7 @@ fail:
if (dl < LOG_BLOCK_HDR_SIZE
|| (dl != OS_FILE_LOG_BLOCK_SIZE
&& dl > log_sys.trailer_offset())) {
- recv_sys.found_corrupt_log = true;
+ recv_sys.set_corrupt_log();
goto fail;
}
}
@@ -1638,7 +1643,7 @@ inline bool page_recv_t::trim(lsn_t start_lsn)
inline void page_recv_t::recs_t::clear()
{
- ut_ad(mutex_own(&recv_sys.mutex));
+ mysql_mutex_assert_owner(&recv_sys.mutex);
for (const log_rec_t *l= head; l; )
{
const log_rec_t *next= l->next;
@@ -1668,7 +1673,7 @@ inline void recv_sys_t::add(const page_id_t page_id,
lsn_t start_lsn, lsn_t lsn, const byte *l,
size_t len)
{
- ut_ad(mutex_own(&mutex));
+ mysql_mutex_assert_owner(&mutex);
std::pair<map::iterator, bool> p= pages.emplace(map::value_type
(page_id, page_recv_t()));
page_recv_t& recs= p.first->second;
@@ -1755,7 +1760,7 @@ or corruption was noticed */
bool recv_sys_t::parse(lsn_t checkpoint_lsn, store_t *store, bool apply)
{
mysql_mutex_assert_owner(&log_sys.mutex);
- ut_ad(mutex_own(&mutex));
+ mysql_mutex_assert_owner(&mutex);
ut_ad(parse_start_lsn);
ut_ad(log_sys.is_physical());
@@ -2203,10 +2208,10 @@ same_page:
fn2 ? static_cast<ulint>(fn2end - fn2) : 0);
if (!fn2 || !apply);
- else if (!fil_op_replay_rename(space_id, fn, fn2))
+ else if (UNIV_UNLIKELY(!fil_op_replay_rename(space_id, fn, fn2)))
found_corrupt_fs= true;
const_cast<char&>(fn[rlen])= saved_end;
- if (UNIV_UNLIKELY(found_corrupt_fs))
+ if (is_corrupt_fs())
return true;
}
}
@@ -2235,7 +2240,7 @@ static void recv_recover_page(buf_block_t* block, mtr_t& mtr,
fil_space_t* space = NULL,
mlog_init_t::init* init = NULL)
{
- ut_ad(mutex_own(&recv_sys.mutex));
+ mysql_mutex_assert_owner(&recv_sys.mutex);
ut_ad(recv_sys.apply_log_recs);
ut_ad(recv_needed_recovery);
ut_ad(!init || init->created);
@@ -2255,7 +2260,7 @@ static void recv_recover_page(buf_block_t* block, mtr_t& mtr,
p->second.state = page_recv_t::RECV_BEING_PROCESSED;
- mutex_exit(&recv_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
byte *frame = UNIV_LIKELY_NULL(block->page.zip.data)
? block->page.zip.data
@@ -2372,7 +2377,7 @@ static void recv_recover_page(buf_block_t* block, mtr_t& mtr,
}
set_start_lsn:
- if (recv_sys.found_corrupt_log && !srv_force_recovery) {
+ if (recv_sys.is_corrupt_log() && !srv_force_recovery) {
break;
}
@@ -2413,7 +2418,7 @@ set_start_lsn:
time_t now = time(NULL);
- mutex_enter(&recv_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
if (recv_max_page_lsn < page_lsn) {
recv_max_page_lsn = page_lsn;
@@ -2435,14 +2440,41 @@ This function should only be called when innodb_force_recovery is set.
@param page_id corrupted page identifier */
ATTRIBUTE_COLD void recv_sys_t::free_corrupted_page(page_id_t page_id)
{
- mutex_enter(&mutex);
+ mysql_mutex_lock(&mutex);
map::iterator p= pages.find(page_id);
if (p != pages.end())
{
p->second.log.clear();
pages.erase(p);
}
- mutex_exit(&mutex);
+ if (pages.empty())
+ mysql_cond_broadcast(&cond);
+ mysql_mutex_unlock(&mutex);
+}
+
+/** Possibly finish a recovery batch. */
+inline void recv_sys_t::maybe_finish_batch()
+{
+ mysql_mutex_assert_owner(&mutex);
+ ut_ad(recovery_on);
+ if (!apply_batch_on || pages.empty() || is_corrupt_log() || is_corrupt_fs())
+ mysql_cond_broadcast(&cond);
+}
+
+ATTRIBUTE_COLD void recv_sys_t::set_corrupt_log()
+{
+ mysql_mutex_lock(&mutex);
+ found_corrupt_log= true;
+ mysql_cond_broadcast(&cond);
+ mysql_mutex_unlock(&mutex);
+}
+
+ATTRIBUTE_COLD void recv_sys_t::set_corrupt_fs()
+{
+ mysql_mutex_lock(&mutex);
+ found_corrupt_fs= true;
+ mysql_cond_broadcast(&cond);
+ mysql_mutex_unlock(&mutex);
}
/** Apply any buffered redo log to a page that was just read from a data file.
@@ -2466,7 +2498,7 @@ void recv_recover_page(fil_space_t* space, buf_page_t* bpage)
buf_block_buf_fix_inc(block);
mtr.memo_push(block, MTR_MEMO_PAGE_X_FIX);
- mutex_enter(&recv_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
if (recv_sys.apply_log_recs) {
recv_sys_t::map::iterator p = recv_sys.pages.find(bpage->id());
if (p != recv_sys.pages.end()
@@ -2474,13 +2506,14 @@ void recv_recover_page(fil_space_t* space, buf_page_t* bpage)
recv_recover_page(block, mtr, p, space);
p->second.log.clear();
recv_sys.pages.erase(p);
+ recv_sys.maybe_finish_batch();
goto func_exit;
}
}
mtr.commit();
func_exit:
- mutex_exit(&recv_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
ut_ad(mtr.has_committed());
}
@@ -2508,10 +2541,10 @@ static void recv_read_in_area(page_id_t page_id)
}
if (p != page_nos) {
- mutex_exit(&recv_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
buf_read_recv_pages(page_id.space(), page_nos,
ulint(p - page_nos));
- mutex_enter(&recv_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
}
}
@@ -2525,7 +2558,7 @@ inline buf_block_t *recv_sys_t::recover_low(const page_id_t page_id,
map::iterator &p, mtr_t &mtr,
buf_block_t *b)
{
- ut_ad(mutex_own(&mutex));
+ mysql_mutex_assert_owner(&mutex);
ut_ad(p->first == page_id);
page_recv_t &recs= p->second;
ut_ad(recs.state == page_recv_t::RECV_WILL_NOT_READ);
@@ -2547,19 +2580,21 @@ inline buf_block_t *recv_sys_t::recover_low(const page_id_t page_id,
being read in. Before buf_page_get_with_no_latch() returned to
buf_page_create(), all changes must have been applied to the
page already. */
- ut_ad(recv_sys.pages.find(page_id) == recv_sys.pages.end());
+ ut_ad(pages.find(page_id) == pages.end());
mtr.commit();
block= nullptr;
}
else
{
- ut_ad(&recs == &recv_sys.pages.find(page_id)->second);
+ ut_ad(&recs == &pages.find(page_id)->second);
i.created= true;
recv_recover_page(block, mtr, p, space, &i);
ut_ad(mtr.has_committed());
recs.log.clear();
map::iterator r= p++;
- recv_sys.pages.erase(r);
+ pages.erase(r);
+ if (pages.empty())
+ mysql_cond_signal(&cond);
}
space->release();
}
@@ -2575,7 +2610,7 @@ buf_block_t *recv_sys_t::recover_low(const page_id_t page_id)
buf_block_t *free_block= buf_LRU_get_free_block(false);
buf_block_t *block= nullptr;
- mutex_enter(&mutex);
+ mysql_mutex_lock(&mutex);
map::iterator p= pages.find(page_id);
if (p != pages.end() && p->second.state == page_recv_t::RECV_WILL_NOT_READ)
@@ -2585,7 +2620,7 @@ buf_block_t *recv_sys_t::recover_low(const page_id_t page_id)
ut_ad(!block || block == free_block);
}
- mutex_exit(&mutex);
+ mysql_mutex_unlock(&mutex);
if (UNIV_UNLIKELY(!block))
buf_pool.free_block(free_block);
return block;
@@ -2599,24 +2634,34 @@ void recv_sys_t::apply(bool last_batch)
srv_operation == SRV_OPERATION_RESTORE ||
srv_operation == SRV_OPERATION_RESTORE_EXPORT);
- mutex_enter(&mutex);
+#ifdef SAFE_MUTEX
+ DBUG_ASSERT(!last_batch == mysql_mutex_is_owner(&log_sys.mutex));
+#endif /* SAFE_MUTEX */
+ mysql_mutex_lock(&mutex);
+
+ timespec abstime;
while (apply_batch_on)
{
- bool abort= found_corrupt_log;
- mutex_exit(&mutex);
-
- if (abort)
+ if (is_corrupt_log())
+ {
+ mysql_mutex_unlock(&mutex);
return;
-
- os_thread_sleep(500000);
- mutex_enter(&mutex);
+ }
+ if (last_batch)
+ {
+ mysql_mutex_assert_not_owner(&log_sys.mutex);
+ mysql_cond_wait(&cond, &mutex);
+ }
+ else
+ {
+ mysql_mutex_unlock(&mutex);
+ set_timespec_nsec(abstime, 500000000ULL); /* 0.5s */
+ mysql_cond_timedwait(&cond, &log_sys.mutex, &abstime);
+ mysql_mutex_lock(&mutex);
+ }
}
-#ifdef SAFE_MUTEX
- DBUG_ASSERT(!last_batch == mysql_mutex_is_owner(&log_sys.mutex));
-#endif /* SAFE_MUTEX */
-
recv_no_ibuf_operations = !last_batch ||
srv_operation == SRV_OPERATION_RESTORE ||
srv_operation == SRV_OPERATION_RESTORE_EXPORT;
@@ -2660,9 +2705,9 @@ void recv_sys_t::apply(bool last_batch)
case page_recv_t::RECV_WILL_NOT_READ:
if (UNIV_LIKELY(!!recover_low(page_id, p, mtr, free_block)))
{
- mutex_exit(&mutex);
+ mysql_mutex_unlock(&mutex);
free_block= buf_LRU_get_free_block(false);
- mutex_enter(&mutex);
+ mysql_mutex_lock(&mutex);
next_page:
p= pages.lower_bound(page_id);
}
@@ -2697,17 +2742,26 @@ next_page:
/* Wait until all the pages have been processed */
while (!pages.empty())
{
- const bool abort= found_corrupt_log || found_corrupt_fs;
-
- if (found_corrupt_fs && !srv_force_recovery)
+ if (!is_corrupt_fs() && !is_corrupt_log())
+ {
+ if (last_batch)
+ {
+ mysql_mutex_assert_not_owner(&log_sys.mutex);
+ mysql_cond_wait(&cond, &mutex);
+ }
+ else
+ {
+ mysql_mutex_unlock(&mutex);
+ set_timespec_nsec(abstime, 500000000ULL); /* 0.5s */
+ mysql_cond_timedwait(&cond, &log_sys.mutex, &abstime);
+ mysql_mutex_lock(&mutex);
+ }
+ continue;
+ }
+ if (is_corrupt_fs() && !srv_force_recovery)
ib::info() << "Set innodb_force_recovery=1 to ignore corrupted pages.";
-
- mutex_exit(&mutex);
-
- if (abort)
- return;
- os_thread_sleep(500000);
- mutex_enter(&mutex);
+ mysql_mutex_unlock(&mutex);
+ return;
}
}
@@ -2721,7 +2775,7 @@ next_page:
}
mysql_mutex_assert_not_owner(&log_sys.mutex);
- mutex_exit(&mutex);
+ mysql_mutex_unlock(&mutex);
/* Instead of flushing, last_batch could sort the buf_pool.flush_list
in ascending order of buf_page_t::oldest_modification. */
@@ -2733,11 +2787,11 @@ next_page:
mysql_mutex_lock(&log_sys.mutex);
}
- mutex_enter(&mutex);
+ mysql_mutex_lock(&mutex);
ut_d(after_apply= true);
clear();
- mutex_exit(&mutex);
+ mysql_mutex_unlock(&mutex);
}
/** Check whether the number of read redo log blocks exceeds the maximum.
@@ -2968,7 +3022,7 @@ static bool recv_scan_log_recs(
ib::error() << "Log parsing buffer overflow."
" Recovery may have failed!";
- recv_sys.found_corrupt_log = true;
+ recv_sys.set_corrupt_log();
if (!srv_force_recovery) {
ib::error()
@@ -2976,7 +3030,7 @@ static bool recv_scan_log_recs(
" to ignore this error.";
return(true);
}
- } else if (!recv_sys.found_corrupt_log) {
+ } else if (!recv_sys.is_corrupt_log()) {
more_data = recv_sys_add_to_parsing_buf(
log_block, scanned_lsn);
}
@@ -3004,13 +3058,13 @@ static bool recv_scan_log_recs(
*group_scanned_lsn = scanned_lsn;
- mutex_enter(&recv_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
- if (more_data && !recv_sys.found_corrupt_log) {
+ if (more_data && !recv_sys.is_corrupt_log()) {
/* Try to parse more log records */
if (recv_sys.parse(checkpoint_lsn, store, apply)) {
- ut_ad(recv_sys.found_corrupt_log
- || recv_sys.found_corrupt_fs
+ ut_ad(recv_sys.is_corrupt_log()
+ || recv_sys.is_corrupt_fs()
|| recv_sys.mlog_checkpoint_lsn
== recv_sys.recovered_lsn);
finished = true;
@@ -3035,7 +3089,8 @@ static bool recv_scan_log_recs(
}
func_exit:
- mutex_exit(&recv_sys.mutex);
+ recv_sys.maybe_finish_batch();
+ mysql_mutex_unlock(&recv_sys.mutex);
return(finished);
}
@@ -3057,7 +3112,7 @@ recv_group_scan_log_recs(
DBUG_ENTER("recv_group_scan_log_recs");
DBUG_ASSERT(!last_phase || recv_sys.mlog_checkpoint_lsn > 0);
- mutex_enter(&recv_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
recv_sys.len = 0;
recv_sys.recovered_offset = 0;
recv_sys.clear();
@@ -3066,7 +3121,7 @@ recv_group_scan_log_recs(
recv_sys.recovered_lsn = *contiguous_lsn;
recv_sys.scanned_checkpoint_no = 0;
ut_ad(recv_max_page_lsn == 0);
- mutex_exit(&recv_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
lsn_t start_lsn;
lsn_t end_lsn;
@@ -3094,7 +3149,7 @@ recv_group_scan_log_recs(
start_lsn, end_lsn, contiguous_lsn,
&log_sys.log.scanned_lsn));
- if (recv_sys.found_corrupt_log || recv_sys.found_corrupt_fs) {
+ if (recv_sys.is_corrupt_log() || recv_sys.is_corrupt_fs()) {
DBUG_RETURN(false);
}
@@ -3157,7 +3212,7 @@ recv_validate_tablespace(bool rescan, bool& missing_tablespace)
{
dberr_t err = DB_SUCCESS;
- mutex_enter(&recv_sys.mutex);
+ mysql_mutex_lock(&recv_sys.mutex);
for (recv_sys_t::map::iterator p = recv_sys.pages.begin();
p != recv_sys.pages.end();) {
@@ -3190,7 +3245,7 @@ next:
if (err != DB_SUCCESS) {
func_exit:
- mutex_exit(&recv_sys.mutex);
+ mysql_mutex_unlock(&recv_sys.mutex);
return(err);
}
@@ -3269,7 +3324,7 @@ recv_init_crash_recovery_spaces(bool rescan, bool& missing_tablespace)
ib::error() << "Missing FILE_CREATE, FILE_DELETE"
" or FILE_MODIFY before FILE_CHECKPOINT"
" for tablespace " << rs.first;
- recv_sys.found_corrupt_log = true;
+ recv_sys.set_corrupt_log();
return(DB_CORRUPTION);
} else {
rs.second.status = file_name_t::MISSING;
@@ -3360,7 +3415,7 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
contiguous_lsn = end_lsn;
break;
}
- recv_sys.found_corrupt_log = true;
+ recv_sys.set_corrupt_log();
mysql_mutex_unlock(&log_sys.mutex);
return(DB_ERROR);
}
@@ -3376,14 +3431,14 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
recv_group_scan_log_recs(checkpoint_lsn, &contiguous_lsn, false);
/* The first scan should not have stored or applied any records. */
ut_ad(recv_sys.pages.empty());
- ut_ad(!recv_sys.found_corrupt_fs);
+ ut_ad(!recv_sys.is_corrupt_fs());
if (srv_read_only_mode && recv_needed_recovery) {
mysql_mutex_unlock(&log_sys.mutex);
return(DB_READ_ONLY);
}
- if (recv_sys.found_corrupt_log && !srv_force_recovery) {
+ if (recv_sys.is_corrupt_log() && !srv_force_recovery) {
mysql_mutex_unlock(&log_sys.mutex);
ib::warn() << "Log scan aborted at LSN " << contiguous_lsn;
return(DB_ERROR);
@@ -3409,8 +3464,8 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
rescan = recv_group_scan_log_recs(
checkpoint_lsn, &contiguous_lsn, false);
- if ((recv_sys.found_corrupt_log && !srv_force_recovery)
- || recv_sys.found_corrupt_fs) {
+ if ((recv_sys.is_corrupt_log() && !srv_force_recovery)
+ || recv_sys.is_corrupt_fs()) {
mysql_mutex_unlock(&log_sys.mutex);
return(DB_ERROR);
}
@@ -3494,11 +3549,11 @@ completed:
rescan = recv_group_scan_log_recs(
checkpoint_lsn, &recent_stored_lsn, false);
- ut_ad(!recv_sys.found_corrupt_fs);
+ ut_ad(!recv_sys.is_corrupt_fs());
missing_tablespace = false;
- err = recv_sys.found_corrupt_log
+ err = recv_sys.is_corrupt_log()
? DB_ERROR
: recv_validate_tablespace(
rescan, missing_tablespace);
@@ -3525,9 +3580,9 @@ completed:
recv_group_scan_log_recs(
checkpoint_lsn, &contiguous_lsn, true);
- if ((recv_sys.found_corrupt_log
+ if ((recv_sys.is_corrupt_log()
&& !srv_force_recovery)
- || recv_sys.found_corrupt_fs) {
+ || recv_sys.is_corrupt_fs()) {
mysql_mutex_unlock(&log_sys.mutex);
return(DB_ERROR);
}
@@ -3581,12 +3636,9 @@ completed:
log_sys.next_checkpoint_no = ++checkpoint_no;
- mutex_enter(&recv_sys.mutex);
-
+ mysql_mutex_lock(&recv_sys.mutex);
recv_sys.apply_log_recs = true;
-
- mutex_exit(&recv_sys.mutex);
-
+ mysql_mutex_unlock(&recv_sys.mutex);
mysql_mutex_unlock(&log_sys.mutex);
recv_lsn_checks_on = true;