From 94d7b295eaeca7effbccca989a6900444bf71af8 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Fri, 12 Mar 2021 10:37:40 -0600 Subject: [PATCH 1/2] added more graceful error handling for corrupt containers --- rbf.go | 24 ++++++++++++++++++------ rbf/rbf.go | 15 +++++++++------ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/rbf.go b/rbf.go index 449c35abe..d4a3d357d 100644 --- a/rbf.go +++ b/rbf.go @@ -284,15 +284,21 @@ func (tx *RBFTx) addOrRemove(index, field, view string, shard uint64, batched, r // not first time through, write what we got. if remove && (rc == nil || rc.N() == 0) { err = tx.RemoveContainer(index, field, view, shard, lastHi) - panicOn(err) + if err != nil { + return 0, rbf.ErrTxFailedToRemoveContainer + } } else { err = tx.PutContainer(index, field, view, shard, lastHi, rc) - panicOn(err) + if err != nil { + return 0, rbf.ErrTxFailedToPutContainer + } } } // get the next container rc, err = tx.Container(index, field, view, shard, hi) - panicOn(err) + if err != nil { + return 0, rbf.ErrTxFailedToRetrieveContainer + } } // else same container, keep adding bits to rct. chng := false // rc can be nil before, and nil after, in both Remove/Add below. @@ -311,17 +317,23 @@ func (tx *RBFTx) addOrRemove(index, field, view string, shard uint64, batched, r if remove { if rc == nil || rc.N() == 0 { err = tx.RemoveContainer(index, field, view, shard, hi) - panicOn(err) + if err != nil { + return 0, rbf.ErrTxFailedToRemoveContainer + } } else { err = tx.PutContainer(index, field, view, shard, hi, rc) - panicOn(err) + if err != nil { + return 0, rbf.ErrTxFailedToPutContainer + } } } else { if rc == nil || rc.N() == 0 { panic("there should be no way to have an empty bitmap AFTER an Add() operation") } err = tx.PutContainer(index, field, view, shard, hi, rc) - panicOn(err) + if err != nil { + return 0, rbf.ErrTxFailedToPutContainer + } } return } diff --git a/rbf/rbf.go b/rbf/rbf.go index 365907121..31d5a0f31 100644 --- a/rbf/rbf.go +++ b/rbf/rbf.go @@ -111,12 +111,15 @@ const ( ) var ( - ErrTxClosed = errors.New("transaction closed") - ErrTxNotWritable = errors.New("transaction not writable") - ErrBitmapNameRequired = errors.New("bitmap name required") - ErrBitmapNotFound = errors.New("bitmap not found") - ErrBitmapExists = errors.New("bitmap already exists") - ErrTxTooLarge = errors.New("rbf tx too large") + ErrTxClosed = errors.New("transaction closed") + ErrTxNotWritable = errors.New("transaction not writable") + ErrBitmapNameRequired = errors.New("bitmap name required") + ErrBitmapNotFound = errors.New("bitmap not found") + ErrBitmapExists = errors.New("bitmap already exists") + ErrTxTooLarge = errors.New("rbf tx too large") + ErrTxFailedToRemoveContainer = errors.New("rbf tx failed to remove container") + ErrTxFailedToPutContainer = errors.New("rbf tx failed to put container") + ErrTxFailedToRetrieveContainer = errors.New("rbf tx failed to put container") ) // Debug is just a temporary flag used for debugging. From 2711bf321fc1c60a0fac20a68bee8c7bc3876d97 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Fri, 12 Mar 2021 13:27:28 -0600 Subject: [PATCH 2/2] replace error with wrap --- rbf.go | 12 ++++++------ rbf/rbf.go | 15 ++++++--------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/rbf.go b/rbf.go index d4a3d357d..4da6341be 100644 --- a/rbf.go +++ b/rbf.go @@ -285,19 +285,19 @@ func (tx *RBFTx) addOrRemove(index, field, view string, shard uint64, batched, r if remove && (rc == nil || rc.N() == 0) { err = tx.RemoveContainer(index, field, view, shard, lastHi) if err != nil { - return 0, rbf.ErrTxFailedToRemoveContainer + return 0, errors.Wrap(err, "failed to remove container") } } else { err = tx.PutContainer(index, field, view, shard, lastHi, rc) if err != nil { - return 0, rbf.ErrTxFailedToPutContainer + return 0, errors.Wrap(err, "failed to put container") } } } // get the next container rc, err = tx.Container(index, field, view, shard, hi) if err != nil { - return 0, rbf.ErrTxFailedToRetrieveContainer + return 0, errors.Wrap(err, "failed to retrieve container") } } // else same container, keep adding bits to rct. chng := false @@ -318,12 +318,12 @@ func (tx *RBFTx) addOrRemove(index, field, view string, shard uint64, batched, r if rc == nil || rc.N() == 0 { err = tx.RemoveContainer(index, field, view, shard, hi) if err != nil { - return 0, rbf.ErrTxFailedToRemoveContainer + return 0, errors.Wrap(err, "failed to remove container") } } else { err = tx.PutContainer(index, field, view, shard, hi, rc) if err != nil { - return 0, rbf.ErrTxFailedToPutContainer + return 0, errors.Wrap(err, "failed to put container") } } } else { @@ -332,7 +332,7 @@ func (tx *RBFTx) addOrRemove(index, field, view string, shard uint64, batched, r } err = tx.PutContainer(index, field, view, shard, hi, rc) if err != nil { - return 0, rbf.ErrTxFailedToPutContainer + return 0, errors.Wrap(err, "failed to put container") } } return diff --git a/rbf/rbf.go b/rbf/rbf.go index 31d5a0f31..365907121 100644 --- a/rbf/rbf.go +++ b/rbf/rbf.go @@ -111,15 +111,12 @@ const ( ) var ( - ErrTxClosed = errors.New("transaction closed") - ErrTxNotWritable = errors.New("transaction not writable") - ErrBitmapNameRequired = errors.New("bitmap name required") - ErrBitmapNotFound = errors.New("bitmap not found") - ErrBitmapExists = errors.New("bitmap already exists") - ErrTxTooLarge = errors.New("rbf tx too large") - ErrTxFailedToRemoveContainer = errors.New("rbf tx failed to remove container") - ErrTxFailedToPutContainer = errors.New("rbf tx failed to put container") - ErrTxFailedToRetrieveContainer = errors.New("rbf tx failed to put container") + ErrTxClosed = errors.New("transaction closed") + ErrTxNotWritable = errors.New("transaction not writable") + ErrBitmapNameRequired = errors.New("bitmap name required") + ErrBitmapNotFound = errors.New("bitmap not found") + ErrBitmapExists = errors.New("bitmap already exists") + ErrTxTooLarge = errors.New("rbf tx too large") ) // Debug is just a temporary flag used for debugging.