func BenchmarkVolumeWrite(b *testing.B) { var ( v *Volume err error file = "./test/testb2" ifile = "./test/testb2.idx" data = make([]byte, _16kb) // 16kb ) os.Remove(file) os.Remove(ifile) defer os.Remove(file) defer os.Remove(ifile) if _, err = rand.Read(data); err != nil { b.Errorf("rand.Read() error(%v)", err) b.FailNow() } if v, err = NewVolume(1, file, ifile, testConf); err != nil { b.Errorf("NewVolume() error(%v)", err) b.FailNow() } defer v.Close() b.SetParallelism(8) b.ResetTimer() b.RunParallel(func(pb *testing.PB) { var ( i, j int ts int32 t int64 err1 error n *needle.Needle ns = make([]needle.Needle, 9) buf = make([]byte, 163840) // 16kb ) for i = 0; i < 9; i++ { t = mrand.Int63() n = &ns[i] n.Init(t, 1, data) n.Write(buf[ts:]) ts += n.TotalSize } for pb.Next() { for j = 0; j < 9; j++ { t = mrand.Int63() n = &ns[j] n.Key = t binary.BigEndian.PutInt64(buf[n.TotalSize+needle.KeyOffset:], n.Key) } if err1 = v.Write(ns, buf[:ts]); err1 != nil { b.Errorf("Add() error(%v)", err1) v.Unlock() b.FailNow() } b.SetBytes(int64(ts)) } }) os.Remove(file) os.Remove(ifile) }
// Write start add needles to the block, must called after start a transaction. func (b *SuperBlock) Write(n *needle.Needle) (err error) { if b.LastErr != nil { return b.LastErr } var incrOffset = needle.NeedleOffset(int64(n.TotalSize)) if err = b.available(incrOffset); err != nil { return } if err = n.Write(b.bw); err != nil { b.LastErr = err return } b.Offset += incrOffset return }