MDEV-12353 introduces a purely physical redo log format. Some effort was made to optimize page_cur_insert_rec_low(), but it is still writing unnecessarily much log. Here is an example:
--source include/innodb_page_size_small.inc
CREATETABLE t1 (a BIGINTPRIMARYKEY, b LONGBLOB) ENGINE=InnoDB;
This test case, which used to fail on the 83rd round when running with the ,4k combination (because it would wrongly apply a mini-transaction whose LSN matches the FIL_PAGE_LSN on the page 0:13, or the only page of SYS_FIELDS) , shows that we are emitting suboptimal redo log records for a particular mini-transaction:
recv_group_scan_log_recs: ib_log: scan 946527: rec 37 len 8 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec b9 len 10 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec b4 len 5 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec 34 len 5 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec d5 len 6 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec b6 len 7 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec d4 len 5 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec b0 len 21 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec 34 len 5 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec d4 len 5 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec b3 len 4 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec 35 len 6 page 0:13
recv_group_scan_log_recs: ib_log: scan 946527: rec 34 len 5 page 0:13
MEMMOVE(0xfe8, {0x2, 0x2}) = from (0xfea) {0x4, 0x80}
WRITE(0xfea, {0x4, 0x80})
WRITE(0x47a, {0x4})
WRITE(0x6e, {0x5})
We update the n_owned of the supremum record at 0x6e multiple times.
The last MEMMOVE of 2 bytes and WRITE of 2 subsequent bytes could be combined to a single 4-byte WRITE of the page directory, possibly using 4+2 bytes instead of 5+4 bytes.
The second-last MEMMOVE of 3 bytes and WRITE of subsequent 18 bytes could be combined to a single record of 21+3 bytes, instead of two records of 5+21 bytes.
The WRITE offsets should be in ascending order, so that the same_page encoding can be used.
The WRITE to byte 0x27 should be combined with the very first WRITE record to 0x28, using 8+1 bytes instead of 8+5 bytes.
Attachments
Issue Links
causes
MDEV-21899INSERT into a secondary index with zero-data-length key is not crash-safe
Closed
MDEV-23304Insert into TEMPORARY TABLE fails to invoke mtr_t::set_modified()
Closed
MDEV-25031Not applying INSERT_REUSE_REDUNDANT due to corruption on page
Closed
MDEV-25745InnoDB recovery fails with [ERROR] InnoDB: Not applying INSERT_REUSE_REDUNDANT due to corruption
Closed
MDEV-28668Recovery or backup of INSERT may be incorrect
Closed
MDEV-29438Recovery or backup of instant ALTER TABLE is incorrect
Closed
MDEV-29559Recovery of INSERT_HEAP_DYNAMIC into secondary index fails
For the record, in MDEV-27774 after MDEV-14425, also the memcpy() is done inside a shared log_sys.latch, that is, multiple threads executing mtr_t::commit() may concurrently copy their local log into log_sys.buf. An exclusive log_sys.latch would be acquired during a log checkpoint, to ensure that no writes are in progress.
Marko Mäkelä
added a comment - For the record, in MDEV-27774 after MDEV-14425 , also the memcpy() is done inside a shared log_sys.latch , that is, multiple threads executing mtr_t::commit() may concurrently copy their local log into log_sys.buf . An exclusive log_sys.latch would be acquired during a log checkpoint, to ensure that no writes are in progress.
I posted some detailed log size statistics for a simple 2-row INSERT transaction in a comment in MDEV-12353.
Here are the statistics for the test case in this ticket again. Only the last line is new:
In our example, we are writing 29% less log for the 2,097,152-row INSERT and spending 52% less total time than before MDEV-12353. Because log_write_up_to() is calculating log block checksums inside a mutex, even a small decrease in log size can greatly reduce the total execution time. In MDEV-14425 we will hopefully improve the log writing further, by only doing a memcpy() inside the mutex.
Marko Mäkelä
added a comment - I posted some detailed log size statistics for a simple 2-row INSERT transaction in a comment in MDEV-12353 .
Here are the statistics for the test case in this ticket again. Only the last line is new:
revision
LSN1
LSN2-LSN1
time
10.5 ac51bcfd8d3b08b62d88350fd9de8ae43f7b1637 (before MDEV-12353 )
62,998
128,417,353
15.9s
10.5 f8a9f906679e1d1ab026c245f7d24c652050d8b3 (after MDEV-12353 )
53,077
214,956,466
25.7s
10.5 8db623038f7158529e804e9607362939bff37337 (after MDEV-21724 )
46,615
91,201,573
7.63s
In our example, we are writing 29% less log for the 2,097,152-row INSERT and spending 52% less total time than before MDEV-12353 . Because log_write_up_to() is calculating log block checksums inside a mutex, even a small decrease in log size can greatly reduce the total execution time. In MDEV-14425 we will hopefully improve the log writing further, by only doing a memcpy() inside the mutex.
I disabled all other redo log sources and set a breakpoint on mtr_t::finish_write(). Most inserts are logged as 47‥55 bytes, and every time the page directory is split, the length can be as much as 80 bytes. The record payload is 5+4+6+7=22 bytes. We must typically update 4+2+4=10 page header bytes when the page directory does not grow. On about 20% of the cases, we must write at least 2+2+1 more bytes to grow the page directory, but this should be doable in much less than 80 bytes.
One more idea, in addition to those mentioned in the Description, is that we could avoid writing leading zero bytes for DB_TRX_ID when the page already contains zeroes in that area. That would save space when the transaction ID fits in 32 bits or less.
In the old format, MLOG_COMP_REC_INSERT is 30 bytes at the start of this test case (with small page numbers and transaction identifiers). We may have to introduce a special redo log record for inserting an index page record. That should fit in less than 30 bytes for 80% of the cases (not adjusting the page directory). Currently, we seem to be writing 60 bytes in the average, which is an 100% increase over the 30 bytes.
Marko Mäkelä
added a comment - I disabled all other redo log sources and set a breakpoint on mtr_t::finish_write() . Most inserts are logged as 47‥55 bytes, and every time the page directory is split, the length can be as much as 80 bytes. The record payload is 5+4+6+7=22 bytes. We must typically update 4+2+4=10 page header bytes when the page directory does not grow. On about 20% of the cases, we must write at least 2+2+1 more bytes to grow the page directory, but this should be doable in much less than 80 bytes.
One more idea, in addition to those mentioned in the Description, is that we could avoid writing leading zero bytes for DB_TRX_ID when the page already contains zeroes in that area. That would save space when the transaction ID fits in 32 bits or less.
In the old format, MLOG_COMP_REC_INSERT is 30 bytes at the start of this test case (with small page numbers and transaction identifiers). We may have to introduce a special redo log record for inserting an index page record. That should fit in less than 30 bytes for 80% of the cases (not adjusting the page directory). Currently, we seem to be writing 60 bytes in the average, which is an 100% increase over the 30 bytes.
I think that to highlight the impact of undo log and B-tree operations, it is better to use a variation of the test, so that updates of the DICT_HDR page will be avoided (they will be done even for TEMPORARY TABLE, until MDEV-19506 is fixed):
--source include/have_innodb.inc
--source include/have_sequence.inc
show status like'innodb_lsn_current';
CREATETABLE t2 (a INTPRIMARYKEY) ENGINE=InnoDB;
show status like'innodb_lsn_current';
INSERTINTO t2 SELECT * FROM seq_1_to_2097152;
show status like'innodb_lsn_current';
DROPTABLE t2;
Even if I disable the redo logging in btr_page_reorganize_low(), the log volume will not be reduced much. Similarly, there is very little impact of disabling logging in page_copy_rec_list_end_no_locks(), page_copy_rec_list_end(), page_copy_rec_list_start().
Once I disabled the logging for page_cur_insert_rec_low(), the redo log volume will be reduced by 72%. The rest is almost entirely attributed to trx_undo_page_set_next_prev_and_add() (writing an undo log record).
Marko Mäkelä
added a comment - I think that to highlight the impact of undo log and B-tree operations, it is better to use a variation of the test, so that updates of the DICT_HDR page will be avoided (they will be done even for TEMPORARY TABLE , until MDEV-19506 is fixed):
--source include/have_innodb.inc
--source include/have_sequence.inc
show status like 'innodb_lsn_current' ;
CREATE TABLE t2 (a INT PRIMARY KEY ) ENGINE=InnoDB;
show status like 'innodb_lsn_current' ;
INSERT INTO t2 SELECT * FROM seq_1_to_2097152;
show status like 'innodb_lsn_current' ;
DROP TABLE t2;
Even if I disable the redo logging in btr_page_reorganize_low() , the log volume will not be reduced much. Similarly, there is very little impact of disabling logging in page_copy_rec_list_end_no_locks() , page_copy_rec_list_end() , page_copy_rec_list_start() .
Once I disabled the logging for page_cur_insert_rec_low() , the redo log volume will be reduced by 72%. The rest is almost entirely attributed to trx_undo_page_set_next_prev_and_add() (writing an undo log record).
The following test case, derived from main.sum_distinct-big, is showing a significant regression due to MDEV-12353. It seems to be mostly explained by the increased redo log volume:
--source include/have_innodb.inc
--source include/have_sequence.inc
show status like'innodb_lsn_current';
CREATETABLE t2 ENGINE=InnoDB SELECT * FROM seq_1_to_2097152;
Because the perf report output was ‘polluted’ by PERFORMANCE_SCHEMA functions, I decided to rebuild with cmake -DPLUGIN_PERFSCHEMA_NO. I also disabled the concurrent purge activity (MDEV-12288) to remove one source of nondeterminism:
perf record ./mtr --mysqld=--innodb-force-recovery=2 main.ib
As expected, rec_get_offsets_func() was removed from the top, because we no longer call it when writing log for an insert.
The function trx_undo_report_row_operation() is taking slightly more time, and mtr_t::log_write<WRITE>() and mtr_t::memcpy_low() are new entries related to the new redo log format. We also spend some more time on ut_crc32_hw() due to the 67% increase of redo log volume.
With a single-row INSERT, there is no regression:
--source include/have_innodb.inc
CREATETABLE t2 (a BIGINT) ENGINE=InnoDB;
show status like'innodb_lsn_current';
INSERTINTO t2 VALUES(1);
show status like'innodb_lsn_current';
DROPTABLE t2;
./mtr --mysqld=--innodb-force-recovery=2 main.ib1
revision
LSN1
LSN2-LSN1
before
61,792
204
after
52,361
175
Marko Mäkelä
added a comment - The following test case, derived from main.sum_distinct-big , is showing a significant regression due to MDEV-12353 . It seems to be mostly explained by the increased redo log volume:
--source include/have_innodb.inc
--source include/have_sequence.inc
show status like 'innodb_lsn_current' ;
CREATE TABLE t2 ENGINE=InnoDB SELECT * FROM seq_1_to_2097152;
show status like 'innodb_lsn_current' ;
DROP TABLE t2;
revision
LSN1
LSN2-LSN1
time
10.5 ac51bcfd8d3b08b62d88350fd9de8ae43f7b1637 (before)
62,998
128,417,353
15.9s
10.5 f8a9f906679e1d1ab026c245f7d24c652050d8b3 (after MDEV-12353 )
53,077
214,956,466
25.7s
Because the perf report output was ‘polluted’ by PERFORMANCE_SCHEMA functions, I decided to rebuild with cmake -DPLUGIN_PERFSCHEMA_NO . I also disabled the concurrent purge activity ( MDEV-12288 ) to remove one source of nondeterminism:
perf record ./mtr --mysqld=--innodb-force-recovery=2 main.ib
revision
LSN1
LSN2-LSN1
time
10.5 ac51bcfd8d3b08b62d88350fd9de8ae43f7b1637 (before)
60,516
128,417,675
14.9s
10.5 f8a9f906679e1d1ab026c245f7d24c652050d8b3 (after MDEV-12353 )
51,149
215,006,904
23.9s
The execution times include the perf record overhead.
Here is the perf report output ( evaluate_join_record() and anything that consumed more time):
10.5 ac51bcfd8d3b08b62d88350fd9de8ae43f7b1637 (before)
12.02% mysqld [.] rec_get_offsets_func
9.36% mysqld [.] buf_page_get_gen
6.32% mysqld [.] cmp_dtuple_rec_with_match_low
6.31% mysqld [.] page_cur_search_with_match
6.30% mysqld [.] btr_cur_search_to_nth_level_func
2.99% mysqld [.] cmp_data
2.04% mysqld [.] row_ins_step
1.92% mysqld [.] mtr_t::commit
1.88% mysqld [.] trx_undo_report_row_operation
1.68% mysqld [.] page_cur_insert_rec_low
1.63% mysqld [.] row_ins_clust_index_entry_low
1.57% mysqld [.] rw_lock_x_lock_func
1.51% mysqld [.] btr_cur_optimistic_insert
1.39% mysqld [.] page_cur_insert_rec_write_log
1.26% mysqld [.] rw_lock_x_lock_wait_func
1.25% mysqld [.] rec_get_converted_size_comp
1.24% mysqld [.] ReleaseLatches::operator()
1.10% mysqld [.] mlog_open_and_write_index
1.00% mysqld [.] row_insert_for_mysql
1.00% mysqld [.] mtr_t::memo_push
1.00% mysqld [.] TTASEventMutex<GenericPolicy>::enter
0.98% mysqld [.] rec_convert_dtuple_to_rec_comp<false>
0.94% mysqld [.] ut_crc32_hw
0.83% mysqld [.] rw_lock_x_lock_low
0.82% mysqld [.] ReleaseBlocks::add_dirty_page_to_flush_list
0.82% mysqld [.] log_margin_checkpoint_age
0.78% mysqld [.] mtr_t::prepare_write
0.72% mysqld [.] TTASEventMutex<BlockMutexPolicy>::enter
0.70% mysqld [.] buf_LRU_remove_block
0.69% mysqld [.] mtr_t::release_block_at_savepoint
0.66% mysqld [.] lock_rec_insert_check_and_lock
0.66% mysqld [.] btr_node_ptr_max_size
0.63% mysqld [.] ha_seq::index_next
0.62% mysqld [.] mtr_t::finish_write
0.60% mysqld [.] handler::ha_index_next
0.59% mysqld [.] btr_cur_ins_lock_and_undo
0.58% mysqld [.] fill_record
0.57% mysqld [.] write_record
0.56% mysqld [.] page_cur_tuple_insert
0.53% mysqld [.] handler::ha_write_row
0.52% mysqld [.] row_mysql_store_col_in_innobase_format
0.52% mysqld [.] ha_innobase::write_row
0.50% mysqld [.] evaluate_join_record
10.5 f8a9f906679e1d1ab026c245f7d24c652050d8b3 (after)
10.03% mysqld [.] rec_get_offsets_func
9.41% mysqld [.] buf_page_get_gen
7.35% mysqld [.] page_cur_search_with_match
5.60% mysqld [.] btr_cur_search_to_nth_level_func
5.46% mysqld [.] cmp_dtuple_rec_with_match_low
3.44% mysqld [.] page_cur_insert_rec_low
3.29% mysqld [.] mtr_t::log_write<(unsigned char)48>
2.64% mysqld [.] cmp_data
2.01% mysqld [.] mtr_t::commit
1.94% mysqld [.] row_ins_step
1.92% mysqld [.] trx_undo_report_row_operation
1.84% mysqld [.] rec_get_converted_size_comp
1.64% mysqld [.] mtr_t::memcpy_low
1.49% mysqld [.] row_ins_clust_index_entry_low
1.47% mysqld [.] rw_lock_x_lock_func
1.40% mysqld [.] btr_cur_optimistic_insert
1.30% mysqld [.] rec_convert_dtuple_to_rec_comp<false>
1.17% mysqld [.] mtr_t::memo_push
1.16% mysqld [.] rw_lock_x_lock_wait_func
1.09% mysqld [.] ReleaseLatches::operator()
1.08% mysqld [.] ut_crc32_hw
1.03% mysqld [.] row_insert_for_mysql
0.81% mysqld [.] handler::ha_index_next
0.79% mysqld [.] TTASEventMutex<GenericPolicy>::enter
0.77% mysqld [.] ReleaseBlocks::add_dirty_page_to_flush_list
0.77% mysqld [.] btr_node_ptr_max_size
0.74% mysqld [.] rw_lock_x_lock_low
0.73% mysqld [.] lock_rec_insert_check_and_lock
0.71% mysqld [.] mtr_t::prepare_write
0.69% mysqld [.] log_margin_checkpoint_age
0.68% mysqld [.] TTASEventMutex<BlockMutexPolicy>::enter
0.60% mysqld [.] ha_innobase::write_row
0.57% mysqld [.] mtr_t::release_block_at_savepoint
0.55% mysqld [.] row_mysql_store_col_in_innobase_format
0.55% mysqld [.] btr_cur_ins_lock_and_undo
0.54% mysqld [.] buf_LRU_remove_block
0.54% mysqld [.] evaluate_join_record
As expected, rec_get_offsets_func() was removed from the top, because we no longer call it when writing log for an insert.
The function trx_undo_report_row_operation() is taking slightly more time, and mtr_t::log_write<WRITE>() and mtr_t::memcpy_low() are new entries related to the new redo log format. We also spend some more time on ut_crc32_hw() due to the 67% increase of redo log volume.
With a single-row INSERT , there is no regression:
--source include/have_innodb.inc
CREATE TABLE t2 (a BIGINT ) ENGINE=InnoDB;
show status like 'innodb_lsn_current' ;
INSERT INTO t2 VALUES (1);
show status like 'innodb_lsn_current' ;
DROP TABLE t2;
./mtr --mysqld=--innodb-force-recovery=2 main.ib1
revision
LSN1
LSN2-LSN1
before
61,792
204
after
52,361
175
People
Marko Mäkelä
Marko Mäkelä
Votes:
0Vote for this issue
Watchers:
4Start watching this issue
Dates
Created:
Updated:
Resolved:
Git Integration
Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.
{"report":{"fcp":905.8999999761581,"ttfb":302.89999997615814,"pageVisibility":"visible","entityId":83213,"key":"jira.project.issue.view-issue","isInitial":true,"threshold":1000,"elementTimings":{},"userDeviceMemory":8,"userDeviceProcessors":64,"apdex":0.5,"journeyId":"32358e84-05ac-4f28-89af-edb353c86b70","navigationType":0,"readyForUser":1008.5999999046326,"redirectCount":0,"resourceLoadedEnd":477,"resourceLoadedStart":311.89999997615814,"resourceTiming":[{"duration":6.899999976158142,"initiatorType":"link","name":"https://jira.mariadb.org/s/2c21342762a6a02add1c328bed317ffd-CDN/lu2cib/820016/12ta74/0a8bac35585be7fc6c9cc5a0464cd4cf/_/download/contextbatch/css/_super/batch.css","startTime":311.89999997615814,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":311.89999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":318.7999999523163,"responseStart":0,"secureConnectionStart":0},{"duration":6.899999976158142,"initiatorType":"link","name":"https://jira.mariadb.org/s/7ebd35e77e471bc30ff0eba799ebc151-CDN/lu2cib/820016/12ta74/494e4c556ecbb29f90a3d3b4f09cb99c/_/download/contextbatch/css/jira.browse.project,project.issue.navigator,jira.view.issue,jira.general,jira.global,atl.general,-_super/batch.css?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true&whisper-enabled=true","startTime":312.1999999284744,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":312.1999999284744,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":319.09999990463257,"responseStart":0,"secureConnectionStart":0},{"duration":118.10000002384186,"initiatorType":"script","name":"https://jira.mariadb.org/s/0917945aaa57108d00c5076fea35e069-CDN/lu2cib/820016/12ta74/0a8bac35585be7fc6c9cc5a0464cd4cf/_/download/contextbatch/js/_super/batch.js?locale=en","startTime":312.39999997615814,"connectEnd":312.39999997615814,"connectStart":312.39999997615814,"domainLookupEnd":312.39999997615814,"domainLookupStart":312.39999997615814,"fetchStart":312.39999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":321.39999997615814,"responseEnd":430.5,"responseStart":338.2999999523163,"secureConnectionStart":312.39999997615814},{"duration":164.40000009536743,"initiatorType":"script","name":"https://jira.mariadb.org/s/2d8175ec2fa4c816e8023260bd8c1786-CDN/lu2cib/820016/12ta74/494e4c556ecbb29f90a3d3b4f09cb99c/_/download/contextbatch/js/jira.browse.project,project.issue.navigator,jira.view.issue,jira.general,jira.global,atl.general,-_super/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&locale=en&slack-enabled=true&whisper-enabled=true","startTime":312.59999990463257,"connectEnd":312.59999990463257,"connectStart":312.59999990463257,"domainLookupEnd":312.59999990463257,"domainLookupStart":312.59999990463257,"fetchStart":312.59999990463257,"redirectEnd":0,"redirectStart":0,"requestStart":322.89999997615814,"responseEnd":477,"responseStart":339.1999999284744,"secureConnectionStart":312.59999990463257},{"duration":9.100000023841858,"initiatorType":"script","name":"https://jira.mariadb.org/s/a9324d6758d385eb45c462685ad88f1d-CDN/lu2cib/820016/12ta74/c92c0caa9a024ae85b0ebdbed7fb4bd7/_/download/contextbatch/js/atl.global,-_super/batch.js?locale=en","startTime":312.7999999523163,"connectEnd":312.7999999523163,"connectStart":312.7999999523163,"domainLookupEnd":312.7999999523163,"domainLookupStart":312.7999999523163,"fetchStart":312.7999999523163,"redirectEnd":0,"redirectStart":0,"requestStart":312.7999999523163,"responseEnd":321.89999997615814,"responseStart":321.89999997615814,"secureConnectionStart":312.7999999523163},{"duration":10.699999928474426,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/1.0/_/download/batch/jira.webresources:calendar-en/jira.webresources:calendar-en.js","startTime":312.89999997615814,"connectEnd":312.89999997615814,"connectStart":312.89999997615814,"domainLookupEnd":312.89999997615814,"domainLookupStart":312.89999997615814,"fetchStart":312.89999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":312.89999997615814,"responseEnd":323.59999990463257,"responseStart":323.59999990463257,"secureConnectionStart":312.89999997615814},{"duration":11.100000023841858,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/1.0/_/download/batch/jira.webresources:calendar-localisation-moment/jira.webresources:calendar-localisation-moment.js","startTime":313.2999999523163,"connectEnd":313.2999999523163,"connectStart":313.2999999523163,"domainLookupEnd":313.2999999523163,"domainLookupStart":313.2999999523163,"fetchStart":313.2999999523163,"redirectEnd":0,"redirectStart":0,"requestStart":313.2999999523163,"responseEnd":324.39999997615814,"responseStart":324.39999997615814,"secureConnectionStart":313.2999999523163},{"duration":12,"initiatorType":"link","name":"https://jira.mariadb.org/s/b04b06a02d1959df322d9cded3aeecc1-CDN/lu2cib/820016/12ta74/a2ff6aa845ffc9a1d22fe23d9ee791fc/_/download/contextbatch/css/jira.global.look-and-feel,-_super/batch.css","startTime":313.39999997615814,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":313.39999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":325.39999997615814,"responseStart":0,"secureConnectionStart":0},{"duration":12.900000095367432,"initiatorType":"script","name":"https://jira.mariadb.org/rest/api/1.0/shortcuts/820016/47140b6e0a9bc2e4913da06536125810/shortcuts.js?context=issuenavigation&context=issueaction","startTime":313.59999990463257,"connectEnd":313.59999990463257,"connectStart":313.59999990463257,"domainLookupEnd":313.59999990463257,"domainLookupStart":313.59999990463257,"fetchStart":313.59999990463257,"redirectEnd":0,"redirectStart":0,"requestStart":313.59999990463257,"responseEnd":326.5,"responseStart":326.5,"secureConnectionStart":313.59999990463257},{"duration":13.399999976158142,"initiatorType":"link","name":"https://jira.mariadb.org/s/3ac36323ba5e4eb0af2aa7ac7211b4bb-CDN/lu2cib/820016/12ta74/d176f0986478cc64f24226b3d20c140d/_/download/contextbatch/css/com.atlassian.jira.projects.sidebar.init,-_super,-project.issue.navigator,-jira.view.issue/batch.css?jira.create.linked.issue=true","startTime":313.89999997615814,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":313.89999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":327.2999999523163,"responseStart":0,"secureConnectionStart":0},{"duration":14.699999928474426,"initiatorType":"script","name":"https://jira.mariadb.org/s/5d5e8fe91fbc506585e83ea3b62ccc4b-CDN/lu2cib/820016/12ta74/d176f0986478cc64f24226b3d20c140d/_/download/contextbatch/js/com.atlassian.jira.projects.sidebar.init,-_super,-project.issue.navigator,-jira.view.issue/batch.js?jira.create.linked.issue=true&locale=en","startTime":313.89999997615814,"connectEnd":313.89999997615814,"connectStart":313.89999997615814,"domainLookupEnd":313.89999997615814,"domainLookupStart":313.89999997615814,"fetchStart":313.89999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":313.89999997615814,"responseEnd":328.59999990463257,"responseStart":328.59999990463257,"secureConnectionStart":313.89999997615814},{"duration":23.800000071525574,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/1.0/_/download/batch/jira.webresources:bigpipe-js/jira.webresources:bigpipe-js.js","startTime":315.59999990463257,"connectEnd":315.59999990463257,"connectStart":315.59999990463257,"domainLookupEnd":315.59999990463257,"domainLookupStart":315.59999990463257,"fetchStart":315.59999990463257,"redirectEnd":0,"redirectStart":0,"requestStart":315.59999990463257,"responseEnd":339.39999997615814,"responseStart":339.39999997615814,"secureConnectionStart":315.59999990463257},{"duration":24.299999952316284,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/1.0/_/download/batch/jira.webresources:bigpipe-init/jira.webresources:bigpipe-init.js","startTime":319.89999997615814,"connectEnd":319.89999997615814,"connectStart":319.89999997615814,"domainLookupEnd":319.89999997615814,"domainLookupStart":319.89999997615814,"fetchStart":319.89999997615814,"redirectEnd":0,"redirectStart":0,"requestStart":319.89999997615814,"responseEnd":344.1999999284744,"responseStart":344.1999999284744,"secureConnectionStart":319.89999997615814},{"duration":220.29999995231628,"initiatorType":"xmlhttprequest","name":"https://jira.mariadb.org/rest/webResources/1.0/resources","startTime":652,"connectEnd":652,"connectStart":652,"domainLookupEnd":652,"domainLookupStart":652,"fetchStart":652,"redirectEnd":0,"redirectStart":0,"requestStart":836.5999999046326,"responseEnd":872.2999999523163,"responseStart":871.8999999761581,"secureConnectionStart":652},{"duration":234.60000002384186,"initiatorType":"script","name":"https://www.google-analytics.com/analytics.js","startTime":882.7999999523163,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":882.7999999523163,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":1117.3999999761581,"responseStart":0,"secureConnectionStart":0},{"duration":253.79999995231628,"initiatorType":"xmlhttprequest","name":"https://jira.mariadb.org/rest/webResources/1.0/resources","startTime":905.5,"connectEnd":905.5,"connectStart":905.5,"domainLookupEnd":905.5,"domainLookupStart":905.5,"fetchStart":905.5,"redirectEnd":0,"redirectStart":0,"requestStart":1121.6999999284744,"responseEnd":1159.2999999523163,"responseStart":1158.7999999523163,"secureConnectionStart":905.5}],"fetchStart":0,"domainLookupStart":0,"domainLookupEnd":0,"connectStart":0,"connectEnd":0,"requestStart":34,"responseStart":303,"responseEnd":318,"domLoading":307,"domInteractive":1123,"domContentLoadedEventStart":1123,"domContentLoadedEventEnd":1191,"domComplete":1462,"loadEventStart":1462,"loadEventEnd":1463,"userAgent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","marks":[{"name":"bigPipe.sidebar-id.start","time":1066.1999999284744},{"name":"bigPipe.sidebar-id.end","time":1067.0999999046326},{"name":"bigPipe.activity-panel-pipe-id.start","time":1067.2999999523163},{"name":"bigPipe.activity-panel-pipe-id.end","time":1073},{"name":"activityTabFullyLoaded","time":1213.7999999523163}],"measures":[],"correlationId":"d292cda82daf6e","effectiveType":"4g","downlink":9.6,"rtt":0,"serverDuration":175,"dbReadsTimeInMs":39,"dbConnsTimeInMs":57,"applicationHash":"9d11dbea5f4be3d4cc21f03a88dd11d8c8687422","experiments":[]}}
For the record, in
MDEV-27774afterMDEV-14425, also the memcpy() is done inside a shared log_sys.latch, that is, multiple threads executing mtr_t::commit() may concurrently copy their local log into log_sys.buf. An exclusive log_sys.latch would be acquired during a log checkpoint, to ensure that no writes are in progress.