From 65296cd0e7b9b77f46cb549f27cd08162fe848b8 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sun, 19 Oct 2025 14:48:06 +0200 Subject: [PATCH] libnetwork/drivers/macvlan, ipvlan: un-embed mutexes Signed-off-by: Sebastiaan van Stijn --- daemon/libnetwork/drivers/ipvlan/ipvlan.go | 16 ++++--- .../libnetwork/drivers/ipvlan/ipvlan_state.go | 42 +++++++++--------- daemon/libnetwork/drivers/macvlan/macvlan.go | 16 ++++--- .../drivers/macvlan/macvlan_state.go | 43 ++++++++++--------- 4 files changed, 63 insertions(+), 54 deletions(-) diff --git a/daemon/libnetwork/drivers/ipvlan/ipvlan.go b/daemon/libnetwork/drivers/ipvlan/ipvlan.go index 72f4c42bff..bbf1bb3759 100644 --- a/daemon/libnetwork/drivers/ipvlan/ipvlan.go +++ b/daemon/libnetwork/drivers/ipvlan/ipvlan.go @@ -31,9 +31,11 @@ const ( ) type driver struct { - networks map[string]*network - sync.Mutex store *datastore.Store + + // mu protects the networks map. + mu sync.Mutex + networks map[string]*network } type endpoint struct { @@ -48,11 +50,13 @@ type endpoint struct { } type network struct { - id string + id string + driver *driver + config *configuration + + // mu protects the endpoints map. + mu sync.Mutex endpoints map[string]*endpoint - driver *driver - config *configuration - sync.Mutex } // Register initializes and registers the libnetwork ipvlan driver. diff --git a/daemon/libnetwork/drivers/ipvlan/ipvlan_state.go b/daemon/libnetwork/drivers/ipvlan/ipvlan_state.go index d4b2066de3..f9c3253b52 100644 --- a/daemon/libnetwork/drivers/ipvlan/ipvlan_state.go +++ b/daemon/libnetwork/drivers/ipvlan/ipvlan_state.go @@ -11,9 +11,9 @@ import ( ) func (d *driver) network(nid string) *network { - d.Lock() + d.mu.Lock() n, ok := d.networks[nid] - d.Unlock() + d.mu.Unlock() if !ok { log.G(context.TODO()).Errorf("network id %s not found", nid) } @@ -22,21 +22,21 @@ func (d *driver) network(nid string) *network { } func (d *driver) addNetwork(n *network) { - d.Lock() + d.mu.Lock() d.networks[n.id] = n - d.Unlock() + d.mu.Unlock() } func (d *driver) deleteNetwork(nid string) { - d.Lock() + d.mu.Lock() delete(d.networks, nid) - d.Unlock() + d.mu.Unlock() } // getNetworks Safely returns a slice of existing networks func (d *driver) getNetworks() []*network { - d.Lock() - defer d.Unlock() + d.mu.Lock() + defer d.mu.Unlock() ls := make([]*network, 0, len(d.networks)) for _, nw := range d.networks { @@ -50,8 +50,8 @@ func (n *network) endpoint(eid string) (*endpoint, error) { if eid == "" { return nil, errors.New("invalid endpoint id") } - n.Lock() - defer n.Unlock() + n.mu.Lock() + defer n.mu.Unlock() ep, ok := n.endpoints[eid] if !ok || ep == nil { @@ -61,15 +61,15 @@ func (n *network) endpoint(eid string) (*endpoint, error) { } func (n *network) addEndpoint(ep *endpoint) { - n.Lock() + n.mu.Lock() n.endpoints[ep.id] = ep - n.Unlock() + n.mu.Unlock() } func (n *network) deleteEndpoint(eid string) { - n.Lock() + n.mu.Lock() delete(n.endpoints, eid) - n.Unlock() + n.mu.Unlock() } func validateID(nid, eid string) error { @@ -84,15 +84,15 @@ func validateID(nid, eid string) error { } func (d *driver) getNetwork(id string) (*network, error) { - d.Lock() - defer d.Unlock() if id == "" { - return nil, types.InvalidParameterErrorf("invalid network id: %s", id) + return nil, types.InvalidParameterErrorf("invalid network id") } - if nw, ok := d.networks[id]; ok { - return nw, nil + d.mu.Lock() + defer d.mu.Unlock() + nw, ok := d.networks[id] + if !ok || nw == nil { + return nil, types.NotFoundErrorf("network not found: %s", id) } - - return nil, types.NotFoundErrorf("network not found: %s", id) + return nw, nil } diff --git a/daemon/libnetwork/drivers/macvlan/macvlan.go b/daemon/libnetwork/drivers/macvlan/macvlan.go index b0e54c85b6..4103a1c588 100644 --- a/daemon/libnetwork/drivers/macvlan/macvlan.go +++ b/daemon/libnetwork/drivers/macvlan/macvlan.go @@ -25,9 +25,11 @@ const ( ) type driver struct { - networks map[string]*network - sync.Mutex store *datastore.Store + + // mu protects the networks map. + mu sync.Mutex + networks map[string]*network } type endpoint struct { @@ -42,11 +44,13 @@ type endpoint struct { } type network struct { - id string + id string + driver *driver + config *configuration + + // mu protects the endpoints map. + mu sync.Mutex endpoints map[string]*endpoint - driver *driver - config *configuration - sync.Mutex } // Register initializes and registers the libnetwork macvlan driver diff --git a/daemon/libnetwork/drivers/macvlan/macvlan_state.go b/daemon/libnetwork/drivers/macvlan/macvlan_state.go index ad52d683e0..5faab1eb8f 100644 --- a/daemon/libnetwork/drivers/macvlan/macvlan_state.go +++ b/daemon/libnetwork/drivers/macvlan/macvlan_state.go @@ -11,9 +11,9 @@ import ( ) func (d *driver) network(nid string) *network { - d.Lock() + d.mu.Lock() n, ok := d.networks[nid] - d.Unlock() + d.mu.Unlock() if !ok { log.G(context.TODO()).Errorf("network id %s not found", nid) } @@ -22,21 +22,21 @@ func (d *driver) network(nid string) *network { } func (d *driver) addNetwork(n *network) { - d.Lock() + d.mu.Lock() d.networks[n.id] = n - d.Unlock() + d.mu.Unlock() } func (d *driver) deleteNetwork(nid string) { - d.Lock() + d.mu.Lock() delete(d.networks, nid) - d.Unlock() + d.mu.Unlock() } // getNetworks Safely returns a slice of existing networks func (d *driver) getNetworks() []*network { - d.Lock() - defer d.Unlock() + d.mu.Lock() + defer d.mu.Unlock() ls := make([]*network, 0, len(d.networks)) for _, nw := range d.networks { @@ -50,8 +50,8 @@ func (n *network) endpoint(eid string) (*endpoint, error) { if eid == "" { return nil, errors.New("invalid endpoint id") } - n.Lock() - defer n.Unlock() + n.mu.Lock() + defer n.mu.Unlock() ep, ok := n.endpoints[eid] if !ok || ep == nil { @@ -61,15 +61,15 @@ func (n *network) endpoint(eid string) (*endpoint, error) { } func (n *network) addEndpoint(ep *endpoint) { - n.Lock() + n.mu.Lock() n.endpoints[ep.id] = ep - n.Unlock() + n.mu.Unlock() } func (n *network) deleteEndpoint(eid string) { - n.Lock() + n.mu.Lock() delete(n.endpoints, eid) - n.Unlock() + n.mu.Unlock() } func validateID(nid, eid string) error { @@ -83,14 +83,15 @@ func validateID(nid, eid string) error { } func (d *driver) getNetwork(id string) (*network, error) { - d.Lock() - defer d.Unlock() if id == "" { - return nil, types.InvalidParameterErrorf("invalid network id: %s", id) - } - if nw, ok := d.networks[id]; ok { - return nw, nil + return nil, types.InvalidParameterErrorf("invalid network id") } - return nil, types.NotFoundErrorf("network not found: %s", id) + d.mu.Lock() + defer d.mu.Unlock() + nw, ok := d.networks[id] + if !ok || nw == nil { + return nil, types.NotFoundErrorf("network not found: %s", id) + } + return nw, nil }