package host import ( "context" "github.com/carlosframework/platform/internal/hostbox" ) // reapLocked needs only namespace/slot/record authority; it never takes a host // guard. Pressure selection and authenticated replacement are separate callers. func (l *servingParkLedger) reapLocked(ctx context.Context, id string) error { r, err := l.read(id) if err != nil { return err } unlock, err := l.state.Lock(ctx, "slot-"+servingParkKey(r.Authorization.Successor.Box, r.Authorization.Successor.Host)+".lock") if err != nil { return err } defer unlock() unlockRecord, err := l.state.Lock(ctx, "retirement-"+id+".lock") if err != nil { return err } defer unlockRecord() if r.Closed { return nil } if !r.Complete || r.Disposition != servingParkRetain || l.now().Before(r.ReapAfter) { return hostbox.ErrChanged } return l.deleteLocked(ctx, &r, "expiry") }