Commit if there is no error, rollback otherwise
This commit is contained in:
parent
ac49306077
commit
588f379962
|
@ -27,7 +27,7 @@ func (w *Writer) NewBatchEx(options store.KVBatchOptions) ([]byte, store.KVBatch
|
||||||
return make([]byte, options.TotalBytes), w.NewBatch(), nil
|
return make([]byte, options.TotalBytes), w.NewBatch(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) ExecuteBatch(batch store.KVBatch) error {
|
func (w *Writer) ExecuteBatch(batch store.KVBatch) (err error) {
|
||||||
|
|
||||||
emulatedBatch, ok := batch.(*store.EmulatedBatch)
|
emulatedBatch, ok := batch.(*store.EmulatedBatch)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -36,10 +36,23 @@ func (w *Writer) ExecuteBatch(batch store.KVBatch) error {
|
||||||
|
|
||||||
tx, err := w.store.db.Begin(true)
|
tx, err := w.store.db.Begin(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
|
// defer function to ensure that once started,
|
||||||
|
// we either Commit tx or Rollback
|
||||||
|
defer func() {
|
||||||
|
// if nothing went wrong, commit
|
||||||
|
if err == nil {
|
||||||
|
// careful to catch error here too
|
||||||
|
err = tx.Commit()
|
||||||
|
} else {
|
||||||
|
// caller should see error that caused abort,
|
||||||
|
// not success or failure of Rollback itself
|
||||||
|
tx.Rollback()
|
||||||
|
}
|
||||||
|
}()
|
||||||
defer tx.Rollback()
|
defer tx.Rollback()
|
||||||
|
|
||||||
bucket := tx.Bucket([]byte(w.store.bucket))
|
bucket := tx.Bucket([]byte(w.store.bucket))
|
||||||
bucket.FillPercent = w.store.fillPercent
|
bucket.FillPercent = w.store.fillPercent
|
||||||
|
|
||||||
|
@ -48,29 +61,29 @@ func (w *Writer) ExecuteBatch(batch store.KVBatch) error {
|
||||||
existingVal := bucket.Get(kb)
|
existingVal := bucket.Get(kb)
|
||||||
mergedVal, fullMergeOk := w.store.mo.FullMerge(kb, existingVal, mergeOps)
|
mergedVal, fullMergeOk := w.store.mo.FullMerge(kb, existingVal, mergeOps)
|
||||||
if !fullMergeOk {
|
if !fullMergeOk {
|
||||||
return fmt.Errorf("merge operator returned failure")
|
err = fmt.Errorf("merge operator returned failure")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
err = bucket.Put(kb, mergedVal)
|
err = bucket.Put(kb, mergedVal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, op := range emulatedBatch.Ops {
|
for _, op := range emulatedBatch.Ops {
|
||||||
if op.V != nil {
|
if op.V != nil {
|
||||||
err := bucket.Put(op.K, op.V)
|
err = bucket.Put(op.K, op.V)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err := bucket.Delete(op.K)
|
err = bucket.Delete(op.K)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return
|
||||||
return tx.Commit()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) Close() error {
|
func (w *Writer) Close() error {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user