Skip to content

Commit

Permalink
[CLIENT-3275] Return an error when MRT commit called, but transaction…
Browse files Browse the repository at this point in the history
… was already aborted
  • Loading branch information
khaf committed Jan 17, 2025
1 parent 80b9976 commit 4493ea7
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 14 deletions.
4 changes: 2 additions & 2 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1474,7 +1474,7 @@ func (clnt *Client) Commit(txn *Txn) (CommitStatus, Error) {
case TxnStateCommitted:
return CommitStatusAlreadyCommitted, nil
case TxnStateAborted:
return CommitStatusAlreadyAborted, nil
return CommitStatusAlreadyAborted, newError(types.TXN_ALREADY_ABORTED, "Transaction already aborted")
}
}

Expand All @@ -1491,7 +1491,7 @@ func (clnt *Client) Abort(txn *Txn) (AbortStatus, Error) {
case TxnStateVerified:
return tr.Abort(&clnt.GetDefaultTxnRollPolicy().BatchPolicy)
case TxnStateCommitted:
return AbortStatusAlreadyCommitted, nil
return AbortStatusAlreadyCommitted, newError(types.TXN_ALREADY_COMMITTED, "Transaction already committed")
case TxnStateAborted:
return AbortStatusAlreadyAborted, nil
}
Expand Down
15 changes: 7 additions & 8 deletions txn_error.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,32 +24,31 @@ type TxnError struct {
CommitError CommitError

// Verify result for each read key in the MRT. May be nil if failure occurred before verify.
VerifyRecords []BatchRecordIfc
VerifyRecords []*BatchRecord

// Roll forward/backward result for each write key in the MRT. May be nil if failure occurred before
// roll forward/backward.
RollRecords []BatchRecordIfc
RollRecords []*BatchRecord
}

var _ error = &TxnError{}
var _ Error = &TxnError{}

// func NewTxnCommitError(err CommitError, verifyRecords, rollRecords []BatchRecordIfc, cause Error) Error {
func NewTxnCommitError(err CommitError, cause Error) Error {
func NewTxnCommitError(err CommitError, verifyRecords, rollRecords []*BatchRecord, cause Error) Error {
if cause == nil {
res := newError(types.TXN_FAILED, string(err))
return &TxnError{
AerospikeError: *(res.(*AerospikeError)),
CommitError: err,
// VerifyRecords: verifyRecords,
// RollRecords: rollRecords,
VerifyRecords: verifyRecords,
RollRecords: rollRecords,
}
}

return &TxnError{
AerospikeError: *(cause.(*AerospikeError)),
CommitError: err,
// VerifyRecords: verifyRecords,
// RollRecords: rollRecords,
VerifyRecords: verifyRecords,
RollRecords: rollRecords,
}
}
8 changes: 4 additions & 4 deletions txn_roll.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func (txr *TxnRoll) Verify(verifyPolicy, rollPolicy *BatchPolicy) Error {
txr.txn.SetState(TxnStateAborted)

if err := txr.Roll(rollPolicy, _INFO4_MRT_ROLL_BACK); err != nil {
return NewTxnCommitError(CommitErrorVerifyFailAbortAbandoned, err)
return NewTxnCommitError(CommitErrorVerifyFailAbortAbandoned, txr.verifyRecords, txr.rollRecords, err)

}

Expand All @@ -47,11 +47,11 @@ func (txr *TxnRoll) Verify(verifyPolicy, rollPolicy *BatchPolicy) Error {

txnKey := getTxnMonitorKey(txr.txn)
if err := txr.Close(writePolicy, txnKey); err != nil {
return NewTxnCommitError(CommitErrorVerifyFailAbortAbandoned, err)
return NewTxnCommitError(CommitErrorVerifyFailAbortAbandoned, txr.verifyRecords, txr.rollRecords, err)
}
}

return NewTxnCommitError(CommitErrorVerifyFail, err)
return NewTxnCommitError(CommitErrorVerifyFail, txr.verifyRecords, txr.rollRecords, err)
}
txr.txn.SetState(TxnStateVerified)
return nil
Expand All @@ -65,7 +65,7 @@ func (txr *TxnRoll) Commit(rollPolicy *BatchPolicy) (CommitStatus, Error) {

if txr.txn.MonitorExists() {
if err := txr.MarkRollForward(writePolicy, txnKey); err != nil {
aec := NewTxnCommitError(CommitErrorVerifyFailAbortAbandoned, err)
aec := NewTxnCommitError(CommitErrorVerifyFailAbortAbandoned, txr.verifyRecords, txr.rollRecords, err)

if err.resultCode() == types.MRT_ABORTED {
aec.markInDoubt(false)
Expand Down
18 changes: 18 additions & 0 deletions types/result_code.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ import "fmt"
type ResultCode int

const (
// Multi-record transaction failed
// Multi-record transaction commit called, but the transaction was already aborted.
TXN_ALREADY_ABORTED ResultCode = -24

// Multi-record transaction abort called, but the transaction was already committed.
TXN_ALREADY_COMMITTED ResultCode = -23

// Multi-record transaction failed.
TXN_FAILED ResultCode = -22

Expand Down Expand Up @@ -339,6 +346,13 @@ const (
// ResultCodeToString returns a human readable errors message based on the result code.
func ResultCodeToString(resultCode ResultCode) string {
switch ResultCode(resultCode) {

case TXN_ALREADY_ABORTED:
return "Multi-record transaction commit called, but the transaction was already aborted"

case TXN_ALREADY_COMMITTED:
return "Multi-record transaction abort called, but the transaction was already committed"

case TXN_FAILED:
return "Multi-record transaction failed"

Expand Down Expand Up @@ -654,6 +668,10 @@ func ResultCodeToString(resultCode ResultCode) string {

func (rc ResultCode) String() string {
switch rc {
case TXN_ALREADY_ABORTED:
return "TXN_ALREADY_ABORTED"
case TXN_ALREADY_COMMITTED:
return "TXN_ALREADY_COMMITTED"
case TXN_FAILED:
return "TXN_FAILED"
case GRPC_ERROR:
Expand Down

0 comments on commit 4493ea7

Please sign in to comment.