Skip to content

Commit 1540db0

Browse files
tests passing for 4.2 locally
1 parent cfe268d commit 1540db0

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

src/cmap/connect.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export async function performInitialHandshake(
165165
} catch (error) {
166166
if (error instanceof MongoError) {
167167
error.addErrorLabel(MongoErrorLabel.HandshakeError);
168-
if (needsRetryableWriteLabel(error, response.maxWireVersion, isSharded(conn))) {
168+
if (needsRetryableWriteLabel(error, response.maxWireVersion, conn.description.type)) {
169169
error.addErrorLabel(MongoErrorLabel.RetryableWriteError);
170170
}
171171
}

src/error.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Document } from './bson';
2+
import { ServerType } from './sdam/common';
23
import type { TopologyVersion } from './sdam/server_description';
34
import type { TopologyDescription } from './sdam/topology_description';
45

@@ -1217,10 +1218,18 @@ const RETRYABLE_READ_ERROR_CODES = new Set<number>([
12171218
// see: https://github.com/mongodb/specifications/blob/master/source/retryable-writes/retryable-writes.rst#terms
12181219
const RETRYABLE_WRITE_ERROR_CODES = RETRYABLE_READ_ERROR_CODES;
12191220

1221+
const REPLICASET_SERVER_TYPES: ServerType[] = [
1222+
ServerType.RSPrimary,
1223+
ServerType.RSSecondary,
1224+
ServerType.RSArbiter,
1225+
ServerType.RSOther,
1226+
ServerType.RSGhost
1227+
];
1228+
12201229
export function needsRetryableWriteLabel(
12211230
error: Error,
12221231
maxWireVersion: number,
1223-
isSharded: boolean
1232+
serverType: ServerType
12241233
): boolean {
12251234
// pre-4.4 server, then the driver adds an error label for every valid case
12261235
// execute operation will only inspect the label, code/message logic is handled here
@@ -1240,14 +1249,25 @@ export function needsRetryableWriteLabel(
12401249
}
12411250
}
12421251

1243-
// For writeConcernErrors from a pre-4.4 mongos response, do not use the error code to determine retryability.
1244-
const isShardedAndPre4_4 = isSharded && maxWireVersion < 9;
1245-
if (error instanceof MongoWriteConcernError && !isShardedAndPre4_4) {
1246-
return RETRYABLE_WRITE_ERROR_CODES.has(error.result?.code ?? error.code ?? 0);
1252+
// Logic for pre-4.4 server responses from mongos and mongod servers
1253+
if (maxWireVersion < 9 && ['Mongos', ...REPLICASET_SERVER_TYPES].includes(serverType)) {
1254+
// In pre-4.4 servers, use error code to determine retryability for writeConcernErrors in only mongod responses.
1255+
if (REPLICASET_SERVER_TYPES.includes(serverType) && error instanceof MongoWriteConcernError) {
1256+
return RETRYABLE_WRITE_ERROR_CODES.has(error.result?.code ?? Number(error.code) ?? 0);
1257+
}
1258+
// In pre-4.4 servers, use error code to determine retryability for non-writeConcernErrors in mongod and mongos responses.
1259+
if (!(error instanceof MongoWriteConcernError) && error instanceof MongoError) {
1260+
return RETRYABLE_WRITE_ERROR_CODES.has(Number(error.code) ?? 0);
1261+
}
1262+
return false;
1263+
}
1264+
1265+
if (error instanceof MongoWriteConcernError) {
1266+
return RETRYABLE_WRITE_ERROR_CODES.has(error.result?.code ?? Number(error.code) ?? 0);
12471267
}
12481268

12491269
if (error instanceof MongoError && typeof error.code === 'number') {
1250-
return RETRYABLE_WRITE_ERROR_CODES.has(error.code);
1270+
return RETRYABLE_WRITE_ERROR_CODES.has(Number(error.code));
12511271
}
12521272

12531273
const isNotWritablePrimaryError = LEGACY_NOT_WRITABLE_PRIMARY_ERROR_MESSAGE.test(error.message);

src/sdam/server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ export class Server extends TypedEventEmitter<ServerEvents> {
454454
} else {
455455
if (
456456
(isRetryableWritesEnabled(this.topology) || isTransactionCommand(cmd)) &&
457-
needsRetryableWriteLabel(error, maxWireVersion(this), isSharded(this)) &&
457+
needsRetryableWriteLabel(error, maxWireVersion(this), this.s.description.type) &&
458458
!inActiveTransaction(session, cmd)
459459
) {
460460
error.addErrorLabel(MongoErrorLabel.RetryableWriteError);

test/integration/retryable-writes/retryable_writes.spec.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,6 @@ async function turnOffFailPoint(client, name) {
203203
});
204204
}
205205

206-
describe.only('Retryable Writes (unified)', function () {
206+
describe('Retryable Writes (unified)', function () {
207207
runUnifiedSuite(loadSpecTests(path.join('retryable-writes', 'unified')));
208208
});

0 commit comments

Comments
 (0)