func (l *List) merge() (merged bool, rerr error) { l.wg.Wait() l.Lock() defer l.Unlock() if len(l.mindex)+len(l.mlayer) == 0 { atomic.StoreInt64(&l.dirtyTs, 0) return false, nil } var p types.Posting sz := l.length() b := flatbuffers.NewBuilder(0) offsets := make([]flatbuffers.UOffsetT, sz) for i := 0; i < sz; i++ { if ok := l.get(&p, i); !ok { glog.WithField("idx", i).Fatal("Unable to parse posting.") } offsets[i] = addPosting(b, p) } types.PostingListStartPostingsVector(b, sz) for i := len(offsets) - 1; i >= 0; i-- { b.PrependUOffsetT(offsets[i]) } vend := b.EndVector(sz) types.PostingListStart(b) types.PostingListAddPostings(b, vend) types.PostingListAddCommitTs(b, l.maxMutationTs) end := types.PostingListEnd(b) b.Finish(end) if err := l.pstore.SetOne(l.key, b.Bytes[b.Head():]); err != nil { glog.WithField("error", err).Fatal("While storing posting list") return true, err } // Now reset the mutation variables. atomic.StorePointer(&l.pbuffer, nil) // Make prev buffer eligible for GC. atomic.StoreInt64(&l.dirtyTs, 0) // Set as clean. l.lastCompact = time.Now() l.mlayer = make(map[int]types.Posting) l.mdelta = 0 l.mindex = nil return true, nil }
// package level init func init() { { b := flatbuffers.NewBuilder(0) types.PostingListStart(b) of := types.PostingListEnd(b) b.Finish(of) empty = b.Bytes[b.Head():] } { b := flatbuffers.NewBuilder(0) types.PostingStart(b) types.PostingAddUid(b, 0) of := types.PostingEnd(b) b.Finish(of) emptyPosting = b.Bytes[b.Head():] } glog.Infof("Empty size: [%d] EmptyPosting size: [%d]", len(empty), len(emptyPosting)) }