@@ -588,26 +588,15 @@ async function attemptTransaction<T>(
588
588
options : TransactionOptions = { }
589
589
) : Promise < any > {
590
590
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
- }
600
591
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 ) ;
606
597
}
607
598
608
599
try {
609
- const promise = fn ( session ) ;
610
-
611
600
if ( ! isPromiseLike ( promise ) ) {
612
601
await session . abortTransaction ( ) ;
613
602
return new MongoInvalidArgumentError (
@@ -626,7 +615,20 @@ async function attemptTransaction<T>(
626
615
await session . abortTransaction ( ) ;
627
616
}
628
617
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 ;
630
632
}
631
633
}
632
634
@@ -731,53 +733,46 @@ async function endTransaction(
731
733
command . recoveryToken = session . transaction . recoveryToken ;
732
734
}
733
735
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
+ }
745
750
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 } ) ;
750
756
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
+ } ) ;
765
760
}
766
- } ;
767
761
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
+ }
781
776
}
782
777
}
783
778
0 commit comments