From ca76d4cfffdb072f81c0f99cb475551afc59f129 Mon Sep 17 00:00:00 2001 From: Cody Littley Date: Fri, 4 Oct 2024 08:41:19 -0500 Subject: [PATCH] Made suggested changes. Signed-off-by: Cody Littley --- common/kvstore/tablestore/table_store_test.go | 28 +++++++------- .../kvstore/tablestore/table_store_wrapper.go | 37 ++++++++++++++++++- common/kvstore/tablestore/table_view.go | 6 +-- common/kvstore/test/store_test.go | 13 ++----- 4 files changed, 56 insertions(+), 28 deletions(-) diff --git a/common/kvstore/tablestore/table_store_test.go b/common/kvstore/tablestore/table_store_test.go index c1080d4ae..df81ee3d8 100644 --- a/common/kvstore/tablestore/table_store_test.go +++ b/common/kvstore/tablestore/table_store_test.go @@ -34,7 +34,7 @@ func TestTableCount(t *testing.T) { assert.NoError(t, err) base := mapstore.NewStore() - store, err := Wrapper(logger, base) + store, err := wrapper(logger, base) assert.NoError(t, err) // table count needs to fit into 32 bytes, and two tables are reserved for internal use @@ -69,7 +69,7 @@ func TestTableList(t *testing.T) { base, err := leveldb.NewStore(logger, dbPath) assert.NoError(t, err) - store, err := Wrapper(logger, base) + store, err := wrapper(logger, base) assert.NoError(t, err) tables := store.GetTables() @@ -123,7 +123,7 @@ func TestTableList(t *testing.T) { base, err = leveldb.NewStore(logger, dbPath) assert.NoError(t, err) - store, err = Wrapper(logger, base) + store, err = wrapper(logger, base) assert.NoError(t, err) tables = store.GetTables() @@ -152,7 +152,7 @@ func TestTableList(t *testing.T) { base, err = leveldb.NewStore(logger, dbPath) assert.NoError(t, err) - store, err = Wrapper(logger, base) + store, err = wrapper(logger, base) assert.NoError(t, err) tables = store.GetTables() @@ -196,7 +196,7 @@ func TestUniqueKeySpace(t *testing.T) { assert.NoError(t, err) base := mapstore.NewStore() - store, err := Wrapper(logger, base) + store, err := wrapper(logger, base) assert.NoError(t, err) table1, err := store.GetTable("table1") @@ -237,7 +237,7 @@ func TestBatchOperations(t *testing.T) { assert.NoError(t, err) base := mapstore.NewStore() - store, err := Wrapper(logger, base) + store, err := wrapper(logger, base) assert.NoError(t, err) table1, err := store.GetTable("table1") @@ -413,7 +413,7 @@ func TestDropTable(t *testing.T) { assert.NoError(t, err) base := mapstore.NewStore() - store, err := Wrapper(logger, base) + store, err := wrapper(logger, base) assert.NoError(t, err) table1, err := store.GetTable("table1") @@ -530,7 +530,7 @@ func TestIteration(t *testing.T) { assert.NoError(t, err) base := mapstore.NewStore() - store, err := Wrapper(logger, base) + store, err := wrapper(logger, base) assert.NoError(t, err) table1, err := store.GetTable("table1") @@ -685,7 +685,7 @@ func TestRestart(t *testing.T) { base, err := leveldb.NewStore(logger, dbPath) assert.NoError(t, err) - store, err := Wrapper(logger, base) + store, err := wrapper(logger, base) assert.NoError(t, err) table1, err := store.GetTable("table1") @@ -716,7 +716,7 @@ func TestRestart(t *testing.T) { base, err = leveldb.NewStore(logger, dbPath) assert.NoError(t, err) - store, err = Wrapper(logger, base) + store, err = wrapper(logger, base) assert.NoError(t, err) table1, err = store.GetTable("table1") @@ -765,7 +765,7 @@ func TestRandomOperations(t *testing.T) { base, err := leveldb.NewStore(logger, dbPath) assert.NoError(t, err) - store, err := Wrapper(logger, base) + store, err := wrapper(logger, base) assert.NoError(t, err) tables := make(map[string]kvstore.Table) @@ -782,7 +782,7 @@ func TestRandomOperations(t *testing.T) { base, err = leveldb.NewStore(logger, dbPath) assert.NoError(t, err) - store, err = Wrapper(logger, base) + store, err = wrapper(logger, base) assert.NoError(t, err) for tableName := range tables { @@ -929,7 +929,7 @@ func TestInterruptedTableDeletion(t *testing.T) { deletionsRemaining: 50, } - store, err := Wrapper(logger, explodingBase) + store, err := wrapper(logger, explodingBase) assert.NoError(t, err) // Create a few tables @@ -964,7 +964,7 @@ func TestInterruptedTableDeletion(t *testing.T) { // Restart the store. The table should be gone by the time the method returns. base, err = leveldb.NewStore(logger, dbPath) assert.NoError(t, err) - store, err = Wrapper(logger, base) + store, err = wrapper(logger, base) assert.NoError(t, err) tables := store.GetTables() diff --git a/common/kvstore/tablestore/table_store_wrapper.go b/common/kvstore/tablestore/table_store_wrapper.go index e96fbf16d..0cff89999 100644 --- a/common/kvstore/tablestore/table_store_wrapper.go +++ b/common/kvstore/tablestore/table_store_wrapper.go @@ -5,6 +5,8 @@ import ( "errors" "fmt" "github.com/Layr-Labs/eigenda/common/kvstore" + "github.com/Layr-Labs/eigenda/common/kvstore/leveldb" + "github.com/Layr-Labs/eigenda/common/kvstore/mapstore" "github.com/Layr-Labs/eigensdk-go/logging" "math" "sort" @@ -37,6 +39,34 @@ var _ kvstore.TableStore = &tableStore{} // ERR_TABLE_LIMIT_EXCEEDED is returned when the maximum number of tables has been reached. var ERR_TABLE_LIMIT_EXCEEDED = errors.New("table limit exceeded") +// StoreType describes the underlying store implementation. +type StoreType int + +const ( + // LevelDB is a LevelDB-backed store. + LevelDB StoreType = iota + // MapStore is an in-memory store. This store does not preserve data across restarts. + MapStore +) + +// New creates a new TableStore of the given type. Any data written to disk by the TableStore will be stored in +// the given path. Can be used to create a new store or to load an existing store from disk. +func (t StoreType) New(logger logging.Logger, path string) (kvstore.TableStore, error) { + switch t { + case LevelDB: + store, err := leveldb.NewStore(logger, path) + if err != nil { + return nil, fmt.Errorf("error creating LevelDB store: %w", err) + } + return wrapper(logger, store) + case MapStore: + store := mapstore.NewStore() + return wrapper(logger, store) + default: + return nil, fmt.Errorf("unknown store type: %d", t) + } +} + // tableStore is an implementation of TableStore that wraps a Store. type tableStore struct { logger logging.Logger @@ -60,12 +90,15 @@ type tableStore struct { namespaceTable kvstore.Table } -// Wrapper wraps the given Store to create a TableStore. +// Future work: if we ever decide to permit third parties to provide custom store implementations, we will need +// to make wrapper() into a public function. + +// wrapper wraps the given Store to create a TableStore. // // WARNING: it is not safe to access the wrapped store directly while the TableStore is in use. The TableStore uses // special key formatting, and direct access to the wrapped store may violate the TableStore's invariants, resulting // in undefined behavior. -func Wrapper(logger logging.Logger, base kvstore.Store) (kvstore.TableStore, error) { +func wrapper(logger logging.Logger, base kvstore.Store) (kvstore.TableStore, error) { tableIDMap := make(map[string]uint32) tableIdSet := make(map[uint32]bool) diff --git a/common/kvstore/tablestore/table_view.go b/common/kvstore/tablestore/table_view.go index 2d97a8eaa..adfe70481 100644 --- a/common/kvstore/tablestore/table_view.go +++ b/common/kvstore/tablestore/table_view.go @@ -9,7 +9,7 @@ import ( var _ kvstore.Table = &tableView{} -// tableView allows table in a TableStore to be accessed as if it were a Store. +// tableView allows table in a New to be accessed as if it were a Store. type tableView struct { // base is the underlying store. base kvstore.Store @@ -19,7 +19,7 @@ type tableView struct { prefix uint32 } -// NewTableView creates a new view into a table in a TableStore. +// NewTableView creates a new view into a table in a New. func newTableView( base kvstore.Store, name string, @@ -135,7 +135,7 @@ func (t *tableView) Destroy() error { return t.base.Destroy() } -// tableBatch is a batch for a table in a TableStore. +// tableBatch is a batch for a table in a New. type tableBatch struct { table kvstore.Table batch kvstore.Batch[[]byte] diff --git a/common/kvstore/test/store_test.go b/common/kvstore/test/store_test.go index d1ccfb87e..764506f8e 100644 --- a/common/kvstore/test/store_test.go +++ b/common/kvstore/test/store_test.go @@ -36,27 +36,22 @@ var storeBuilders = []func(logger logging.Logger, path string) (kvstore.Store, e return ttl.TTLWrapper(context.Background(), logger, store, 0), nil }, func(logger logging.Logger, path string) (kvstore.Store, error) { - store := mapstore.NewStore() - tableStore, err := tablestore.Wrapper(logger, store) + tableStore, err := tablestore.MapStore.New(logger, path) if err != nil { return nil, err } - store, err = tableStore.GetTable("test") + store, err := tableStore.GetTable("test") if err != nil { return nil, err } return store, nil }, func(logger logging.Logger, path string) (kvstore.Store, error) { - store, err := leveldb.NewStore(logger, path) - if err != nil { - return nil, err - } - tableStore, err := tablestore.Wrapper(logger, store) + tableStore, err := tablestore.LevelDB.New(logger, path) if err != nil { return nil, err } - store, err = tableStore.GetTable("test") + store, err := tableStore.GetTable("test") if err != nil { return nil, err }