Browse Source

libnetwork: Network.Services: return early and don't lock in a loop

- return early when failing to fetch the driver
- store network-ID and controller in a variable to prevent repeatedly
  locking/unlocking. We don't expect the network's ID to change
  during this operation.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Sebastiaan van Stijn 1 year ago
parent
commit
d6b8298cfd
1 changed files with 11 additions and 10 deletions
  1. 11 10
      libnetwork/agent.go

+ 11 - 10
libnetwork/agent.go

@@ -452,18 +452,24 @@ func (n *Network) Services() map[string]ServiceInfo {
 	if agent == nil {
 		return nil
 	}
+	nwID := n.ID()
+	d, err := n.driver(true)
+	if err != nil {
+		log.G(context.TODO()).Errorf("Could not resolve driver for network %s/%s while fetching services: %v", n.networkType, nwID, err)
+		return nil
+	}
 
 	// Walk through libnetworkEPTable and fetch the driver agnostic endpoint info
-	entries := agent.networkDB.GetTableByNetwork(libnetworkEPTable, n.id)
+	entries := agent.networkDB.GetTableByNetwork(libnetworkEPTable, nwID)
 	eps := make(map[string]epRecord)
+	c := n.getController()
 	for eid, value := range entries {
 		var epRec EndpointRecord
-		nid := n.ID()
 		if err := proto.Unmarshal(value.Value, &epRec); err != nil {
-			log.G(context.TODO()).Errorf("Unmarshal of libnetworkEPTable failed for endpoint %s in network %s, %v", eid, nid, err)
+			log.G(context.TODO()).Errorf("Unmarshal of libnetworkEPTable failed for endpoint %s in network %s, %v", eid, nwID, err)
 			continue
 		}
-		i := n.getController().getLBIndex(epRec.ServiceID, nid, epRec.IngressPorts)
+		i := c.getLBIndex(epRec.ServiceID, nwID, epRec.IngressPorts)
 		eps[eid] = epRecord{
 			ep:      epRec,
 			lbIndex: i,
@@ -473,16 +479,11 @@ func (n *Network) Services() map[string]ServiceInfo {
 	// Walk through the driver's tables, have the driver decode the entries
 	// and return the tuple {ep ID, value}. value is a string that coveys
 	// relevant info about the endpoint.
-	d, err := n.driver(true)
-	if err != nil {
-		log.G(context.TODO()).Errorf("Could not resolve driver for network %s/%s while fetching services: %v", n.networkType, n.ID(), err)
-		return nil
-	}
 	for _, table := range n.driverTables {
 		if table.objType != driverapi.EndpointObject {
 			continue
 		}
-		entries := agent.networkDB.GetTableByNetwork(table.name, n.id)
+		entries := agent.networkDB.GetTableByNetwork(table.name, nwID)
 		for key, value := range entries {
 			epID, info := d.DecodeTableEntry(table.name, key, value.Value)
 			if ep, ok := eps[epID]; !ok {