Skip to content
Snippets Groups Projects
Commit 22f3c402 authored by Pavel Antonov's avatar Pavel Antonov :asterisk:
Browse files

Merge branch 'fix/PRXS-2576-FixBufferedWriteSyncerDeadlock' into 'master'

Исправлен deadlock при одновременном вызове BufferedWriteSyncer.Stop и синхронизации по интервалу

See merge request perxis/perxis-go!241
parents 5ea87dc9 3b823ed0
No related branches found
No related tags found
No related merge requests found
......@@ -71,28 +71,40 @@ func (ws *BufferedWriteSyncer) start() {
ws.buffer = make([]*logs.Entry, 0, ws.MaxBufferSize)
ws.syncQueue = make(chan []*logs.Entry, ws.MaxSyncQueueSize)
ws.flushStop = make(chan struct{})
ws.started = true
ws.wg.Add(2)
go ws.syncLoop()
go ws.flushLoop()
ws.started = true
}
// Stop останавливает все фоновые работы и синхронизирует оставшиеся записи
func (ws *BufferedWriteSyncer) Stop() error {
ws.mu.Lock()
defer ws.mu.Unlock()
// Создаем новую область видимости для блокировки мьютекса только в указанной секции
// Это необходимо, чтобы предотвратить возможный deadlock, который может возникнуть
// если после блокировки мьютекса при остановке будет вызван Sync внутри flushLoop(),
// который будет ожидать освобождения мьютекса
stopped, err := func() (bool, error) {
ws.mu.Lock()
defer ws.mu.Unlock()
if !ws.started || ws.stopped {
return false, nil
}
ws.stopped = true
if !ws.started || ws.stopped {
return nil
}
ws.stopped = true
close(ws.flushStop) // завершаем flushLoop
err := ws.flush() // очищаем оставшиеся записи
close(ws.flushStop) // завершаем flushLoop
close(ws.syncQueue) // завершаем syncLoop
err := ws.flush() // очищаем оставшиеся записи
return true, err
}()
close(ws.syncQueue) // завершаем syncLoop
if !stopped {
return nil
}
ws.wg.Wait() // дожидаемся завершения flushLoop и syncLoop
......@@ -127,7 +139,7 @@ func (ws *BufferedWriteSyncer) Sync() error {
ws.mu.Lock()
defer ws.mu.Unlock()
if ws.started {
if ws.started && !ws.stopped {
return ws.flush()
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment