예제 #1
0
파일: volume.go 프로젝트: yonglehou/bfs
// 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
}