mongo/jstests/libs/override_methods/enable_sessions.js

63 lines
2.3 KiB
JavaScript

/**
* Enables sessions on the db object
*/
import {OverrideHelpers} from "jstests/libs/override_methods/override_helpers.js";
const getDBOriginal = Mongo.prototype.getDB;
const sessionMap = new WeakMap();
const sessionOptions = TestData.sessionOptions;
// Override the runCommand to check for any command obj that does not contain a logical session
// and throw an error.
function runCommandWithLsidCheck(conn, dbName, cmdName, cmdObj, func, makeFuncArgs) {
if (jsTest.options().disableEnableSessions) {
return func.apply(conn, makeFuncArgs(cmdObj));
}
if (!cmdObj.hasOwnProperty("lsid")) {
// Throw an error for requests not using sessions.
throw new Error("command object does not have session id: " + tojson(cmdObj));
}
return func.apply(conn, makeFuncArgs(cmdObj));
}
// Override the getDB to return a db object with the correct driverSession. We use a WeakMap
// to cache the session for each connection instance so we can retrieve the same session on
// subsequent calls to getDB.
Mongo.prototype.getDB = function (dbName) {
if (jsTest.options().disableEnableSessions) {
return getDBOriginal.apply(this, arguments);
}
if (
sessionOptions &&
sessionOptions.hasOwnProperty("maybeUseCausalConsistency") &&
sessionOptions.maybeUseCausalConsistency === true
) {
const causalConsistency = Math.random() < 0.5;
sessionOptions.causalConsistency = causalConsistency;
jsTestLog(`Sessions override setting causalConsistency=${causalConsistency} for db ${dbName}`);
delete sessionOptions.maybeUseCausalConsistency;
}
if (!sessionMap.has(this)) {
const session = this.startSession(sessionOptions);
// Override the endSession function to be a no-op so jstestfuzz doesn't accidentally
// end the session.
session.endSession = Function.prototype;
sessionMap.set(this, session);
}
const db = getDBOriginal.apply(this, arguments);
db._session = sessionMap.get(this);
return db;
};
// Override the global `db` object to be part of a session.
globalThis.db = db.getMongo().getDB(db.getName());
OverrideHelpers.prependOverrideInParallelShell("jstests/libs/override_methods/enable_sessions.js");
OverrideHelpers.overrideRunCommand(runCommandWithLsidCheck);