@@ -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
6365void 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