0
0
Fork 0

Merge pull request #851 from abhinavdangeti/master

MB-28782: Error handling in merger/persister when index is closed
This commit is contained in:
Abhinav Dangeti 2018-03-22 18:07:11 -07:00 committed by GitHub
commit 2384c41098
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 5 deletions

View File

@ -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)

View File

@ -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)