mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	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:
		@@ -195,9 +195,11 @@ loop:
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var errQueueEmpty = fmt.Errorf("empty queue")
 | 
			
		||||
var errEmptyBytes = fmt.Errorf("empty bytes")
 | 
			
		||||
var errUnmarshal = fmt.Errorf("failed to unmarshal")
 | 
			
		||||
var (
 | 
			
		||||
	errQueueEmpty = fmt.Errorf("empty queue")
 | 
			
		||||
	errEmptyBytes = fmt.Errorf("empty bytes")
 | 
			
		||||
	errUnmarshal  = fmt.Errorf("failed to unmarshal")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func (q *ByteFIFOQueue) doPop() error {
 | 
			
		||||
	q.lock.Lock()
 | 
			
		||||
 
 | 
			
		||||
@@ -251,8 +251,8 @@ func (q *PersistableChannelQueue) Shutdown() {
 | 
			
		||||
	q.channelQueue.Wait()
 | 
			
		||||
	q.internal.(*LevelQueue).Wait()
 | 
			
		||||
	// 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)
 | 
			
		||||
	close(q.channelQueue.dataChan)
 | 
			
		||||
	for data := range q.channelQueue.dataChan {
 | 
			
		||||
		_ = q.internal.Push(data)
 | 
			
		||||
		atomic.AddInt64(&q.channelQueue.numInQueue, -1)
 | 
			
		||||
 
 | 
			
		||||
@@ -188,5 +188,4 @@ func TestPersistableChannelQueue(t *testing.T) {
 | 
			
		||||
	for _, callback := range callbacks {
 | 
			
		||||
		callback()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -238,13 +238,12 @@ func (q *PersistableChannelUniqueQueue) Shutdown() {
 | 
			
		||||
	q.channelQueue.Wait()
 | 
			
		||||
	q.internal.(*LevelUniqueQueue).Wait()
 | 
			
		||||
	// Redirect all remaining data in the chan to the internal channel
 | 
			
		||||
	go func() {
 | 
			
		||||
		log.Trace("PersistableChannelUniqueQueue: %s Redirecting remaining data", q.delayedStarter.name)
 | 
			
		||||
		for data := range q.channelQueue.dataChan {
 | 
			
		||||
			_ = q.internal.Push(data)
 | 
			
		||||
		}
 | 
			
		||||
		log.Trace("PersistableChannelUniqueQueue: %s Done Redirecting remaining data", q.delayedStarter.name)
 | 
			
		||||
	}()
 | 
			
		||||
	close(q.channelQueue.dataChan)
 | 
			
		||||
	log.Trace("PersistableChannelUniqueQueue: %s Redirecting remaining data", q.delayedStarter.name)
 | 
			
		||||
	for data := range q.channelQueue.dataChan {
 | 
			
		||||
		_ = q.internal.Push(data)
 | 
			
		||||
	}
 | 
			
		||||
	log.Trace("PersistableChannelUniqueQueue: %s Done Redirecting remaining data", q.delayedStarter.name)
 | 
			
		||||
 | 
			
		||||
	log.Debug("PersistableChannelUniqueQueue: %s Shutdown", q.delayedStarter.name)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user