Endpoint.sbLeave: don't load ep from store

Because it loaded the Endpoint object from store and operated
on that copy rather than its own receiver, sbJoin couldn't
successfully roll back on error if the Endpoint was not included
in the Sandbox's list of endpoints, or its current state had
not been written to store after the error occurred.

So, for example, releaseOSSboxResources() would not be called
to delete interfaces created in the container's netns.

Signed-off-by: Rob Murray <rob.murray@docker.com>
This commit is contained in:
Rob Murray
2025-09-11 09:55:47 +01:00
parent b192d06ec7
commit a9db1e9a26
2 changed files with 7 additions and 7 deletions

View File

@@ -100,7 +100,7 @@ func (sb *Sandbox) clearDefaultGW() error {
if ep = sb.getEndpointInGWNetwork(); ep == nil {
return nil
}
if err := ep.sbLeave(context.TODO(), sb, false); err != nil {
if err := ep.sbLeave(context.TODO(), sb, ep.getNetwork(), false); err != nil {
return fmt.Errorf("container %s: endpoint leaving GW Network failed: %v", sb.containerID, err)
}
if err := ep.Delete(context.TODO(), false); err != nil {

View File

@@ -753,20 +753,20 @@ func (ep *Endpoint) Leave(ctx context.Context, sb *Sandbox) error {
sb.joinLeaveMu.Lock()
defer sb.joinLeaveMu.Unlock()
return ep.sbLeave(ctx, sb, false)
}
func (ep *Endpoint) sbLeave(ctx context.Context, sb *Sandbox, force bool) error {
n, err := ep.getNetworkFromStore()
if err != nil {
return fmt.Errorf("failed to get network from store during leave: %v", err)
}
ep, err = n.getEndpointFromStore(ep.ID())
storedEp, err := n.getEndpointFromStore(ep.ID())
if err != nil {
return fmt.Errorf("failed to get endpoint from store during leave: %v", err)
}
return storedEp.sbLeave(ctx, sb, n, false)
}
func (ep *Endpoint) sbLeave(ctx context.Context, sb *Sandbox, n *Network, force bool) error {
ctx = log.WithLogger(ctx, log.G(ctx).WithFields(log.Fields{
"nid": n.ID(),
"net": n.Name(),
@@ -920,7 +920,7 @@ func (ep *Endpoint) Delete(ctx context.Context, force bool) error {
}
if sb != nil {
if e := ep.sbLeave(context.WithoutCancel(ctx), sb, force); e != nil {
if e := ep.sbLeave(context.WithoutCancel(ctx), sb, n, force); e != nil {
log.G(ctx).Warnf("failed to leave sandbox for endpoint %s : %v", name, e)
}
}