diff --git a/libnetwork/drivers/overlay/ov_network.go b/libnetwork/drivers/overlay/ov_network.go index 9c83127d4f..8b6839656b 100644 --- a/libnetwork/drivers/overlay/ov_network.go +++ b/libnetwork/drivers/overlay/ov_network.go @@ -244,7 +244,15 @@ func (d *driver) DeleteNetwork(nid string) error { } d.Lock() - defer d.Unlock() + // Only perform a peer flush operation (if required) AFTER unlocking + // the driver lock to avoid deadlocking w/ the peerDB. + var doPeerFlush bool + defer func() { + d.Unlock() + if doPeerFlush { + d.peerFlush(nid) + } + }() // This is similar to d.network(), but we need to keep holding the lock // until we are done removing this network. @@ -270,7 +278,7 @@ func (d *driver) DeleteNetwork(nid string) error { } } // flush the peerDB entries - d.peerFlush(nid) + doPeerFlush = true delete(d.networks, nid) vnis, err := n.releaseVxlanID()