diff --git a/server/storage/mvcc/watchable_store.go b/server/storage/mvcc/watchable_store.go index c2a8832db..5a201d4ed 100644 --- a/server/storage/mvcc/watchable_store.go +++ b/server/storage/mvcc/watchable_store.go @@ -355,8 +355,11 @@ func (s *watchableStore) syncWatchers() int { tx := s.store.b.ReadTx() tx.RLock() revs, vs := tx.UnsafeRange(schema.Key, minBytes, maxBytes, 0) - tx.RUnlock() evs := kvsToEvents(s.store.lg, wg, revs, vs) + // Must unlock after kvsToEvents, because vs (come from boltdb memory) is not deep copy. + // We can only unlock after Unmarshal, which will do deep copy. + // Otherwise we will trigger SIGSEGV during boltdb re-mmap. + tx.RUnlock() victims := make(watcherBatch) wb := newWatcherBatch(wg, evs)