From 89e72d8888638cc1fb91c12dc81e6156f6891e5a Mon Sep 17 00:00:00 2001 From: Jana Radhakrishnan Date: Fri, 26 Feb 2016 10:05:47 -0800 Subject: [PATCH] Remove kvstore deps from datastore package Currently datastore has dependencies on various kv backends. This is undesirable if datastore had to be used as a backend agnostic store management package with it's cache layer. This PR aims to achieve that. Signed-off-by: Jana Radhakrishnan --- libnetwork/bitseq/sequence_test.go | 5 +++++ libnetwork/datastore/cache.go | 5 +---- libnetwork/datastore/datastore.go | 17 ++++++----------- libnetwork/drivers/bridge/bridge_store.go | 3 +-- libnetwork/drivers/ipvlan/ipvlan_store.go | 3 +-- libnetwork/drivers/macvlan/macvlan_store.go | 3 +-- libnetwork/ipam/allocator.go | 5 +++++ libnetwork/store.go | 13 +++++++++++++ 8 files changed, 33 insertions(+), 21 deletions(-) diff --git a/libnetwork/bitseq/sequence_test.go b/libnetwork/bitseq/sequence_test.go index d435329d88..339f5928ef 100644 --- a/libnetwork/bitseq/sequence_test.go +++ b/libnetwork/bitseq/sequence_test.go @@ -8,6 +8,7 @@ import ( "time" "github.com/docker/libkv/store" + "github.com/docker/libkv/store/boltdb" "github.com/docker/libnetwork/datastore" _ "github.com/docker/libnetwork/testutils" ) @@ -16,6 +17,10 @@ const ( defaultPrefix = "/tmp/libnetwork/test/bitseq" ) +func init() { + boltdb.Register() +} + func randomLocalStore() (datastore.DataStore, error) { tmp, err := ioutil.TempFile("", "libnetwork-") if err != nil { diff --git a/libnetwork/datastore/cache.go b/libnetwork/datastore/cache.go index 08c8ac4839..2d00038290 100644 --- a/libnetwork/datastore/cache.go +++ b/libnetwork/datastore/cache.go @@ -5,7 +5,6 @@ import ( "sync" "github.com/docker/libkv/store" - "github.com/docker/libkv/store/boltdb" ) type kvMap map[string]KVObject @@ -42,9 +41,7 @@ func (c *cache) kmap(kvObject KVObject) (kvMap, error) { kvList, err := c.ds.store.List(keyPrefix) if err != nil { - // In case of BoltDB it may return ErrBoltBucketNotFound when no writes - // have ever happened on the db bucket. So check for both err codes - if err == store.ErrKeyNotFound || err == boltdb.ErrBoltBucketNotFound { + if err == store.ErrKeyNotFound { // If the store doesn't have anything then there is nothing to // populate in the cache. Just bail out. goto out diff --git a/libnetwork/datastore/datastore.go b/libnetwork/datastore/datastore.go index c15cd620c1..49affc7883 100644 --- a/libnetwork/datastore/datastore.go +++ b/libnetwork/datastore/datastore.go @@ -9,10 +9,6 @@ import ( "github.com/docker/libkv" "github.com/docker/libkv/store" - "github.com/docker/libkv/store/boltdb" - "github.com/docker/libkv/store/consul" - "github.com/docker/libkv/store/etcd" - "github.com/docker/libkv/store/zookeeper" "github.com/docker/libnetwork/discoverapi" "github.com/docker/libnetwork/types" ) @@ -148,13 +144,6 @@ func makeDefaultScopes() map[string]*ScopeCfg { var defaultRootChain = []string{"docker", "network", "v1.0"} var rootChain = defaultRootChain -func init() { - consul.Register() - zookeeper.Register() - etcd.Register() - boltdb.Register() -} - // DefaultScopes returns a map of default scopes and it's config for clients to use. func DefaultScopes(dataDir string) map[string]*ScopeCfg { if dataDir != "" { @@ -411,6 +400,9 @@ func (ds *datastore) PutObjectAtomic(kvObject KVObject) error { _, pair, err = ds.store.AtomicPut(Key(kvObject.Key()...), kvObjValue, previous, nil) if err != nil { + if err == store.ErrKeyExists { + return ErrKeyModified + } return err } @@ -571,6 +563,9 @@ func (ds *datastore) DeleteObjectAtomic(kvObject KVObject) error { } if _, err := ds.store.AtomicDelete(Key(kvObject.Key()...), previous); err != nil { + if err == store.ErrKeyExists { + return ErrKeyModified + } return err } diff --git a/libnetwork/drivers/bridge/bridge_store.go b/libnetwork/drivers/bridge/bridge_store.go index eca72bd30b..de9635289a 100644 --- a/libnetwork/drivers/bridge/bridge_store.go +++ b/libnetwork/drivers/bridge/bridge_store.go @@ -6,7 +6,6 @@ import ( "net" "github.com/Sirupsen/logrus" - "github.com/docker/libkv/store/boltdb" "github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/discoverapi" "github.com/docker/libnetwork/netlabel" @@ -35,7 +34,7 @@ func (d *driver) initStore(option map[string]interface{}) error { func (d *driver) populateNetworks() error { kvol, err := d.store.List(datastore.Key(bridgePrefix), &networkConfiguration{}) - if err != nil && err != datastore.ErrKeyNotFound && err != boltdb.ErrBoltBucketNotFound { + if err != nil && err != datastore.ErrKeyNotFound { return fmt.Errorf("failed to get bridge network configurations from store: %v", err) } diff --git a/libnetwork/drivers/ipvlan/ipvlan_store.go b/libnetwork/drivers/ipvlan/ipvlan_store.go index f6746da670..c6430835ae 100644 --- a/libnetwork/drivers/ipvlan/ipvlan_store.go +++ b/libnetwork/drivers/ipvlan/ipvlan_store.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/Sirupsen/logrus" - "github.com/docker/libkv/store/boltdb" "github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/discoverapi" "github.com/docker/libnetwork/netlabel" @@ -60,7 +59,7 @@ func (d *driver) initStore(option map[string]interface{}) error { // populateNetworks is invoked at driver init to recreate persistently stored networks func (d *driver) populateNetworks() error { kvol, err := d.store.List(datastore.Key(ipvlanPrefix), &configuration{}) - if err != nil && err != datastore.ErrKeyNotFound && err != boltdb.ErrBoltBucketNotFound { + if err != nil && err != datastore.ErrKeyNotFound { return fmt.Errorf("failed to get ipvlan network configurations from store: %v", err) } // If empty it simply means no ipvlan networks have been created yet diff --git a/libnetwork/drivers/macvlan/macvlan_store.go b/libnetwork/drivers/macvlan/macvlan_store.go index 492ea93f71..5f92feadd4 100644 --- a/libnetwork/drivers/macvlan/macvlan_store.go +++ b/libnetwork/drivers/macvlan/macvlan_store.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/Sirupsen/logrus" - "github.com/docker/libkv/store/boltdb" "github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/discoverapi" "github.com/docker/libnetwork/netlabel" @@ -60,7 +59,7 @@ func (d *driver) initStore(option map[string]interface{}) error { // populateNetworks is invoked at driver init to recreate persistently stored networks func (d *driver) populateNetworks() error { kvol, err := d.store.List(datastore.Key(macvlanPrefix), &configuration{}) - if err != nil && err != datastore.ErrKeyNotFound && err != boltdb.ErrBoltBucketNotFound { + if err != nil && err != datastore.ErrKeyNotFound { return fmt.Errorf("failed to get macvlan network configurations from store: %v", err) } // If empty it simply means no macvlan networks have been created yet diff --git a/libnetwork/ipam/allocator.go b/libnetwork/ipam/allocator.go index 70fe06eba7..8b4896fc64 100644 --- a/libnetwork/ipam/allocator.go +++ b/libnetwork/ipam/allocator.go @@ -6,6 +6,7 @@ import ( "sync" log "github.com/Sirupsen/logrus" + "github.com/docker/libkv/store/boltdb" "github.com/docker/libnetwork/bitseq" "github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/discoverapi" @@ -25,6 +26,10 @@ const ( dsDataKey = "ipam/" + ipamapi.DefaultIPAM + "/data" ) +func init() { + boltdb.Register() +} + // Allocator provides per address space ipv4/ipv6 book keeping type Allocator struct { // Predefined pools for default address spaces diff --git a/libnetwork/store.go b/libnetwork/store.go index 2c439dcbd4..0e7ec1921b 100644 --- a/libnetwork/store.go +++ b/libnetwork/store.go @@ -4,9 +4,20 @@ import ( "fmt" log "github.com/Sirupsen/logrus" + "github.com/docker/libkv/store/boltdb" + "github.com/docker/libkv/store/consul" + "github.com/docker/libkv/store/etcd" + "github.com/docker/libkv/store/zookeeper" "github.com/docker/libnetwork/datastore" ) +func registerKVStores() { + consul.Register() + zookeeper.Register() + etcd.Register() + boltdb.Register() +} + func (c *controller) initScopedStore(scope string, scfg *datastore.ScopeCfg) error { store, err := datastore.NewDataStore(scope, scfg) if err != nil { @@ -20,6 +31,8 @@ func (c *controller) initScopedStore(scope string, scfg *datastore.ScopeCfg) err } func (c *controller) initStores() error { + registerKVStores() + c.Lock() if c.cfg == nil { c.Unlock()