@@ -338,15 +338,48 @@ void mtr_t::release()
338338 m_memo.clear ();
339339}
340340
341+ #ifdef HAVE_PMEM
342+ ATTRIBUTE_COLD lsn_t log_t::archived_mmap_switch_complete () noexcept
343+ {
344+ ut_ad (latch_have_wr ());
345+ if (!archive || !resize_buf)
346+ return 0 ;
347+ const lsn_t lsn{get_lsn ()}, end_lsn{first_lsn + capacity ()};
348+ if (lsn < end_lsn)
349+ return 0 ;
350+ persist (lsn);
351+ my_munmap (buf, file_size);
352+ /* TODO: make the file read-only */
353+ buf= resize_buf;
354+ resize_buf= nullptr ;
355+ first_lsn= end_lsn;
356+ file_size= resize_target;
357+ return lsn;
358+ }
359+ #endif
360+
361+ template <bool mmap>
341362ATTRIBUTE_NOINLINE void mtr_t::commit_log_release () noexcept
342363{
343364 if (m_latch_ex)
344365 {
366+ completed:
367+ const lsn_t lsn{mmap ? log_sys.archived_mmap_switch_complete () : 0 };
345368 log_sys.latch .wr_unlock ();
346369 m_latch_ex= false ;
370+ if (mmap && lsn)
371+ buf_flush_ahead (lsn, true );
347372 }
348373 else
374+ {
375+ const bool retry{mmap && log_sys.archived_mmap_switch ()};
349376 log_sys.latch .rd_unlock ();
377+ if (retry)
378+ {
379+ log_sys.latch .wr_lock (SRW_LOCK_CALL);
380+ goto completed;
381+ }
382+ }
350383}
351384
352385static ATTRIBUTE_NOINLINE ATTRIBUTE_COLD
@@ -397,12 +430,12 @@ void mtr_t::commit_log(mtr_t *mtr, std::pair<lsn_t,lsn_t> lsns) noexcept
397430 buf_pool.page_cleaner_wakeup ();
398431 mysql_mutex_unlock (&buf_pool.flush_list_mutex );
399432
400- mtr->commit_log_release ();
433+ mtr->commit_log_release <mmap> ();
401434 mtr->release ();
402435 }
403436 else
404437 {
405- mtr->commit_log_release ();
438+ mtr->commit_log_release <mmap> ();
406439
407440 for (auto it= mtr->m_memo .rbegin (); it != mtr->m_memo .rend (); )
408441 {
@@ -893,39 +926,20 @@ log_t::append_prepare<log_t::ARCHIVED_MMAP>(size_t size, bool ex) noexcept
893926 (WRITE_TO_BUF - 1 )) >=
894927 capacity () -
895928 (lsn= base_lsn.load (std::memory_order_relaxed)) -
896- first_lsn - size))
929+ first_lsn - size) && !resize_buf )
897930 {
898931 /* The following is inlined here instead of being part of
899932 append_prepare_wait(), in order to increase the locality of reference
900933 and to set the WRITE_BACKOFF flag as soon as possible. */
901934 bool late (write_lsn_offset.fetch_or (WRITE_BACKOFF) & WRITE_BACKOFF);
902935 /* Subtract our LSN overshoot. */
903936 write_lsn_offset.fetch_sub (size);
904- append_prepare_archived_mmap (late, ex);
937+ archived_mmap_switch_prepare (late, ex);
905938 }
906939
907940 lsn+= l;
908941 return {lsn, buf + FIRST_LSN + (lsn - first_lsn)};
909942}
910-
911- inline void log_t::archive_new_mmap () noexcept
912- {
913- ut_ad (latch_have_any ());
914- ut_ad (!resize_log.is_opened ());
915- ut_ad (!resize_in_progress ());
916- ut_ad (resize_target >= 4U << 20 );
917- ut_ad (is_latest ());
918-
919- resize_wrap_mutex.wr_lock ();
920- if (resize_buf)
921- {
922- my_munmap (buf, size_t (file_size));
923- buf= resize_buf;
924- resize_buf= nullptr ;
925- file_size= resize_target;
926- }
927- resize_wrap_mutex.wr_unlock ();
928- }
929943#endif
930944
931945ATTRIBUTE_COLD void log_t::append_prepare_wait (bool late, bool ex) noexcept
@@ -1299,14 +1313,14 @@ mtr_t::finish_writer(mtr_t *mtr, size_t len)
12991313#ifdef HAVE_PMEM
13001314 else
13011315 {
1302- byte *const end= &log_sys.buf [log_sys.file_size ];
1316+ const size_t file_size= log_sys.file_size ;
1317+ byte *const buf{log_sys.buf };
1318+ byte *const end= &buf[file_size];
13031319 if (UNIV_LIKELY (start.second + len <= end))
13041320 goto write_normal;
1305- if (mode == log_t ::CIRCULAR_MMAP)
1306- log_sys.archived_lsn = 0 ;
1307- else
1308- log_sys.archive_new_mmap ();
1309- byte *const begin= &log_sys.buf [log_sys.START_OFFSET ];
1321+ byte *const begin= mode == log_t ::ARCHIVED_MMAP
1322+ ? log_sys.get_archived_mmap_switch ()
1323+ : buf + log_sys.START_OFFSET ;
13101324 for (const mtr_buf_t ::block_t &b : mtr->m_log )
13111325 {
13121326 size_t size{b.used ()};
0 commit comments