From 3da191852de9b0aa860532de7ec39256008d8252 Mon Sep 17 00:00:00 2001 From: Steve Yen Date: Thu, 1 Feb 2018 16:59:59 -0800 Subject: [PATCH] scorch zap tighten up prepareSegment()'s lock area --- index/scorch/scorch.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/index/scorch/scorch.go b/index/scorch/scorch.go index 31107765..08fffa25 100644 --- a/index/scorch/scorch.go +++ b/index/scorch/scorch.go @@ -310,17 +310,21 @@ func (s *Scorch) prepareSegment(newSegment segment.Segment, ids []string, introduction.persisted = make(chan error, 1) } - // get read lock, to optimistically prepare obsoleted info + // optimistically prepare obsoletes outside of rootLock s.rootLock.RLock() - for _, seg := range s.root.segment { + root := s.root + root.AddRef() + s.rootLock.RUnlock() + + for _, seg := range root.segment { delta, err := seg.segment.DocNumbers(ids) if err != nil { - s.rootLock.RUnlock() return err } introduction.obsoletes[seg.id] = delta } - s.rootLock.RUnlock() + + _ = root.DecRef() s.introductions <- introduction