62 lines
2.0 KiB
JavaScript
62 lines
2.0 KiB
JavaScript
/**
|
|
* Utilities for checking transaction coordinator behaviour in two phase commits.
|
|
*/
|
|
|
|
import {Thread} from "jstests/libs/parallelTester.js";
|
|
import {extractUUIDFromObject} from "jstests/libs/uuid_util.js";
|
|
|
|
export const checkDecisionIs = function (coordinatorConn, lsid, txnNumber, expectedDecision) {
|
|
let coordDoc = coordinatorConn
|
|
.getDB("config")
|
|
.getCollection("transaction_coordinators")
|
|
.findOne({"_id.lsid.id": lsid.id, "_id.txnNumber": txnNumber});
|
|
assert.neq(null, coordDoc);
|
|
assert.eq(expectedDecision, coordDoc.decision.decision);
|
|
if (expectedDecision === "commit") {
|
|
assert.neq(null, coordDoc.decision.commitTimestamp);
|
|
} else {
|
|
assert.eq(null, coordDoc.decision.commitTimestamp);
|
|
}
|
|
return coordDoc.decision.commitTimestamp;
|
|
};
|
|
|
|
export const checkDocumentDeleted = function (coordinatorConn, lsid, txnNumber) {
|
|
let coordDoc = coordinatorConn
|
|
.getDB("config")
|
|
.getCollection("transaction_coordinators")
|
|
.findOne({"_id.lsid.id": lsid.id, "_id.txnNumber": txnNumber});
|
|
return null === coordDoc;
|
|
};
|
|
|
|
export const runCommitThroughMongosInParallelThread = function (
|
|
lsidUUID,
|
|
txnNumber,
|
|
mongosHost,
|
|
errorCode = ErrorCodes.OK,
|
|
) {
|
|
return new Thread(runCommitThroughMongos, extractUUIDFromObject(lsidUUID.id), txnNumber, mongosHost, errorCode);
|
|
};
|
|
|
|
// lsidUUID is the UUID value in string format.
|
|
export const runCommitThroughMongos = function (lsidUUID, txnNumber, mongosHost, expectedCode) {
|
|
const conn = new Mongo(mongosHost);
|
|
const command = {
|
|
commitTransaction: 1,
|
|
lsid: {id: UUID(lsidUUID)},
|
|
txnNumber: NumberLong(txnNumber),
|
|
stmtId: NumberInt(0),
|
|
autocommit: false,
|
|
};
|
|
|
|
if (expectedCode === ErrorCodes.MaxTimeMSExpired) {
|
|
command.maxTimeMS = 1000 * 10;
|
|
}
|
|
|
|
const result = conn.adminCommand(command);
|
|
if (expectedCode === ErrorCodes.OK) {
|
|
assert.commandWorked(result);
|
|
} else {
|
|
assert.commandFailedWithCode(result, expectedCode);
|
|
}
|
|
};
|