Skip to content
This repository was archived by the owner on Feb 4, 2022. It is now read-only.

Commit e12ae70

Browse files
committed
feat(transactions): tack recovery token for sharded transactions
NODE-1764
1 parent 03b64e9 commit e12ae70

File tree

3 files changed

+26
-11
lines changed

3 files changed

+26
-11
lines changed

lib/connection/pool.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -428,23 +428,25 @@ function messageHandler(self) {
428428
return handleOperationCallback(self, workItem.cb, new MongoError(err));
429429
}
430430

431-
// Look for clusterTime, and operationTime and update them if necessary
431+
// Look for clusterTime, operationTime, and recoveryToken and update them if necessary
432432
if (message.documents[0]) {
433-
if (message.documents[0].$clusterTime) {
434-
const $clusterTime = message.documents[0].$clusterTime;
433+
const session = workItem.session;
434+
const document = message.documents[0];
435+
if (document.$clusterTime) {
436+
const $clusterTime = document.$clusterTime;
435437
self.topology.clusterTime = $clusterTime;
436438

437-
if (workItem.session != null) {
438-
resolveClusterTime(workItem.session, $clusterTime);
439+
if (session != null) {
440+
resolveClusterTime(session, $clusterTime);
439441
}
440442
}
441443

442-
if (
443-
message.documents[0].operationTime &&
444-
workItem.session &&
445-
workItem.session.supports.causalConsistency
446-
) {
447-
workItem.session.advanceOperationTime(message.documents[0].operationTime);
444+
if (document.operationTime && session && session.supports.causalConsistency) {
445+
session.advanceOperationTime(message.documents[0].operationTime);
446+
}
447+
448+
if (document.recoveryToken && session && session.inTransaction()) {
449+
session.transaction._recoveryToken = document.recoveryToken;
448450
}
449451
}
450452

lib/sessions.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,10 @@ function endTransaction(session, commandName, callback) {
469469
return commandName === 'commitTransaction' ? err : null;
470470
}
471471

472+
if (session.transaction.recoveryToken) {
473+
command.recoveryToken = session.transaction.recoveryToken;
474+
}
475+
472476
// send the command
473477
session.topology.command('admin.$cmd', command, { session }, (err, reply) => {
474478
if (err && isRetryableError(err)) {

lib/transactions.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,21 @@ class Transaction {
104104

105105
// TODO: This isn't technically necessary
106106
this._pinnedServer = undefined;
107+
this._recoveryToken = undefined;
108+
}
109+
110+
get isPinned() {
111+
return this._pinnedServer != null;
107112
}
108113

109114
get server() {
110115
return this._pinnedServer;
111116
}
112117

118+
get recoveryToken() {
119+
return this._recoveryToken;
120+
}
121+
113122
/**
114123
* @ignore
115124
* @return Whether this session is presently in a transaction

0 commit comments

Comments
 (0)