From 2c8670b496e2f4fa9e61991d162880fd27be4777 Mon Sep 17 00:00:00 2001 From: Madhu Venugopal Date: Thu, 26 Oct 2017 12:57:35 -0700 Subject: [PATCH] endpoint_cnt store updates should not create an object endpoint_cnt object is created during network create and destroyed when network is deleted. But the updateToStore function creates an object when it is not present in the store. endpoint_cnt is a mutable object and is updated during endpoint create and delete events. If endpoint create or delete happens after the network is deleted, it can incorrectly create an endpoint_cnt object in the store and that can cause problems when the same network is created again later. The fix is to not create the endpoint_cnt object when endpoint_cnt is incremented or decremented Signed-off-by: Madhu Venugopal --- libnetwork/endpoint_cnt.go | 14 +++++++++----- libnetwork/store.go | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libnetwork/endpoint_cnt.go b/libnetwork/endpoint_cnt.go index c63d06abe0..7b7527426d 100644 --- a/libnetwork/endpoint_cnt.go +++ b/libnetwork/endpoint_cnt.go @@ -138,6 +138,15 @@ func (ec *endpointCnt) setCnt(cnt uint64) error { } func (ec *endpointCnt) atomicIncDecEpCnt(inc bool) error { + store := ec.n.getController().getStore(ec.DataScope()) + if store == nil { + return fmt.Errorf("store not found for scope %s", ec.DataScope()) + } + + tmp := &endpointCnt{n: ec.n} + if err := store.GetObject(datastore.Key(ec.Key()...), tmp); err != nil { + return err + } retry: ec.Lock() if inc { @@ -149,11 +158,6 @@ retry: } ec.Unlock() - store := ec.n.getController().getStore(ec.DataScope()) - if store == nil { - return fmt.Errorf("store not found for scope %s", ec.DataScope()) - } - if err := ec.n.getController().updateToStore(ec); err != nil { if err == datastore.ErrKeyModified { if err := store.GetObject(datastore.Key(ec.Key()...), ec); err != nil { diff --git a/libnetwork/store.go b/libnetwork/store.go index 1a897bfe01..da7ac1dea6 100644 --- a/libnetwork/store.go +++ b/libnetwork/store.go @@ -256,6 +256,7 @@ retry: if err := cs.GetObject(datastore.Key(kvObject.Key()...), kvObject); err != nil { return fmt.Errorf("could not update the kvobject to latest when trying to delete: %v", err) } + logrus.Errorf("Error (%v) deleting object %v, retrying....", err, kvObject.Key()) goto retry } return err