// Writes write needles, if key exists append to super block, then update // needle cache offset to new offset. func (v *Volume) Writes(ns *needle.Needles) (err error) { var ( i int ok bool nc int64 ncs []int64 offset uint32 ooffset uint32 n *needle.Needle now = time.Now().UnixNano() ) v.lock.Lock() offset = v.Block.Offset if err = v.Block.Writes(ns); err == nil { for i = 0; i < ns.Num; i++ { n = ns.Needle(i) if err = v.Indexer.Add(n.Key, offset, n.TotalSize); err != nil { break } if nc, ok = v.needles[n.Key]; ok { ncs = append(ncs, nc) } v.needles[n.Key] = needle.NewCache(offset, n.TotalSize) offset += n.IncrOffset if log.V(1) { log.Infof("add needle, offset: %d, size: %d", offset, n.TotalSize) log.Info(n) } } } v.lock.Unlock() if err != nil { return } for _, nc = range ncs { ooffset, _ = needle.Cache(nc) err = v.del(ooffset) log.Warningf("same key: %d, old offset: %d, new offset: %d", n.Key, ooffset, offset) } atomic.AddUint64(&v.Stats.TotalWriteProcessed, uint64(ns.Num)) atomic.AddUint64(&v.Stats.TotalWriteBytes, uint64(ns.TotalSize)) atomic.AddUint64(&v.Stats.TotalWriteDelay, uint64(time.Now().UnixNano()-now)) return }