浏览代码

Cleanup dangling local endpoints

When we bootup cleanup all dangling local
endpoints since they are not needed anymore.
The only reason it can happen is when the process
went down ungracefully after an endpoint is
created but before join is successfull.

Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
Jana Radhakrishnan 9 年之前
父节点
当前提交
33d336ac72
共有 3 个文件被更改,包括 55 次插入0 次删除
  1. 1 0
      libnetwork/controller.go
  2. 22 0
      libnetwork/endpoint.go
  3. 32 0
      libnetwork/store.go

+ 1 - 0
libnetwork/controller.go

@@ -192,6 +192,7 @@ func New(cfgOptions ...config.Option) (NetworkController, error) {
 	}
 	}
 
 
 	c.sandboxCleanup()
 	c.sandboxCleanup()
+	c.cleanupLocalEndpoints()
 
 
 	if err := c.startExternalKeyListener(); err != nil {
 	if err := c.startExternalKeyListener(); err != nil {
 		return nil, err
 		return nil, err

+ 22 - 0
libnetwork/endpoint.go

@@ -708,3 +708,25 @@ func (ep *endpoint) releaseAddress() {
 		}
 		}
 	}
 	}
 }
 }
+
+func (c *controller) cleanupLocalEndpoints() {
+	nl, err := c.getNetworksForScope(datastore.LocalScope)
+	if err != nil {
+		log.Warnf("Could not get list of networks during endpoint cleanup: %v", err)
+		return
+	}
+
+	for _, n := range nl {
+		epl, err := n.getEndpointsFromStore()
+		if err != nil {
+			log.Warnf("Could not get list of endpoints in network %s during endpoint cleanup: %v", n.name, err)
+			continue
+		}
+
+		for _, ep := range epl {
+			if err := ep.Delete(); err != nil {
+				log.Warnf("Could not delete local endpoint %s during endpoint cleanup: %v", ep.name, err)
+			}
+		}
+	}
+}

+ 32 - 0
libnetwork/store.go

@@ -82,6 +82,38 @@ func (c *controller) getNetworkFromStore(nid string) (*network, error) {
 	return nil, fmt.Errorf("network %s not found", nid)
 	return nil, fmt.Errorf("network %s not found", nid)
 }
 }
 
 
+func (c *controller) getNetworksForScope(scope string) ([]*network, error) {
+	var nl []*network
+
+	store := c.getStore(scope)
+	if store == nil {
+		return nil, nil
+	}
+
+	kvol, err := store.List(datastore.Key(datastore.NetworkKeyPrefix),
+		&network{ctrlr: c})
+	if err != nil && err != datastore.ErrKeyNotFound {
+		return nil, fmt.Errorf("failed to get networks for scope %s: %v",
+			scope, err)
+	}
+
+	for _, kvo := range kvol {
+		n := kvo.(*network)
+		n.ctrlr = c
+
+		ec := &endpointCnt{n: n}
+		err = store.GetObject(datastore.Key(ec.Key()...), ec)
+		if err != nil {
+			return nil, fmt.Errorf("could not find endpoint count key %s for network %s while listing: %v", datastore.Key(ec.Key()...), n.Name(), err)
+		}
+
+		n.epCnt = ec
+		nl = append(nl, n)
+	}
+
+	return nl, nil
+}
+
 func (c *controller) getNetworksFromStore() ([]*network, error) {
 func (c *controller) getNetworksFromStore() ([]*network, error) {
 	var nl []*network
 	var nl []*network