From 1c0d4e848e00e783ea13166ab4a4cbded6ee6cb2 Mon Sep 17 00:00:00 2001 From: Raul Jordan Date: Fri, 25 May 2018 09:52:18 -0600 Subject: [PATCH] sharding: tests pass, services updated to include shardDB Former-commit-id: 8b8b695ddc0a39bfe6a536fd7b7f40d74c4105da [formerly 829d481af0eebd1647a34006018761e3e64c5e3e] Former-commit-id: 1d607fcb8fae1327c346bdf3557ec40a8816a09b --- sharding/database/database_test.go | 92 ++++++++++++++++++++++++++++++ sharding/notary/service.go | 3 +- sharding/proposer/service.go | 10 +++- 3 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 sharding/database/database_test.go diff --git a/sharding/database/database_test.go b/sharding/database/database_test.go new file mode 100644 index 0000000000..80e4409f6a --- /dev/null +++ b/sharding/database/database_test.go @@ -0,0 +1,92 @@ +package database + +import ( + "strconv" + "testing" +) + +var db ShardBackend + +func init() { + shardDB, err := NewShardDB("/tmp/datadir", "shardchaindata") + if err != nil { + panic(err) + } + db = shardDB +} + +// Testing the concurrency of the shardDB with multiple processes attempting to write. +func Test_DBConcurrent(t *testing.T) { + for i := 0; i < 100; i++ { + go func(val string) { + if err := db.Put([]byte("ralph merkle"), []byte(val)); err != nil { + t.Errorf("could not save value in db: %v", err) + } + }(strconv.Itoa(i)) + } +} + +func Test_DBPut(t *testing.T) { + if err := db.Put([]byte("ralph merkle"), []byte{1, 2, 3}); err != nil { + t.Errorf("could not save value in db: %v", err) + } +} + +func Test_DBHas(t *testing.T) { + key := []byte("ralph merkle") + + if err := db.Put(key, []byte{1, 2, 3}); err != nil { + t.Fatalf("could not save value in db: %v", err) + } + + has, err := db.Has(key) + if err != nil { + t.Errorf("could not check if db has key: %v", err) + } + if !has { + t.Errorf("db should have key: %v", key) + } + + key2 := []byte{} + has2, err := db.Has(key2) + if err != nil { + t.Errorf("could not check if db has key: %v", err) + } + if has2 { + t.Errorf("db should not have non-existent key: %v", key2) + } +} + +func Test_DBGet(t *testing.T) { + key := []byte("ralph merkle") + + if err := db.Put(key, []byte{1, 2, 3}); err != nil { + t.Fatalf("could not save value in db: %v", err) + } + + val, err := db.Get(key) + if err != nil { + t.Errorf("get failed: %v", err) + } + if len(val) == 0 { + t.Errorf("no value stored for key") + } + + key2 := []byte{} + val2, err := db.Get(key2) + if len(val2) != 0 { + t.Errorf("non-existent key should not have a value. key=%v, value=%v", key2, val2) + } +} + +func Test_DBDelete(t *testing.T) { + key := []byte("ralph merkle") + + if err := db.Put(key, []byte{1, 2, 3}); err != nil { + t.Fatalf("could not save value in db: %v", err) + } + + if err := db.Delete(key); err != nil { + t.Errorf("could not delete key: %v", key) + } +} diff --git a/sharding/notary/service.go b/sharding/notary/service.go index bbd5d00c43..bfd0e0f822 100644 --- a/sharding/notary/service.go +++ b/sharding/notary/service.go @@ -23,8 +23,7 @@ func NewNotary(node node.Node) (*Notary, error) { if err != nil { return nil, err } - // return &Notary{node, shardDB}, nil - return &Notary{node: node}, nil + return &Notary{node, shardDB}, nil } // Start the main routine for a notary. diff --git a/sharding/proposer/service.go b/sharding/proposer/service.go index afa490bbae..f1dd818283 100644 --- a/sharding/proposer/service.go +++ b/sharding/proposer/service.go @@ -2,6 +2,7 @@ package proposer import ( "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/sharding/database" "github.com/ethereum/go-ethereum/sharding/node" ) @@ -9,14 +10,19 @@ import ( // in a sharded system. Must satisfy the Service interface defined in // sharding/service.go. type Proposer struct { - node node.Node + node node.Node + shardDB database.ShardBackend } // NewProposer creates a struct instance. It is initialized and // registered as a service upon start of a sharding node. // Has access to the public methods of this node. func NewProposer(node node.Node) (*Proposer, error) { - return &Proposer{node}, nil + shardDB, err := database.NewShardDB(node.DataDirFlag(), "shardchaindata") + if err != nil { + return nil, err + } + return &Proposer{node, shardDB}, nil } // Start the main loop for proposing collations.