Skip to content
This repository has been archived by the owner on Aug 2, 2021. It is now read-only.

DB Store Abstractions #993

Closed
wants to merge 17 commits into from
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 30 additions & 10 deletions swarm/shed/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,23 +71,39 @@ func NewDB(path string) (db *DB, err error) {

// Put wraps LevelDB Put method to increment metrics counter.
func (db *DB) Put(key []byte, value []byte) (err error) {
err = db.ldb.Put(key, value, nil)
if err != nil {
metrics.GetOrRegisterCounter("DB.putFail", nil).Inc(1)
return err
}
metrics.GetOrRegisterCounter("DB.put", nil).Inc(1)

return db.ldb.Put(key, value, nil)
return nil
}

// Get wraps LevelDB Get method to increment metrics counter.
func (db *DB) Get(key []byte) (value []byte, err error) {
value, err = db.ldb.Get(key, nil)
if err != nil {
if err == leveldb.ErrNotFound {
metrics.GetOrRegisterCounter("DB.getNotFound", nil).Inc(1)
} else {
metrics.GetOrRegisterCounter("DB.getFail", nil).Inc(1)
}
return nil, err
}
metrics.GetOrRegisterCounter("DB.get", nil).Inc(1)

return db.ldb.Get(key, nil)
return value, nil
}

// Delete wraps LevelDB Delete method to increment metrics counter.
func (db *DB) Delete(key []byte) error {
func (db *DB) Delete(key []byte) (err error) {
err = db.ldb.Delete(key, nil)
if err != nil {
metrics.GetOrRegisterCounter("DB.deleteFail", nil).Inc(1)
return err
}
metrics.GetOrRegisterCounter("DB.delete", nil).Inc(1)

return db.ldb.Delete(key, nil)
return nil
}

// NewIterator wraps LevelDB NewIterator method to increment metrics counter.
Expand All @@ -98,10 +114,14 @@ func (db *DB) NewIterator() iterator.Iterator {
}

// WriteBatch wraps LevelDB Write method to increment metrics counter.
func (db *DB) WriteBatch(batch *leveldb.Batch) error {
func (db *DB) WriteBatch(batch *leveldb.Batch) (err error) {
err = db.ldb.Write(batch, nil)
if err != nil {
metrics.GetOrRegisterCounter("DB.writebatchFail", nil).Inc(1)
return err
}
metrics.GetOrRegisterCounter("DB.writebatch", nil).Inc(1)

return db.ldb.Write(batch, nil)
return nil
}

// Close closes LevelDB database.
Expand Down
5 changes: 3 additions & 2 deletions swarm/shed/example_store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,8 @@ func (s *Store) PutSchema(name string) (err error) {
}

// Close closes the underlying database.
func (s *Store) Close() {
s.db.Close()
func (s *Store) Close() error {
return s.db.Close()
}

// Example_store constructs a simple storage implementation using shed package.
Expand All @@ -313,6 +313,7 @@ func Example_store() {
if err != nil {
log.Fatal(err)
}
defer s.Close()

ch := storage.GenerateRandomChunk(1024)
err = s.Put(context.Background(), ch)
Expand Down
2 changes: 1 addition & 1 deletion swarm/shed/field_string.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type StringField struct {
key []byte
}

// NewStringField retruns a new Instance fo StringField.
// NewStringField retruns a new Instance of StringField.
// It validates its name and type against the database schema.
func (db *DB) NewStringField(name string) (f StringField, err error) {
key, err := db.schemaFieldKey(name, "string")
Expand Down
4 changes: 2 additions & 2 deletions swarm/shed/field_struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ func (db *DB) NewStructField(name string) (f StructField, err error) {
}, nil
}

// Unmarshal unmarshals data fromt he database to a provided val.
// Get unmarshals data from the database to a provided val.
// If the data is not found leveldb.ErrNotFound is returned.
func (f StructField) Unmarshal(val interface{}) (err error) {
func (f StructField) Get(val interface{}) (err error) {
b, err := f.db.Get(f.key)
if err != nil {
return err
Expand Down
14 changes: 7 additions & 7 deletions swarm/shed/field_struct_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (
"github.com/syndtr/goleveldb/leveldb"
)

// TestStructField validates put and unmarshal operations
// TestStructField validates put and get operations
// of the StructField.
func TestStructField(t *testing.T) {
db, cleanupFunc := newTestDB(t)
Expand All @@ -37,9 +37,9 @@ func TestStructField(t *testing.T) {
A string
}

t.Run("unmarshal empty", func(t *testing.T) {
t.Run("get empty", func(t *testing.T) {
var s complexStructure
err := complexField.Unmarshal(&s)
err := complexField.Get(&s)
if err != leveldb.ErrNotFound {
t.Fatalf("got error %v, want %v", err, leveldb.ErrNotFound)
}
Expand All @@ -58,7 +58,7 @@ func TestStructField(t *testing.T) {
t.Fatal(err)
}
var got complexStructure
err = complexField.Unmarshal(&got)
err = complexField.Get(&got)
if err != nil {
t.Fatal(err)
}
Expand All @@ -75,7 +75,7 @@ func TestStructField(t *testing.T) {
t.Fatal(err)
}
var got complexStructure
err = complexField.Unmarshal(&got)
err = complexField.Get(&got)
if err != nil {
t.Fatal(err)
}
Expand All @@ -96,7 +96,7 @@ func TestStructField(t *testing.T) {
t.Fatal(err)
}
var got complexStructure
err := complexField.Unmarshal(&got)
err := complexField.Get(&got)
if err != nil {
t.Fatal(err)
}
Expand All @@ -115,7 +115,7 @@ func TestStructField(t *testing.T) {
t.Fatal(err)
}
var got complexStructure
err := complexField.Unmarshal(&got)
err := complexField.Get(&got)
if err != nil {
t.Fatal(err)
}
Expand Down
18 changes: 6 additions & 12 deletions swarm/shed/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,12 @@ type IndexItem struct {
Data []byte
AccessTimestamp int64
StoreTimestamp int64
// UseMockStore is a pointer to identify
// an unset state of the field in Join function.
UseMockStore *bool
}

// Join is a helper method to construct a new
// Merge is a helper method to construct a new
// IndexItem by filling up fields with default values
// of a particular IndexItem with values from another one.
func (i IndexItem) Join(i2 IndexItem) (new IndexItem) {
func (i IndexItem) Merge(i2 IndexItem) (new IndexItem) {
if i.Address == nil {
i.Address = i2.Address
}
Expand All @@ -58,9 +55,6 @@ func (i IndexItem) Join(i2 IndexItem) (new IndexItem) {
if i.StoreTimestamp == 0 {
i.StoreTimestamp = i2.StoreTimestamp
}
if i.UseMockStore == nil {
i.UseMockStore = i2.UseMockStore
}
return i
}

Expand Down Expand Up @@ -139,7 +133,7 @@ func (f Index) Get(keyFields IndexItem) (out IndexItem, err error) {
if err != nil {
return out, err
}
return out.Join(keyFields), nil
return out.Merge(keyFields), nil
}

// Put accepts IndexItem to encode information from it
Expand Down Expand Up @@ -173,7 +167,7 @@ func (f Index) PutInBatch(batch *leveldb.Batch, i IndexItem) (err error) {
}

// Delete accepts IndexItem to remove a key/value pair
// form the database based on its fields.
// from the database based on its fields.
func (f Index) Delete(keyFields IndexItem) (err error) {
key, err := f.encodeKeyFunc(keyFields)
if err != nil {
Expand Down Expand Up @@ -218,7 +212,7 @@ func (f Index) IterateAll(fn IndexIterFunc) (err error) {
if err != nil {
return err
}
stop, err := fn(keyIndexItem.Join(valueIndexItem))
stop, err := fn(keyIndexItem.Merge(valueIndexItem))
if err != nil {
return err
}
Expand Down Expand Up @@ -252,7 +246,7 @@ func (f Index) IterateFrom(start IndexItem, fn IndexIterFunc) (err error) {
if err != nil {
return err
}
stop, err := fn(keyIndexItem.Join(valueIndexItem))
stop, err := fn(keyIndexItem.Merge(valueIndexItem))
if err != nil {
return err
}
Expand Down
4 changes: 2 additions & 2 deletions swarm/shed/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ type indexSpec struct {
// a particular field form the schema definition.
func (db *DB) schemaFieldKey(name, fieldType string) (key []byte, err error) {
if name == "" {
return nil, errors.New("filed name can not be blank")
return nil, errors.New("field name can not be blank")
}
if fieldType == "" {
return nil, errors.New("filed type can not be blank")
return nil, errors.New("field type can not be blank")
}
s, err := db.getSchema()
if err != nil {
Expand Down