func (h httpGetHandler) ServeHTTP(wr http.ResponseWriter, r *http.Request) { var ( now = time.Now() v *Volume n *needle.Needle err error vid, key, cookie int64 ret = http.StatusOK params = r.URL.Query() ) if r.Method != "GET" && r.Method != "HEAD" { ret = http.StatusMethodNotAllowed http.Error(wr, "method not allowed", ret) return } defer HttpGetWriter(r, wr, now, &err, &ret) if vid, err = strconv.ParseInt(params.Get("vid"), 10, 32); err != nil { log.Errorf("strconv.ParseInt(\"%s\") error(%v)", params.Get("vid"), err) ret = http.StatusBadRequest return } if key, err = strconv.ParseInt(params.Get("key"), 10, 64); err != nil { log.Errorf("strconv.ParseInt(\"%s\") error(%v)", params.Get("key"), err) ret = http.StatusBadRequest return } if cookie, err = strconv.ParseInt(params.Get("cookie"), 10, 32); err != nil { log.Errorf("strconv.ParseInt(\"%s\") error(%v)", params.Get("cookie"), err) ret = http.StatusBadRequest return } n = h.s.Needle() n.Key = key n.Cookie = int32(cookie) if v = h.s.Volumes[int32(vid)]; v != nil { if err = v.Get(n); err != nil { if err == errors.ErrNeedleDeleted || err == errors.ErrNeedleNotExist { ret = http.StatusNotFound } else { ret = http.StatusInternalServerError } } } else { ret = http.StatusNotFound err = errors.ErrVolumeNotExist } if err == nil { if r.Method == "GET" { if _, err = wr.Write(n.Data); err != nil { log.Errorf("wr.Write() error(%v)", err) ret = http.StatusInternalServerError } } if log.V(1) { log.Infof("get a needle: %v", n) } } h.s.FreeNeedle(n) return }
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) }