Partial Backport of #18415 Instead of using an asynchronous goroutine to push to disk on shutdown just close the datachan and immediately push to the disk. Prevents messages of incompletely flushed queues. Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
parent
86c3481eff
commit
382101ecc7
4 changed files with 12 additions and 12 deletions
|
@ -195,9 +195,11 @@ loop:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var errQueueEmpty = fmt.Errorf("empty queue")
|
var (
|
||||||
var errEmptyBytes = fmt.Errorf("empty bytes")
|
errQueueEmpty = fmt.Errorf("empty queue")
|
||||||
var errUnmarshal = fmt.Errorf("failed to unmarshal")
|
errEmptyBytes = fmt.Errorf("empty bytes")
|
||||||
|
errUnmarshal = fmt.Errorf("failed to unmarshal")
|
||||||
|
)
|
||||||
|
|
||||||
func (q *ByteFIFOQueue) doPop() error {
|
func (q *ByteFIFOQueue) doPop() error {
|
||||||
q.lock.Lock()
|
q.lock.Lock()
|
||||||
|
|
|
@ -251,8 +251,8 @@ func (q *PersistableChannelQueue) Shutdown() {
|
||||||
q.channelQueue.Wait()
|
q.channelQueue.Wait()
|
||||||
q.internal.(*LevelQueue).Wait()
|
q.internal.(*LevelQueue).Wait()
|
||||||
// Redirect all remaining data in the chan to the internal channel
|
// Redirect all remaining data in the chan to the internal channel
|
||||||
close(q.channelQueue.dataChan)
|
|
||||||
log.Trace("PersistableChannelQueue: %s Redirecting remaining data", q.delayedStarter.name)
|
log.Trace("PersistableChannelQueue: %s Redirecting remaining data", q.delayedStarter.name)
|
||||||
|
close(q.channelQueue.dataChan)
|
||||||
for data := range q.channelQueue.dataChan {
|
for data := range q.channelQueue.dataChan {
|
||||||
_ = q.internal.Push(data)
|
_ = q.internal.Push(data)
|
||||||
atomic.AddInt64(&q.channelQueue.numInQueue, -1)
|
atomic.AddInt64(&q.channelQueue.numInQueue, -1)
|
||||||
|
|
|
@ -188,5 +188,4 @@ func TestPersistableChannelQueue(t *testing.T) {
|
||||||
for _, callback := range callbacks {
|
for _, callback := range callbacks {
|
||||||
callback()
|
callback()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -238,13 +238,12 @@ func (q *PersistableChannelUniqueQueue) Shutdown() {
|
||||||
q.channelQueue.Wait()
|
q.channelQueue.Wait()
|
||||||
q.internal.(*LevelUniqueQueue).Wait()
|
q.internal.(*LevelUniqueQueue).Wait()
|
||||||
// Redirect all remaining data in the chan to the internal channel
|
// Redirect all remaining data in the chan to the internal channel
|
||||||
go func() {
|
close(q.channelQueue.dataChan)
|
||||||
log.Trace("PersistableChannelUniqueQueue: %s Redirecting remaining data", q.delayedStarter.name)
|
log.Trace("PersistableChannelUniqueQueue: %s Redirecting remaining data", q.delayedStarter.name)
|
||||||
for data := range q.channelQueue.dataChan {
|
for data := range q.channelQueue.dataChan {
|
||||||
_ = q.internal.Push(data)
|
_ = q.internal.Push(data)
|
||||||
}
|
}
|
||||||
log.Trace("PersistableChannelUniqueQueue: %s Done Redirecting remaining data", q.delayedStarter.name)
|
log.Trace("PersistableChannelUniqueQueue: %s Done Redirecting remaining data", q.delayedStarter.name)
|
||||||
}()
|
|
||||||
|
|
||||||
log.Debug("PersistableChannelUniqueQueue: %s Shutdown", q.delayedStarter.name)
|
log.Debug("PersistableChannelUniqueQueue: %s Shutdown", q.delayedStarter.name)
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue