// Write write needles, if key exists append to super block, then update // needle cache offset to new offset. func (v *Volume) Write(ns *needle.Needles) (err error) { var ( i int ok bool nc int64 ncs []int64 offset, ooffset uint32 n *needle.Needle now = time.Now().UnixNano() ) v.lock.Lock() offset = v.Block.Offset if err = v.Block.Write(ns.Buffer()); 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) v.addCheck(n.Key, n.Cookie) 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.asyncDel(ooffset) log.Warningf("same key: %d, old offset: %d, new offset: %d", n.Key, ooffset, offset) } atomic.AddUint64(&v.Stats.TotalWriteProcessed, 1) atomic.AddUint64(&v.Stats.TotalWriteBytes, uint64(n.TotalSize)) atomic.AddUint64(&v.Stats.TotalWriteDelay, uint64(time.Now().UnixNano()-now)) return }