Skip to content

Commit f7f7dcd

Browse files
authored
Fix error handling (treeverse#1247)
1 parent 35edb58 commit f7f7dcd

File tree

4 files changed

+37
-11
lines changed

4 files changed

+37
-11
lines changed

api/api_controller.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -748,19 +748,21 @@ func (c *Controller) MergeMergeIntoBranchHandler() refs.MergeIntoBranchHandler {
748748
message,
749749
metadata)
750750

751-
switch err {
752-
case nil:
751+
switch {
752+
case err == nil:
753753
payload := newMergeResultFromCatalog(res)
754754
return refs.NewMergeIntoBranchOK().WithPayload(payload)
755-
case catalog.ErrUnsupportedRelation:
755+
case errors.Is(err, catalog.ErrUnsupportedRelation):
756756
return refs.NewMergeIntoBranchDefault(http.StatusInternalServerError).WithPayload(responseError("branches have no common base"))
757-
case catalog.ErrBranchNotFound:
757+
case errors.Is(err, catalog.ErrBranchNotFound) || errors.Is(err, graveler.ErrBranchNotFound):
758758
return refs.NewMergeIntoBranchDefault(http.StatusInternalServerError).WithPayload(responseError("a branch does not exist "))
759-
case catalog.ErrConflictFound:
759+
case errors.Is(err, catalog.ErrConflictFound) || errors.Is(err, graveler.ErrConflictFound):
760760
payload := newMergeResultFromCatalog(res)
761761
return refs.NewMergeIntoBranchConflict().WithPayload(payload)
762-
case catalog.ErrNoDifferenceWasFound:
762+
case errors.Is(err, catalog.ErrNoDifferenceWasFound):
763763
return refs.NewMergeIntoBranchDefault(http.StatusInternalServerError).WithPayload(responseError("no difference was found"))
764+
case errors.Is(err, graveler.ErrLockNotAcquired):
765+
return refs.NewMergeIntoBranchDefault(http.StatusInternalServerError).WithPayload(responseError("branch is currently locked, try again later"))
764766
default:
765767
return refs.NewMergeIntoBranchDefault(http.StatusInternalServerError).WithPayload(responseError("internal error"))
766768
}

graveler/committed/apply.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ func Apply(ctx context.Context, writer MetaRangeWriter, source Iterator, diffs g
7171
haveSource = source.Next()
7272
}
7373
}
74+
if err := source.Err(); err != nil {
75+
return err
76+
}
77+
if err := diffs.Err(); err != nil {
78+
return err
79+
}
7480
for haveSource {
7581
sourceValue, sourceRange := source.Value()
7682
if sourceValue == nil {
@@ -94,6 +100,9 @@ func Apply(ctx context.Context, writer MetaRangeWriter, source Iterator, diffs g
94100
haveSource = source.Next()
95101
}
96102
}
103+
if err := source.Err(); err != nil {
104+
return err
105+
}
97106
for haveDiffs {
98107
diffValue := diffs.Value()
99108
haveDiffs = diffs.Next()
@@ -112,5 +121,5 @@ func Apply(ctx context.Context, writer MetaRangeWriter, source Iterator, diffs g
112121
return fmt.Errorf("write added record: %w", err)
113122
}
114123
}
115-
return nil
124+
return diffs.Err()
116125
}

graveler/committed/iterator.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ func (rvi *iterator) NextRange() bool {
6767
}
6868

6969
func (rvi *iterator) Next() bool {
70+
if rvi.err != nil {
71+
return false
72+
}
7073
if !rvi.started {
7174
rvi.started = true
7275
return rvi.NextRange()

graveler/committed/merge_iterator.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,31 @@ func NewMergeIterator(diffTheirsToOurs graveler.DiffIterator, base Iterator) (*m
2121
return &mergeIterator{diffIt: diffTheirsToOurs, base: base}, nil
2222
}
2323

24-
func (d *mergeIterator) valueFromBase(key graveler.Key) *graveler.ValueRecord {
24+
func (d *mergeIterator) valueFromBase(key graveler.Key) (*graveler.ValueRecord, error) {
2525
d.base.SeekGE(key)
2626
var val *graveler.ValueRecord
2727
for d.base.Next() && val == nil {
2828
val, _ = d.base.Value()
2929
}
30+
if err := d.base.Err(); err != nil {
31+
return nil, err
32+
}
3033
if val == nil || !bytes.Equal(val.Key, key) {
31-
return nil
34+
return nil, nil
3235
}
33-
return val
36+
return val, nil
3437
}
3538

3639
func (d *mergeIterator) Next() bool {
3740
for d.diffIt.Next() {
3841
val := d.diffIt.Value()
3942
key := val.Key
4043
typ := val.Type
41-
baseVal := d.valueFromBase(key)
44+
baseVal, err := d.valueFromBase(key)
45+
if err != nil {
46+
d.err = err
47+
return false
48+
}
4249
switch typ {
4350
case graveler.DiffTypeAdded:
4451
// exists on ours, but not on theirs
@@ -87,10 +94,12 @@ func (d *mergeIterator) Next() bool {
8794
}
8895
// changed on theirs, removed on ours
8996
d.err = graveler.ErrConflictFound
97+
return false
9098
}
9199
// added on theirs, but not on ours - continue
92100
}
93101
}
102+
d.err = d.diffIt.Err()
94103
return false
95104
}
96105

@@ -101,6 +110,9 @@ func (d *mergeIterator) SeekGE(id graveler.Key) {
101110
}
102111

103112
func (d *mergeIterator) Value() *graveler.ValueRecord {
113+
if d.err != nil {
114+
return nil
115+
}
104116
return d.val
105117
}
106118

0 commit comments

Comments
 (0)