package instancectl import "context" func (u ClaimUnits) StopInvocation(ctx context.Context, host, invocation string) error { if u.BoundUnit == "" && u.BoundHost == "" { return u.Stop(ctx, host) } unit, group, err := u.Placement(host) if err != nil || invocation == "" || u.Systemctl == nil { return ErrClaimUnit } state, err := u.show(ctx, unit, "ActiveState", "InvocationID", "ControlGroup") if err != nil { return err } if state["InvocationID"] != invocation || state["ControlGroup"] != "/"+group { return ErrClaimUnitBusy } if err := u.Stop(ctx, host); err != nil { return err } state, err = u.show(ctx, unit, "InvocationID", "ControlGroup") if err != nil { return err } // systemctl stops by name. A replacement between the check and stop // makes the result uncertain; never issue a successful stop receipt. if state["InvocationID"] != "" && state["InvocationID"] != invocation || state["ControlGroup"] != "" && state["ControlGroup"] != "/"+group { return ErrClaimUnitBusy } return nil }