func (t *BleveDestPartition) applyBatchLOCKED() error { err := cbgt.Timer(func() error { // At this point, there should be no other concurrent batch // activity on this BleveDestPartition (BDP) by design, since // a BDP represents a single vbucket. Since we don't want to // block stats gathering or readers trying to read // seqMax/seqMaxBatch/lastUUID, we unlock before entering the // (perhaps time consuming) t.bindex.Batch() operation. By // clearing the t.batch to nil, we can also detect concurrent // mutations that break this design assumption by seeing any // crashes that try to access a nil t.batch. batch := t.batch t.batch = nil t.m.Unlock() err := t.bindex.Batch(batch) t.m.Lock() return err }, t.bdest.stats.TimerBatchStore) if err != nil { return err } t.seqMaxBatch = t.seqMax for t.cwrQueue.Len() > 0 && t.cwrQueue[0].ConsistencySeq <= t.seqMaxBatch { cwr := heap.Pop(&t.cwrQueue).(*cbgt.ConsistencyWaitReq) if cwr != nil && cwr.DoneCh != nil { close(cwr.DoneCh) } } // TODO: Would be good to reuse batch's memory; but, would need // some public Reset() kind of method on bleve.Batch? t.batch = t.bindex.NewBatch() return nil }
func (t *BleveDestPartition) applyBatchUnlocked() error { err := cbgt.Timer(func() error { return t.bindex.Batch(t.batch) }, t.bdest.stats.TimerBatchStore) if err != nil { return err } t.seqMaxBatch = t.seqMax for t.cwrQueue.Len() > 0 && t.cwrQueue[0].ConsistencySeq <= t.seqMaxBatch { cwr := heap.Pop(&t.cwrQueue).(*cbgt.ConsistencyWaitReq) if cwr != nil && cwr.DoneCh != nil { close(cwr.DoneCh) } } // TODO: Would be good to reuse batch's memory; but, would need // some public Reset() kind of method on bleve.Batch? t.batch = t.bindex.NewBatch() return nil }