Skip to content

Commit 5957982

Browse files
test fix - reject promise in attemptTransaction, and remove unnecesary helper functions
1 parent ccc0094 commit 5957982

File tree

1 file changed

+55
-60
lines changed

1 file changed

+55
-60
lines changed

src/sessions.ts

Lines changed: 55 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -588,26 +588,15 @@ async function attemptTransaction<T>(
588588
options: TransactionOptions = {}
589589
): Promise<any> {
590590
session.startTransaction(options);
591-
async function maybeRetryOrThrow(err: MongoError): Promise<any> {
592-
if (
593-
err instanceof MongoError &&
594-
err.hasErrorLabel(MongoErrorLabel.TransientTransactionError) &&
595-
hasNotTimedOut(startTime, MAX_WITH_TRANSACTION_TIMEOUT)
596-
) {
597-
const transactionResult = await attemptTransaction(session, startTime, fn, options);
598-
return transactionResult;
599-
}
600591

601-
if (isMaxTimeMSExpiredError(err)) {
602-
err.addErrorLabel(MongoErrorLabel.UnknownTransactionCommitResult);
603-
}
604-
605-
throw err;
592+
let promise;
593+
try {
594+
promise = fn(session);
595+
} catch (err) {
596+
promise = Promise.reject(err);
606597
}
607598

608599
try {
609-
const promise = fn(session);
610-
611600
if (!isPromiseLike(promise)) {
612601
await session.abortTransaction();
613602
return new MongoInvalidArgumentError(
@@ -626,7 +615,20 @@ async function attemptTransaction<T>(
626615
await session.abortTransaction();
627616
}
628617

629-
return await maybeRetryOrThrow(err);
618+
if (
619+
err instanceof MongoError &&
620+
err.hasErrorLabel(MongoErrorLabel.TransientTransactionError) &&
621+
hasNotTimedOut(startTime, MAX_WITH_TRANSACTION_TIMEOUT)
622+
) {
623+
const transactionResult = await attemptTransaction(session, startTime, fn, options);
624+
return transactionResult;
625+
}
626+
627+
if (isMaxTimeMSExpiredError(err)) {
628+
err.addErrorLabel(MongoErrorLabel.UnknownTransactionCommitResult);
629+
}
630+
631+
throw err;
630632
}
631633
}
632634

@@ -731,53 +733,46 @@ async function endTransaction(
731733
command.recoveryToken = session.transaction.recoveryToken;
732734
}
733735

734-
const handleFirstCommandAttempt = async (error?: Error) => {
735-
if (command.abortTransaction) {
736-
// always unpin on abort regardless of command outcome
737-
session.unpin();
738-
}
739-
740-
if (error instanceof MongoError && isRetryableWriteError(error)) {
741-
// SPEC-1185: apply majority write concern when retrying commitTransaction
742-
if (command.commitTransaction) {
743-
// per txns spec, must unpin session in this case
744-
session.unpin({ force: true });
736+
// send the command
737+
const error = await executeOperation(
738+
session.client,
739+
new RunAdminCommandOperation(command, {
740+
session,
741+
readPreference: ReadPreference.primary,
742+
bypassPinningCheck: true
743+
})
744+
).catch(e => e);
745+
746+
if (command.abortTransaction) {
747+
// always unpin on abort regardless of command outcome
748+
session.unpin();
749+
}
745750

746-
command.writeConcern = Object.assign({ wtimeout: 10000 }, command.writeConcern, {
747-
w: 'majority'
748-
});
749-
}
751+
if (error instanceof MongoError && isRetryableWriteError(error)) {
752+
// SPEC-1185: apply majority write concern when retrying commitTransaction
753+
if (command.commitTransaction) {
754+
// per txns spec, must unpin session in this case
755+
session.unpin({ force: true });
750756

751-
try {
752-
await executeOperation(
753-
session.client,
754-
new RunAdminCommandOperation(command, {
755-
session,
756-
readPreference: ReadPreference.primary,
757-
bypassPinningCheck: true
758-
})
759-
);
760-
commandHandler();
761-
} catch (err) {
762-
commandHandler(err);
763-
throw err;
764-
}
757+
command.writeConcern = Object.assign({ wtimeout: 10000 }, command.writeConcern, {
758+
w: 'majority'
759+
});
765760
}
766-
};
767761

768-
try {
769-
// send the command
770-
await executeOperation(
771-
session.client,
772-
new RunAdminCommandOperation(command, {
773-
session,
774-
readPreference: ReadPreference.primary,
775-
bypassPinningCheck: true
776-
})
777-
);
778-
await handleFirstCommandAttempt();
779-
} catch (err) {
780-
await handleFirstCommandAttempt(err);
762+
try {
763+
await executeOperation(
764+
session.client,
765+
new RunAdminCommandOperation(command, {
766+
session,
767+
readPreference: ReadPreference.primary,
768+
bypassPinningCheck: true
769+
})
770+
);
771+
commandHandler();
772+
} catch (err) {
773+
commandHandler(err);
774+
throw err;
775+
}
781776
}
782777
}
783778

0 commit comments

Comments
 (0)