Merge pull request #851 from abhinavdangeti/master
MB-28782: Error handling in merger/persister when index is closed
This commit is contained in:
commit
2384c41098
|
@ -17,7 +17,6 @@ package scorch
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
@ -59,6 +58,11 @@ OUTER:
|
||||||
// lets get started
|
// lets get started
|
||||||
err := s.planMergeAtSnapshot(ourSnapshot, mergePlannerOptions)
|
err := s.planMergeAtSnapshot(ourSnapshot, mergePlannerOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if err == ErrClosed {
|
||||||
|
// index has been closed
|
||||||
|
_ = ourSnapshot.DecRef()
|
||||||
|
break OUTER
|
||||||
|
}
|
||||||
s.fireAsyncError(fmt.Errorf("merging err: %v", err))
|
s.fireAsyncError(fmt.Errorf("merging err: %v", err))
|
||||||
_ = ourSnapshot.DecRef()
|
_ = ourSnapshot.DecRef()
|
||||||
atomic.AddUint64(&s.stats.TotFileMergeLoopErr, 1)
|
atomic.AddUint64(&s.stats.TotFileMergeLoopErr, 1)
|
||||||
|
@ -231,7 +235,7 @@ func (s *Scorch) planMergeAtSnapshot(ourSnapshot *IndexSnapshot,
|
||||||
select {
|
select {
|
||||||
case <-s.closeCh:
|
case <-s.closeCh:
|
||||||
_ = segment.Close()
|
_ = segment.Close()
|
||||||
return nil
|
return ErrClosed
|
||||||
case s.merges <- sm:
|
case s.merges <- sm:
|
||||||
atomic.AddUint64(&s.stats.TotFileMergeIntroductions, 1)
|
atomic.AddUint64(&s.stats.TotFileMergeIntroductions, 1)
|
||||||
}
|
}
|
||||||
|
@ -242,7 +246,7 @@ func (s *Scorch) planMergeAtSnapshot(ourSnapshot *IndexSnapshot,
|
||||||
for _, notification := range notifications {
|
for _, notification := range notifications {
|
||||||
select {
|
select {
|
||||||
case <-s.closeCh:
|
case <-s.closeCh:
|
||||||
return nil
|
return ErrClosed
|
||||||
case newSnapshot := <-notification:
|
case newSnapshot := <-notification:
|
||||||
atomic.AddUint64(&s.stats.TotFileMergeIntroductionsDone, 1)
|
atomic.AddUint64(&s.stats.TotFileMergeIntroductionsDone, 1)
|
||||||
if newSnapshot != nil {
|
if newSnapshot != nil {
|
||||||
|
@ -338,13 +342,13 @@ func (s *Scorch) mergeSegmentBases(snapshot *IndexSnapshot,
|
||||||
select { // send to introducer
|
select { // send to introducer
|
||||||
case <-s.closeCh:
|
case <-s.closeCh:
|
||||||
_ = segment.DecRef()
|
_ = segment.DecRef()
|
||||||
return 0, nil, 0, nil // TODO: return ErrInterruptedClosed?
|
return 0, nil, 0, ErrClosed
|
||||||
case s.merges <- sm:
|
case s.merges <- sm:
|
||||||
}
|
}
|
||||||
|
|
||||||
select { // wait for introduction to complete
|
select { // wait for introduction to complete
|
||||||
case <-s.closeCh:
|
case <-s.closeCh:
|
||||||
return 0, nil, 0, nil // TODO: return ErrInterruptedClosed?
|
return 0, nil, 0, ErrClosed
|
||||||
case newSnapshot := <-sm.notify:
|
case newSnapshot := <-sm.notify:
|
||||||
atomic.AddUint64(&s.stats.TotMemMergeSegments, uint64(len(sbs)))
|
atomic.AddUint64(&s.stats.TotMemMergeSegments, uint64(len(sbs)))
|
||||||
atomic.AddUint64(&s.stats.TotMemMergeDone, 1)
|
atomic.AddUint64(&s.stats.TotMemMergeDone, 1)
|
||||||
|
|
|
@ -94,6 +94,11 @@ OUTER:
|
||||||
close(ch)
|
close(ch)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if err == ErrClosed {
|
||||||
|
// index has been closed
|
||||||
|
_ = ourSnapshot.DecRef()
|
||||||
|
break OUTER
|
||||||
|
}
|
||||||
s.fireAsyncError(fmt.Errorf("got err persisting snapshot: %v", err))
|
s.fireAsyncError(fmt.Errorf("got err persisting snapshot: %v", err))
|
||||||
_ = ourSnapshot.DecRef()
|
_ = ourSnapshot.DecRef()
|
||||||
atomic.AddUint64(&s.stats.TotPersistLoopErr, 1)
|
atomic.AddUint64(&s.stats.TotPersistLoopErr, 1)
|
||||||
|
|
Loading…
Reference in New Issue