From 9fc36171d0a89f659884504128a272db7cff4606 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 17 Sep 2018 13:04:46 +0200 Subject: [PATCH] swarm: schemas and migrations --- swarm/storage/database.go | 9 ++------- swarm/storage/ldbstore.go | 22 ++++++++++++++++++++++ swarm/storage/localstore.go | 27 +++++++++++++++++++++++++++ swarm/storage/schema.go | 6 ++++++ swarm/swarm.go | 5 +++++ 5 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 swarm/storage/schema.go diff --git a/swarm/storage/database.go b/swarm/storage/database.go index 3b5d003de1..e25fce31fb 100644 --- a/swarm/storage/database.go +++ b/swarm/storage/database.go @@ -20,8 +20,6 @@ package storage // no need for queueing/caching import ( - "fmt" - "github.com/ethereum/go-ethereum/metrics" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/iterator" @@ -46,13 +44,10 @@ func NewLDBDatabase(file string) (*LDBDatabase, error) { return database, nil } -func (db *LDBDatabase) Put(key []byte, value []byte) { +func (db *LDBDatabase) Put(key []byte, value []byte) error { metrics.GetOrRegisterCounter("ldbdatabase.put", nil).Inc(1) - err := db.db.Put(key, value, nil) - if err != nil { - fmt.Println("Error put", err) - } + return db.db.Put(key, value, nil) } func (db *LDBDatabase) Get(key []byte) ([]byte, error) { diff --git a/swarm/storage/ldbstore.go b/swarm/storage/ldbstore.go index bde627394e..84d7c195bd 100644 --- a/swarm/storage/ldbstore.go +++ b/swarm/storage/ldbstore.go @@ -730,6 +730,28 @@ func (s *LDBStore) tryAccessIdx(ikey []byte, index *dpaDBIndex) bool { return true } +func (s *LDBStore) GetSchema() (string, error) { + s.lock.Lock() + defer s.lock.Unlock() + + data, err := s.db.Get([]byte(`schema`)) + if err != nil { + if err == leveldb.ErrNotFound { + return "", nil + } + return "", err + } + + return string(data), nil +} + +func (s *LDBStore) PutSchema(schema string) error { + s.lock.Lock() + defer s.lock.Unlock() + + return s.db.Put([]byte(`schema`), []byte(schema)) +} + func (s *LDBStore) Get(_ context.Context, addr Address) (chunk Chunk, err error) { metrics.GetOrRegisterCounter("ldbstore.get", nil).Inc(1) log.Trace("ldbstore.get", "key", addr) diff --git a/swarm/storage/localstore.go b/swarm/storage/localstore.go index 04701ee69a..05bf829d5b 100644 --- a/swarm/storage/localstore.go +++ b/swarm/storage/localstore.go @@ -184,3 +184,30 @@ func (ls *LocalStore) Iterator(from uint64, to uint64, po uint8, f func(Address, func (ls *LocalStore) Close() { ls.DbStore.Close() } + +func (ls *LocalStore) Migrate() error { + schema, err := ls.DbStore.GetSchema() + if err != nil { + log.Error(err.Error()) + return err + } + + log.Debug("found schema", "schema", schema, "runtime-schema", CurrentDbSchema) + if schema != CurrentDbSchema { + // run migrations + + if schema == "" { + log.Debug("running migrations for", "schema", schema, "runtime-schema", CurrentDbSchema) + + ls.DbStore.Cleanup() + + err := ls.DbStore.PutSchema(DbSchemaHive) + if err != nil { + log.Error(err.Error()) + return err + } + } + } + + return nil +} diff --git a/swarm/storage/schema.go b/swarm/storage/schema.go new file mode 100644 index 0000000000..3006c114df --- /dev/null +++ b/swarm/storage/schema.go @@ -0,0 +1,6 @@ +package storage + +// "hive" is the first formal schema of LevelDB we release together with Swarm 0.3.4 +const DbSchemaHive = "hive" + +const CurrentDbSchema = DbSchemaHive diff --git a/swarm/swarm.go b/swarm/swarm.go index 13aa1125d3..eaf5b1147e 100644 --- a/swarm/swarm.go +++ b/swarm/swarm.go @@ -169,6 +169,11 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e return nil, err } + err = lstore.Migrate() + if err != nil { + return nil, err + } + self.netStore, err = storage.NewNetStore(lstore, nil) if err != nil { return nil, err