Currently, lock_t is a union of table locks and record lock bitmaps. There can be multiple record lock bitmaps in a transaction. A record lock bitmap is specific to an index leaf page and a locking mode. It could be more efficient to use a single bitmap per page, with 4 bits per record heap number to represent all combinations of record and gap lock modes: {shared,exclusive,gap-read,gap-write}.
There are two types of gap locks (covering the open range of keys from the preceding record to the anchor record). A gap-read lock (acquired by UPDATE, DELETE, or a locking SELECT) prevents any subsequent INSERT to that range.
INSERT will acquire a gap-write or insert-intention lock (LOCK_INSERT_INTENTION). It conflicts with previously granted gap-read locks. Gap-read locks may be granted on the same lock if a gap-write lock has been granted to an active transaction.
An INSERT requires both a gap-write lock and an exclusive lock on the key that is being inserted. Any amount of gap-read locks may be held on the same gap by different transactions.
In lock_rec_has_to_wait(), gap-write locks do not conflict with gap-write locks of other transactions, even though lock_mode_compatible() would not hold.
A transaction can wait for at most one record. MDEV-24671 already simplified lock waits by introducing the function lock_wait(). If we pack 2 record heap numbers per byte (4 bits per heap number) in the record lock bitmap, there is no space for a further LOCK_WAIT flag. We might want to create a special type of bitmap for a waiting lock request, to avoid allocating a large bitmap (if the record heap number is 3000, the size of a straightforward bitmap would be 1500 bytes). We might store the attributes of the single-record lock request in the trx_t object. Maybe we could just preallocate a record lock bitmap object in trx_t, to be used for all waiting requests?
Attachments
Issue Links
blocks
MDEV-21452Use condition variables and normal mutexes instead of InnoDB os_event and mutex
Closed
relates to
MDEV-17512Deadlock after locking all rows in table
Open
MDEV-20605Awaken transaction can miss inserted by other transaction records due to wrong persistent cursor restoration
Closed
MDEV-21974InnoDB DML under backup locks make buffer pool usage grow permanently
Open
MDEV-10962Deadlock with 3 concurrent DELETEs by unique key
Closed
MDEV-11215Several locks taken to same record inside a transaction.
Stalled
MDEV-18706ER_LOCK_DEADLOCK on concurrent read and insert into already locked gap
In a discussion with monty, arubin and Peter Zaitsev today, the need for having secondary index record locks was questioned. The basic idea is that instead of checking if a lock exists on a secondary index record, we check the lock on the corresponding clustered index record.
We would still seem to need gap locks on secondary index records. A locking read on a secondary index must prevent an INSERT of the same value, for any primary key value:
connection con1;
BEGIN;
# returning any amount ofrows, possibly including 0
SELECTCOUNT(*) FROM t WHERE indexed_column BETWEEN 42 AND 64 LOCK IN SHARE MODE;
connection con2;
--error ER_LOCK_WAIT_TIMEOUT
INSERTINTO t SET pk=12345, indexed_column=50;
--error ER_LOCK_WAIT_TIMEOUT
UPDATE t SET indexed_column=50;
--error ER_LOCK_WAIT_TIMEOUT
DELETEFROM t WHERE indexed_column BETWEEN 30 AND 70;
connection con1;
# must return the same result!
SELECTCOUNT(*) FROM t WHERE indexed_column BETWEEN 42 AND 64 LOCK IN SHARE MODE;
If the SELECT did not acquire gap locks that cover the whole range [42,64], then the INSERT, DELETE or UPDATE would not be blocked.
Note: Even if users do not use SERIALIZABLE isolation level or LOCK IN SHARE MODE or FOR UPDATE, InnoDB will internally acquire shared or exclusive locks in FOREIGN KEY checks or CASCADE or SET operations.
It would seem that we may not really need single-record locks on secondary indexes, but gap locks we do need.
There is a possible reason against relying explicitly on gap locks on secondary indexes. Gap locks are inherently nondeterministic (potentially causing problems with some forms of replication), since they can be attached to a delete-marked purgeable record. That is, purge can widen gaps at any time by removing those "invisible" keys. Because of this, it might be better to prefer single-record locks over gap locks in those cases where we want to lock a single secondary index key.
Marko Mäkelä
added a comment - In a discussion with monty , arubin and Peter Zaitsev today, the need for having secondary index record locks was questioned. The basic idea is that instead of checking if a lock exists on a secondary index record, we check the lock on the corresponding clustered index record.
We would still seem to need gap locks on secondary index records. A locking read on a secondary index must prevent an INSERT of the same value, for any primary key value:
connection con1;
BEGIN ;
# returning any amount of rows , possibly including 0
SELECT COUNT (*) FROM t WHERE indexed_column BETWEEN 42 AND 64 LOCK IN SHARE MODE;
connection con2;
--error ER_LOCK_WAIT_TIMEOUT
INSERT INTO t SET pk=12345, indexed_column=50;
--error ER_LOCK_WAIT_TIMEOUT
UPDATE t SET indexed_column=50;
--error ER_LOCK_WAIT_TIMEOUT
DELETE FROM t WHERE indexed_column BETWEEN 30 AND 70;
connection con1;
# must return the same result!
SELECT COUNT (*) FROM t WHERE indexed_column BETWEEN 42 AND 64 LOCK IN SHARE MODE;
If the SELECT did not acquire gap locks that cover the whole range [42,64], then the INSERT , DELETE or UPDATE would not be blocked.
Note: Even if users do not use SERIALIZABLE isolation level or LOCK IN SHARE MODE or FOR UPDATE , InnoDB will internally acquire shared or exclusive locks in FOREIGN KEY checks or CASCADE or SET operations.
It would seem that we may not really need single-record locks on secondary indexes, but gap locks we do need.
There is a possible reason against relying explicitly on gap locks on secondary indexes. Gap locks are inherently nondeterministic (potentially causing problems with some forms of replication), since they can be attached to a delete-marked purgeable record. That is, purge can widen gaps at any time by removing those "invisible" keys. Because of this, it might be better to prefer single-record locks over gap locks in those cases where we want to lock a single secondary index key.
As noted in MDEV-17512, it could be desirable to have a variation of a locking SELECT that acquires write-gap-locks, so that a later INSERT by the same transaction within the already searched range of keys will be guaranteed to succeed. Currently, FOR UPDATE only guarantees that UPDATE and DELETE will succeed.
Marko Mäkelä
added a comment - - edited As noted in MDEV-17512 , it could be desirable to have a variation of a locking SELECT that acquires write-gap-locks, so that a later INSERT by the same transaction within the already searched range of keys will be guaranteed to succeed. Currently, FOR UPDATE only guarantees that UPDATE and DELETE will succeed.
There are two modes of gap locks, sharable within each mode.
That is, multiple locking reads (possibly as part of DELETE or UPDATE) can acquire a read-gap-lock on the same gap. Also, multiple INSERT can acquire a write-gap-lock (called LOCK_INSERT_INTENTION in the code) on the same gap. But at most one type of gap lock may exist on the same gap at any given time.
The following test demonstrates this:
--source include/have_innodb.inc
CREATETABLE t1(id INTPRIMARYKEY) ENGINE=InnoDB;
INSERTINTO t1(id) VALUES(1),(2),(3),(4);
BEGIN;
SELECT * FROM t1 WHERE id=0 FORUPDATE;
connect(con1, localhost, root,,);
SELECT * FROM t1 WHERE id=0 FORUPDATE;
disconnect con1;
connectiondefault;
DROPTABLE t1;
Both SELECT will acquire a gap lock that precedes the successor of the non-matching record. In this case, the non-matching record would be the page infimum, and the successor would be the record id=1. Any INSERT with a value that is less than this would be prevented.
The example would also work without the INSERT; in that case, the gap lock would be attached to the page supremum, preventing any INSERT into the empty table while either of the two transactions hold the gap lock.
Marko Mäkelä
added a comment - - edited There are two modes of gap locks, sharable within each mode.
That is, multiple locking reads (possibly as part of DELETE or UPDATE ) can acquire a read-gap-lock on the same gap. Also, multiple INSERT can acquire a write-gap-lock (called LOCK_INSERT_INTENTION in the code) on the same gap. But at most one type of gap lock may exist on the same gap at any given time.
The following test demonstrates this:
--source include/have_innodb.inc
CREATE TABLE t1(id INT PRIMARY KEY ) ENGINE=InnoDB;
INSERT INTO t1(id) VALUES (1),(2),(3),(4);
BEGIN ;
SELECT * FROM t1 WHERE id=0 FOR UPDATE ;
connect (con1, localhost, root,,);
SELECT * FROM t1 WHERE id=0 FOR UPDATE ;
disconnect con1;
connection default ;
DROP TABLE t1;
Both SELECT will acquire a gap lock that precedes the successor of the non-matching record. In this case, the non-matching record would be the page infimum, and the successor would be the record id=1 . Any INSERT with a value that is less than this would be prevented.
The example would also work without the INSERT ; in that case, the gap lock would be attached to the page supremum, preventing any INSERT into the empty table while either of the two transactions hold the gap lock.
People
Vladislav Lesin
Marko Mäkelä
Votes:
2Vote for this issue
Watchers:
8Start watching this issue
Dates
Created:
Updated:
Git Integration
Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.
{"report":{"fcp":931.8999996185303,"ttfb":303.19999980926514,"pageVisibility":"visible","entityId":67989,"key":"jira.project.issue.view-issue","isInitial":true,"threshold":1000,"elementTimings":{},"userDeviceMemory":8,"userDeviceProcessors":64,"apdex":0.5,"journeyId":"f4411016-9259-4750-96e6-730f52ab9994","navigationType":0,"readyForUser":1008.3999996185303,"redirectCount":0,"resourceLoadedEnd":1038.8999996185303,"resourceLoadedStart":309.5999994277954,"resourceTiming":[{"duration":48.30000019073486,"initiatorType":"link","name":"https://jira.mariadb.org/s/2c21342762a6a02add1c328bed317ffd-CDN/lu2cib/820016/12ta74/0a8bac35585be7fc6c9cc5a0464cd4cf/_/download/contextbatch/css/_super/batch.css","startTime":309.5999994277954,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":309.5999994277954,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":357.8999996185303,"responseStart":0,"secureConnectionStart":0},{"duration":48.40000057220459,"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":309.8999996185303,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":309.8999996185303,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":358.30000019073486,"responseStart":0,"secureConnectionStart":0},{"duration":111.70000076293945,"initiatorType":"script","name":"https://jira.mariadb.org/s/0917945aaa57108d00c5076fea35e069-CDN/lu2cib/820016/12ta74/0a8bac35585be7fc6c9cc5a0464cd4cf/_/download/contextbatch/js/_super/batch.js?locale=en","startTime":310.0999994277954,"connectEnd":310.0999994277954,"connectStart":310.0999994277954,"domainLookupEnd":310.0999994277954,"domainLookupStart":310.0999994277954,"fetchStart":310.0999994277954,"redirectEnd":0,"redirectStart":0,"requestStart":310.0999994277954,"responseEnd":421.80000019073486,"responseStart":421.80000019073486,"secureConnectionStart":310.0999994277954},{"duration":187.39999961853027,"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":310.30000019073486,"connectEnd":310.30000019073486,"connectStart":310.30000019073486,"domainLookupEnd":310.30000019073486,"domainLookupStart":310.30000019073486,"fetchStart":310.30000019073486,"redirectEnd":0,"redirectStart":0,"requestStart":310.30000019073486,"responseEnd":497.69999980926514,"responseStart":497.69999980926514,"secureConnectionStart":310.30000019073486},{"duration":191.0999994277954,"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":310.5,"connectEnd":310.5,"connectStart":310.5,"domainLookupEnd":310.5,"domainLookupStart":310.5,"fetchStart":310.5,"redirectEnd":0,"redirectStart":0,"requestStart":310.5,"responseEnd":501.5999994277954,"responseStart":501.5999994277954,"secureConnectionStart":310.5},{"duration":191.39999961853027,"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":310.69999980926514,"connectEnd":310.69999980926514,"connectStart":310.69999980926514,"domainLookupEnd":310.69999980926514,"domainLookupStart":310.69999980926514,"fetchStart":310.69999980926514,"redirectEnd":0,"redirectStart":0,"requestStart":310.69999980926514,"responseEnd":502.0999994277954,"responseStart":502.0999994277954,"secureConnectionStart":310.69999980926514},{"duration":191.5,"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":310.8999996185303,"connectEnd":310.8999996185303,"connectStart":310.8999996185303,"domainLookupEnd":310.8999996185303,"domainLookupStart":310.8999996185303,"fetchStart":310.8999996185303,"redirectEnd":0,"redirectStart":0,"requestStart":310.8999996185303,"responseEnd":502.3999996185303,"responseStart":502.3999996185303,"secureConnectionStart":310.8999996185303},{"duration":255.0999994277954,"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":311,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":311,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":566.0999994277954,"responseStart":0,"secureConnectionStart":0},{"duration":191.69999980926514,"initiatorType":"script","name":"https://jira.mariadb.org/rest/api/1.0/shortcuts/820016/47140b6e0a9bc2e4913da06536125810/shortcuts.js?context=issuenavigation&context=issueaction","startTime":311.19999980926514,"connectEnd":311.19999980926514,"connectStart":311.19999980926514,"domainLookupEnd":311.19999980926514,"domainLookupStart":311.19999980926514,"fetchStart":311.19999980926514,"redirectEnd":0,"redirectStart":0,"requestStart":311.19999980926514,"responseEnd":502.8999996185303,"responseStart":502.8999996185303,"secureConnectionStart":311.19999980926514},{"duration":254.80000019073486,"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":311.3999996185303,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":311.3999996185303,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":566.1999998092651,"responseStart":0,"secureConnectionStart":0},{"duration":191.80000019073486,"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":311.5999994277954,"connectEnd":311.5999994277954,"connectStart":311.5999994277954,"domainLookupEnd":311.5999994277954,"domainLookupStart":311.5999994277954,"fetchStart":311.5999994277954,"redirectEnd":0,"redirectStart":0,"requestStart":311.5999994277954,"responseEnd":503.3999996185303,"responseStart":503.3999996185303,"secureConnectionStart":311.5999994277954},{"duration":313.80000019073486,"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":313,"connectEnd":313,"connectStart":313,"domainLookupEnd":313,"domainLookupStart":313,"fetchStart":313,"redirectEnd":0,"redirectStart":0,"requestStart":313,"responseEnd":626.8000001907349,"responseStart":626.8000001907349,"secureConnectionStart":313},{"duration":427.20000076293945,"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":313.0999994277954,"connectEnd":313.0999994277954,"connectStart":313.0999994277954,"domainLookupEnd":313.0999994277954,"domainLookupStart":313.0999994277954,"fetchStart":313.0999994277954,"redirectEnd":0,"redirectStart":0,"requestStart":313.0999994277954,"responseEnd":740.3000001907349,"responseStart":740.3000001907349,"secureConnectionStart":313.0999994277954},{"duration":135.60000038146973,"initiatorType":"xmlhttprequest","name":"https://jira.mariadb.org/rest/webResources/1.0/resources","startTime":594.0999994277954,"connectEnd":594.0999994277954,"connectStart":594.0999994277954,"domainLookupEnd":594.0999994277954,"domainLookupStart":594.0999994277954,"fetchStart":594.0999994277954,"redirectEnd":0,"redirectStart":0,"requestStart":594.0999994277954,"responseEnd":729.6999998092651,"responseStart":729.6999998092651,"secureConnectionStart":594.0999994277954},{"duration":193.89999961853027,"initiatorType":"link","name":"https://jira.mariadb.org/s/d5715adaadd168a9002b108b2b039b50-CDN/lu2cib/820016/12ta74/be4b45e9cec53099498fa61c8b7acba4/_/download/contextbatch/css/jira.project.sidebar,-_super,-project.issue.navigator,-jira.general,-jira.browse.project,-jira.view.issue,-jira.global,-atl.general,-com.atlassian.jira.projects.sidebar.init/batch.css?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true&whisper-enabled=true","startTime":844.6999998092651,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":844.6999998092651,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":1038.5999994277954,"responseStart":0,"secureConnectionStart":0},{"duration":193.5,"initiatorType":"link","name":"https://jira.mariadb.org/s/50bc9be5bfead1a25e72c1a9338c94f6-CDN/lu2cib/820016/12ta74/e108c7645258ccb43280ed3404e3e949/_/download/contextbatch/css/com.atlassian.jira.plugins.jira-development-integration-plugin:0,-_super,-jira.view.issue,-jira.global,-jira.general,-jira.browse.project,-project.issue.navigator,-atl.general/batch.css?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true&whisper-enabled=true","startTime":845.3000001907349,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":845.3000001907349,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":1038.8000001907349,"responseStart":0,"secureConnectionStart":0},{"duration":184,"initiatorType":"script","name":"https://jira.mariadb.org/s/d41d8cd98f00b204e9800998ecf8427e-CDN/lu2cib/820016/12ta74/e65b778d185daf5aee24936755b43da6/_/download/contextbatch/js/browser-metrics-plugin.contrib,-_super,-project.issue.navigator,-jira.view.issue,-atl.general/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&slack-enabled=true&whisper-enabled=true","startTime":846.3000001907349,"connectEnd":846.3000001907349,"connectStart":846.3000001907349,"domainLookupEnd":846.3000001907349,"domainLookupStart":846.3000001907349,"fetchStart":846.3000001907349,"redirectEnd":0,"redirectStart":0,"requestStart":846.3000001907349,"responseEnd":1030.3000001907349,"responseStart":1030.3000001907349,"secureConnectionStart":846.3000001907349},{"duration":190.80000019073486,"initiatorType":"script","name":"https://jira.mariadb.org/s/097ae97cb8fbec7d6ea4bbb1f26955b9-CDN/lu2cib/820016/12ta74/be4b45e9cec53099498fa61c8b7acba4/_/download/contextbatch/js/jira.project.sidebar,-_super,-project.issue.navigator,-jira.general,-jira.browse.project,-jira.view.issue,-jira.global,-atl.general,-com.atlassian.jira.projects.sidebar.init/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&locale=en&slack-enabled=true&whisper-enabled=true","startTime":846.5999994277954,"connectEnd":846.5999994277954,"connectStart":846.5999994277954,"domainLookupEnd":846.5999994277954,"domainLookupStart":846.5999994277954,"fetchStart":846.5999994277954,"redirectEnd":0,"redirectStart":0,"requestStart":846.5999994277954,"responseEnd":1037.3999996185303,"responseStart":1037.3999996185303,"secureConnectionStart":846.5999994277954},{"duration":191.89999961853027,"initiatorType":"script","name":"https://jira.mariadb.org/s/e0bf5781d46ea69fb123572974cf39de-CDN/lu2cib/820016/12ta74/e108c7645258ccb43280ed3404e3e949/_/download/contextbatch/js/com.atlassian.jira.plugins.jira-development-integration-plugin:0,-_super,-jira.view.issue,-jira.global,-jira.general,-jira.browse.project,-project.issue.navigator,-atl.general/batch.js?agile_global_admin_condition=true&jag=true&jira.create.linked.issue=true&locale=en&slack-enabled=true&whisper-enabled=true","startTime":847,"connectEnd":847,"connectStart":847,"domainLookupEnd":847,"domainLookupStart":847,"fetchStart":847,"redirectEnd":0,"redirectStart":0,"requestStart":847,"responseEnd":1038.8999996185303,"responseStart":1038.8999996185303,"secureConnectionStart":847},{"duration":151.69999980926514,"initiatorType":"script","name":"https://www.google-analytics.com/analytics.js","startTime":926.3000001907349,"connectEnd":0,"connectStart":0,"domainLookupEnd":0,"domainLookupStart":0,"fetchStart":926.3000001907349,"redirectEnd":0,"redirectStart":0,"requestStart":0,"responseEnd":1078,"responseStart":0,"secureConnectionStart":0}],"fetchStart":0,"domainLookupStart":0,"domainLookupEnd":0,"connectStart":0,"connectEnd":0,"requestStart":123,"responseStart":303,"responseEnd":308,"domLoading":307,"domInteractive":1095,"domContentLoadedEventStart":1095,"domContentLoadedEventEnd":1158,"domComplete":1359,"loadEventStart":1359,"loadEventEnd":1360,"userAgent":"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)","marks":[{"name":"bigPipe.sidebar-id.start","time":1050.8000001907349},{"name":"bigPipe.sidebar-id.end","time":1051.5999994277954},{"name":"bigPipe.activity-panel-pipe-id.start","time":1051.6999998092651},{"name":"bigPipe.activity-panel-pipe-id.end","time":1054.5999994277954},{"name":"activityTabFullyLoaded","time":1185.3000001907349}],"measures":[],"correlationId":"cce08d0e205958","effectiveType":"4g","downlink":10,"rtt":0,"serverDuration":123,"dbReadsTimeInMs":19,"dbConnsTimeInMs":29,"applicationHash":"9d11dbea5f4be3d4cc21f03a88dd11d8c8687422","experiments":[]}}
Gap locks should be deterministic, once we fix
MDEV-20605.