From 1452fc31d4f687d5f933efda72de8669c0c6663d Mon Sep 17 00:00:00 2001 From: Jana Radhakrishnan Date: Mon, 2 Nov 2015 17:54:22 -0800 Subject: [PATCH] Retain sandbox only if network is not available It is sufficient to check only if network is available in store to make the decision of whether to retain the stale sandbox. If the endpoints are not available then there is no point in retaining the sandbox anyways. This fixes some extreme corner cases, where daemon goes down right in the middle of sandbox cleanup happening. Signed-off-by: Jana Radhakrishnan --- libnetwork/sandbox.go | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/libnetwork/sandbox.go b/libnetwork/sandbox.go index 41074641dc..b29c67fdbe 100644 --- a/libnetwork/sandbox.go +++ b/libnetwork/sandbox.go @@ -177,13 +177,18 @@ func (sb *sandbox) Delete() error { continue } - if err := ep.Leave(sb); err != nil { + // Retain the sanbdox if we can't obtain the network from store. + if _, err := c.getNetworkFromStore(ep.getNetwork().ID()); err != nil { retain = true + log.Warnf("Failed getting network for ep %s during sandbox %s delete: %v", ep.ID(), sb.ID(), err) + continue + } + + if err := ep.Leave(sb); err != nil { log.Warnf("Failed detaching sandbox %s from endpoint %s: %v\n", sb.ID(), ep.ID(), err) } if err := ep.Delete(); err != nil { - retain = true log.Warnf("Failed deleting endpoint %s: %v\n", ep.ID(), err) } } @@ -455,7 +460,7 @@ func (sb *sandbox) populateNetworkResources(ep *endpoint) error { i := ep.iface ep.Unlock() - if i.srcName != "" { + if i != nil && i.srcName != "" { var ifaceOptions []osl.IfaceOption ifaceOptions = append(ifaceOptions, sb.osSbox.InterfaceOptions().Address(i.addr), sb.osSbox.InterfaceOptions().Routes(i.routes)) @@ -951,6 +956,11 @@ func OptionGeneric(generic map[string]interface{}) SandboxOption { func (eh epHeap) Len() int { return len(eh) } func (eh epHeap) Less(i, j int) bool { + var ( + cip, cjp int + ok bool + ) + ci, _ := eh[i].getSandbox() cj, _ := eh[j].getSandbox() @@ -965,14 +975,20 @@ func (eh epHeap) Less(i, j int) bool { return true } - cip, ok := ci.epPriority[eh[i].ID()] - if !ok { - cip = 0 + if ci != nil { + cip, ok = ci.epPriority[eh[i].ID()] + if !ok { + cip = 0 + } } - cjp, ok := cj.epPriority[eh[j].ID()] - if !ok { - cjp = 0 + + if cj != nil { + cjp, ok = cj.epPriority[eh[j].ID()] + if !ok { + cjp = 0 + } } + if cip == cjp { return eh[i].network.Name() < eh[j].network.Name() }