Skip to content

Commit aca2f9d

Browse files
committed
squash! 9967583
mtr_t::finish_writer(): Specialize for innodb_log_archive=ON. TODO: Specialize log_t::resizing_and_latch.
1 parent 9967583 commit aca2f9d

File tree

4 files changed

+45
-21
lines changed

4 files changed

+45
-21
lines changed

storage/innobase/handler/ha_innodb.cc

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19435,14 +19435,19 @@ static void innodb_log_archive_update(THD *, st_mysql_sys_var*,
1943519435
void *, const void *save) noexcept
1943619436
{
1943719437
const my_bool archive= *static_cast<const my_bool*>(save);
19438-
log_sys.latch.rd_lock(SRW_LOCK_CALL);
19439-
if (archive && UNIV_UNLIKELY(log_sys.resize_in_progress() != 0))
19438+
log_sys.latch.wr_lock(SRW_LOCK_CALL);
19439+
const lsn_t resizing{log_sys.resize_in_progress()};
19440+
if (archive && UNIV_UNLIKELY(resizing != 0))
1944019441
my_printf_error(ER_WRONG_USAGE,
1944119442
"SET GLOBAL innodb_log_file_size is in progress", MYF(0));
1944219443
else
19444+
{
1944319445
log_sys.archive= archive;
19444-
log_sys.archived_lsn= 0; // FIXME: remove this
19445-
log_sys.latch.rd_unlock();
19446+
if (!resizing)
19447+
mtr_t::finisher_update();
19448+
}
19449+
log_sys.archived_lsn= 0; // FIXME: move this to log_t::write_checkpoint()
19450+
log_sys.latch.wr_unlock();
1944619451
}
1944719452

1944819453
static MYSQL_SYSVAR_BOOL(log_archive, log_sys.archive,

storage/innobase/include/log0log.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,7 @@ struct log_t
273273
uint write_size;
274274
/** format of the redo log: e.g., FORMAT_10_8 */
275275
uint32_t format;
276-
/** the current value of innodb_log_archive;
277-
protected by LOCK_global_system_variable and shared latch */
276+
/** the current value of innodb_log_archive; protected by latch.wr_lock() */
278277
my_bool archive;
279278
/** whether the memory-mapped interface is enabled for the log */
280279
my_bool log_mmap;

storage/innobase/include/mtr0mtr.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -701,12 +701,22 @@ struct mtr_t {
701701
@return {start_lsn,flush_ahead_lsn} */
702702
std::pair<lsn_t,lsn_t> do_write() noexcept;
703703

704+
/** How to write log */
705+
enum finish_writing {
706+
/** circular memory-mapped writing when log_sys.is_mmap() */
707+
CIRCULAR_MMAP,
708+
/** memory-mapped log for log_sys.archive */
709+
ARCHIVED_MMAP,
710+
/** normal writing !log_sys.is_mmap() */
711+
WRITE_NORMAL
712+
};
713+
704714
/** Append the redo log records to the redo log buffer.
705-
@tparam mmap log_sys.is_mmap()
715+
@tparam how how to write
706716
@param mtr mini-transaction
707717
@param len number of bytes to write
708718
@return {start_lsn,flush_ahead_lsn} */
709-
template<bool mmap> static
719+
template<finish_writing how> static
710720
std::pair<lsn_t,lsn_t> finish_writer(mtr_t *mtr, size_t len);
711721

712722
/** The applicable variant of commit_log() */

storage/innobase/mtr/mtr0mtr.cc

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,14 @@ void mtr_t::finisher_update()
5252
if (log_sys.is_mmap())
5353
{
5454
commit_logger= mtr_t::commit_log<true>;
55-
finisher= mtr_t::finish_writer<true>;
55+
finisher= log_sys.archive
56+
? mtr_t::finish_writer<ARCHIVED_MMAP>
57+
: mtr_t::finish_writer<CIRCULAR_MMAP>;
5658
return;
5759
}
5860
commit_logger= mtr_t::commit_log<false>;
5961
#endif
60-
finisher= mtr_t::finish_writer<false>;
62+
finisher= mtr_t::finish_writer<WRITE_NORMAL>;
6163
}
6264

6365
void mtr_memo_slot_t::release() const
@@ -920,6 +922,7 @@ ATTRIBUTE_COLD void log_t::append_prepare_wait(bool late, bool ex) noexcept
920922
{
921923
ut_ad(lsn - get_flushed_lsn(std::memory_order_relaxed) < capacity() ||
922924
overwrite_warned);
925+
ut_a(!archive); // FIXME: create, allocate and attach a new file
923926
persist(lsn);
924927
}
925928
#endif
@@ -1214,25 +1217,30 @@ inline void log_t::append(byte *&d, const void *s, size_t size) noexcept
12141217
d+= size;
12151218
}
12161219

1217-
template<bool mmap>
1218-
std::pair<lsn_t,lsn_t> mtr_t::finish_writer(mtr_t *mtr, size_t len)
1220+
template<mtr_t::finish_writing how>
1221+
std::pair<lsn_t,lsn_t>
1222+
mtr_t::finish_writer(mtr_t *mtr, size_t len)
12191223
{
12201224
ut_ad(log_sys.is_latest());
12211225
ut_ad(!recv_no_log_write);
12221226
ut_ad(mtr->is_logged());
12231227
ut_ad(mtr->m_latch_ex ? log_sys.latch_have_wr() : log_sys.latch_have_rd());
12241228
ut_ad(len < recv_sys.MTR_SIZE_MAX);
1229+
ut_ad(how == WRITE_NORMAL || log_sys.archive == (how == ARCHIVED_MMAP));
12251230

12261231
const size_t size{mtr->m_commit_lsn ? 5U + 8U : 5U};
12271232
std::pair<lsn_t, byte*> start=
1228-
log_sys.append_prepare<mmap>(len, mtr->m_latch_ex);
1233+
log_sys.append_prepare<how != WRITE_NORMAL>(len, mtr->m_latch_ex);
12291234

1230-
if (!mmap)
1235+
if (how == WRITE_NORMAL ||
1236+
UNIV_LIKELY(start.second + len <= &log_sys.buf[log_sys.file_size]))
12311237
{
12321238
for (const mtr_buf_t::block_t &b : mtr->m_log)
12331239
log_sys.append(start.second, b.begin(), b.used());
12341240

1241+
#ifdef HAVE_PMEM
12351242
write_trailer:
1243+
#endif
12361244
*start.second++= log_sys.get_sequence_bit(start.first + len - size);
12371245
if (mtr->m_commit_lsn)
12381246
{
@@ -1245,12 +1253,10 @@ std::pair<lsn_t,lsn_t> mtr_t::finish_writer(mtr_t *mtr, size_t len)
12451253
}
12461254
else
12471255
{
1248-
if (UNIV_LIKELY(start.second + len <= &log_sys.buf[log_sys.file_size]))
1249-
{
1250-
for (const mtr_buf_t::block_t &b : mtr->m_log)
1251-
log_sys.append(start.second, b.begin(), b.used());
1252-
goto write_trailer;
1253-
}
1256+
#ifndef HAVE_PMEM
1257+
static_assert(how == WRITE_NORMAL, "");
1258+
#else
1259+
ut_a(how == CIRCULAR_MMAP); // FIXME: implement ARCHIVED_MMAP
12541260
for (const mtr_buf_t::block_t &b : mtr->m_log)
12551261
{
12561262
size_t size{b.used()};
@@ -1288,9 +1294,13 @@ std::pair<lsn_t,lsn_t> mtr_t::finish_writer(mtr_t *mtr, size_t len)
12881294
start.second= log_sys.buf +
12891295
((size >= size_left) ? log_sys.START_OFFSET : log_sys.file_size) +
12901296
(size - size_left);
1297+
#endif
12911298
}
12921299

1293-
log_sys.resize_write(start.first, start.second, len, size);
1300+
if (how == ARCHIVED_MMAP)
1301+
ut_ad(!log_sys.resize_in_progress());
1302+
else
1303+
log_sys.resize_write(start.first, start.second, len, size);
12941304

12951305
mtr->m_commit_lsn= start.first + len;
12961306
return {start.first, log_close(mtr->m_commit_lsn)};

0 commit comments

Comments
 (0)