0
0

added KVReader.MultiGet() method

This commit is contained in:
Steve Yen 2016-01-13 15:12:10 -08:00
parent 8dc067b1d9
commit fb048f6c64
8 changed files with 64 additions and 0 deletions

View File

@ -30,6 +30,10 @@ func (r *Reader) Get(key []byte) ([]byte, error) {
return rv, nil
}
func (r *Reader) MultiGet(keys [][]byte) ([][]byte, error) {
return store.MultiGet(r, keys)
}
func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator {
cursor := r.bucket.Cursor()

View File

@ -28,6 +28,10 @@ func (r *Reader) Get(key []byte) ([]byte, error) {
return b, err
}
func (r *Reader) MultiGet(keys [][]byte) ([][]byte, error) {
return store.MultiGet(r, keys)
}
func (r *Reader) PrefixIterator(prefix []byte) store.KVIterator {
byteRange := util.BytesPrefix(prefix)
iter := r.snapshot.NewIterator(byteRange, r.store.defaultReadOptions)

View File

@ -35,6 +35,10 @@ func (w *Reader) Get(k []byte) (v []byte, err error) {
return nil, nil
}
func (r *Reader) MultiGet(keys [][]byte) ([][]byte, error) {
return store.MultiGet(r, keys)
}
func (w *Reader) PrefixIterator(k []byte) store.KVIterator {
rv := Iterator{
t: w.t,

View File

@ -40,6 +40,9 @@ type KVReader interface {
// The caller owns the bytes returned.
Get(key []byte) ([]byte, error)
// MultiGet retrieves multiple values in one call.
MultiGet(keys [][]byte) ([][]byte, error)
// PrefixIterator returns a KVIterator that will
// visit all K/V pairs with the provided prefix
PrefixIterator(prefix []byte) KVIterator

View File

@ -17,6 +17,16 @@ func (r *Reader) Get(key []byte) (v []byte, err error) {
return
}
func (r *Reader) MultiGet(keys [][]byte) (vals [][]byte, err error) {
r.s.TimerReaderMultiGet.Time(func() {
vals, err = r.o.MultiGet(keys)
if err != nil {
r.s.AddError("Reader.MultiGet", err, nil)
}
})
return
}
func (r *Reader) PrefixIterator(prefix []byte) (i store.KVIterator) {
r.s.TimerReaderPrefixIterator.Time(func() {
i = &Iterator{s: r.s, o: r.o.PrefixIterator(prefix)}

View File

@ -33,6 +33,7 @@ type Store struct {
o store.KVStore
TimerReaderGet metrics.Timer
TimerReaderMultiGet metrics.Timer
TimerReaderPrefixIterator metrics.Timer
TimerReaderRangeIterator metrics.Timer
TimerWriterExecuteBatch metrics.Timer
@ -71,6 +72,7 @@ func New(mo store.MergeOperator, config map[string]interface{}) (store.KVStore,
o: kvs,
TimerReaderGet: metrics.NewTimer(),
TimerReaderMultiGet: metrics.NewTimer(),
TimerReaderPrefixIterator: metrics.NewTimer(),
TimerReaderRangeIterator: metrics.NewTimer(),
TimerWriterExecuteBatch: metrics.NewTimer(),
@ -141,6 +143,11 @@ func (s *Store) WriteJSON(w io.Writer) (err error) {
return
}
WriteTimerJSON(w, s.TimerReaderGet)
_, err = w.Write([]byte(`,"TimerReaderMultiGet":`))
if err != nil {
return
}
WriteTimerJSON(w, s.TimerReaderMultiGet)
_, err = w.Write([]byte(`,"TimerReaderPrefixIterator":`))
if err != nil {
return

28
index/store/multiget.go Normal file
View File

@ -0,0 +1,28 @@
// Copyright (c) 2016 Couchbase, Inc.
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed under the
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions
// and limitations under the License.
package store
// MultiGet is a helper function to retrieve mutiple keys from a
// KVReader, and might be used by KVStore implementations that don't
// have a native multi-get facility.
func MultiGet(kvreader KVReader, keys [][]byte) ([][]byte, error) {
vals := make([][]byte, 0, len(keys))
for i, key := range keys {
val, err := kvreader.Get(key)
if err != nil {
return nil, err
}
vals[i] = val
}
return vals, nil
}

View File

@ -40,6 +40,10 @@ func (r *reader) Get(key []byte) ([]byte, error) {
return nil, nil
}
func (r *reader) MultiGet(keys [][]byte) ([][]byte, error) {
return make([][]byte, len(keys)), nil
}
func (r *reader) PrefixIterator(prefix []byte) store.KVIterator {
return &iterator{}
}