[SERVER-56706] Metric to count multi-document transaction write conflicts Created: 06/May/21  Updated: 04/Dec/23  Resolved: 04/Dec/23

Status: Closed
Project: Core Server
Component/s: Diagnostics
Affects Version/s: None
Fix Version/s: 7.3.0-rc0

Type: Improvement Priority: Major - P3
Reporter: Bruce Lucas (Inactive) Assignee: Wei Hu
Resolution: Fixed Votes: 0
Labels: diagnostics, former-quick-wins
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Depends
Duplicate
is duplicated by SERVER-78929 WriteConflict counter in serverStatus... Closed
Assigned Teams:
Storage Execution
Backwards Compatibility: Fully Compatible
Sprint: Execution Team 2023-11-13, Execution Team 2023-11-27, Execution Team 2023-12-11
Participants:

 Description   

We have a severStatus metric operation.writeConflicts that counts write conflicts that are retried internally in mongod, but that does not count write conflicts within multi-document transactions that are returned to the client and must be retried at the application level. Since retries are expensive it would be useful to have a such a counter to help diagnose performance issues that can result, for example maybe transactions.writeConflicts.



 Comments   
Comment by Githook User [ 04/Dec/23 ]

Author:

{'name': 'Wei Hu', 'email': 'wei.hu@mongodb.com', 'username': 'wh5a'}

Message: SERVER-56706 Count multi-document transaction write conflicts (#17093)

GitOrigin-RevId: bdf13fc16e17f0a4cc9fe9d29420c6c016ed9a9d
Branch: master
https://github.com/mongodb/mongo/commit/8c0b9b16a0460580c0b0ce55703e1a01faff8b03

Comment by Wei Hu [ 04/Nov/23 ]

Steps to reproduce:

  • Start mongod with replica set enabled and extra transaction lifetime

~/mongo/build/install/bin/mongod --dbpath ~/repl --replSet rs0 --setParameter "transactionLifetimeLimitSeconds=600"

rs.initiate()

  • Insert a document

db.accounts.insertOne({ _id: '123456', balance: 0 })

  • Start a transaction

const session = db.getMongo().startSession();
session.startTransaction();
session.getDatabase('test').accounts.updateOne({ _id: '123456' }, {$set: { balance: 10 }});

  • Start another conflicting transaction and observe a WCE

const session2 = db.getMongo().startSession();
session2.startTransaction();
session2.getDatabase('test').accounts.updateOne({ _id: '123456' }, {$set: { balance: 20 }});

  • Inspect counters, especially writeConflicts

db.serverStatus().metrics.operation

  • Optionally

session.commitTransaction();
session2.commitTransaction(); // session2.abortTransaction();
db.accounts.find();

Generated at Thu Feb 08 05:39:59 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.