diff --git a/inmem/kv.go b/inmem/kv.go index 9c6548065e..ddc9e8b196 100644 --- a/inmem/kv.go +++ b/inmem/kv.go @@ -7,7 +7,6 @@ import ( "sync" "github.com/google/btree" - "github.com/influxdata/influxdb/kv" ) @@ -15,12 +14,14 @@ import ( type KVStore struct { mu sync.RWMutex buckets map[string]*Bucket + ro map[string]*bucket } // NewKVStore creates an instance of a KVStore. func NewKVStore() *KVStore { return &KVStore{ buckets: map[string]*Bucket{}, + ro: map[string]*bucket{}, } } @@ -30,6 +31,7 @@ func (s *KVStore) View(ctx context.Context, fn func(kv.Tx) error) error { defer s.mu.RUnlock() if s.buckets == nil { s.buckets = map[string]*Bucket{} + s.ro = map[string]*bucket{} } return fn(&Tx{ kv: s, @@ -44,6 +46,7 @@ func (s *KVStore) Update(ctx context.Context, fn func(kv.Tx) error) error { defer s.mu.Unlock() if s.buckets == nil { s.buckets = map[string]*Bucket{} + s.ro = map[string]*bucket{} } return fn(&Tx{ @@ -99,16 +102,11 @@ func (t *Tx) createBucketIfNotExists(b []byte) (kv.Bucket, error) { if !ok { bkt = &Bucket{btree.New(2)} t.kv.buckets[string(b)] = bkt - return &bucket{ - Bucket: bkt, - writable: t.writable, - }, nil + t.kv.ro[string(b)] = &bucket{Bucket: bkt} + return bkt, nil } - return &bucket{ - Bucket: bkt, - writable: t.writable, - }, nil + return bkt, nil } return nil, kv.ErrTxNotWritable @@ -121,10 +119,11 @@ func (t *Tx) Bucket(b []byte) (kv.Bucket, error) { return t.createBucketIfNotExists(b) } - return &bucket{ - Bucket: bkt, - writable: t.writable, - }, nil + if t.writable { + return bkt, nil + } + + return t.kv.ro[string(b)], nil } // Bucket is a btree that implements kv.Bucket. @@ -134,24 +133,17 @@ type Bucket struct { type bucket struct { kv.Bucket - writable bool } // Put wraps the put method of a kv bucket and ensures that the // bucket is writable. -func (b *bucket) Put(key, value []byte) error { - if b.writable { - return b.Bucket.Put(key, value) - } +func (b *bucket) Put(_, _ []byte) error { return kv.ErrTxNotWritable } // Delete wraps the delete method of a kv bucket and ensures that the // bucket is writable. -func (b *bucket) Delete(key []byte) error { - if b.writable { - return b.Bucket.Delete(key) - } +func (b *bucket) Delete(_ []byte) error { return kv.ErrTxNotWritable }