diff --git a/internal/connector/handoff.go b/internal/connector/handoff.go index af32832b9..0dcbab327 100644 --- a/internal/connector/handoff.go +++ b/internal/connector/handoff.go @@ -244,8 +244,11 @@ func handOffReady(ctx context.Context, opts HandoffOptions) error { // started is closed without being written. func handOff(ctx context.Context, opts HandoffOptions, record Record) error { if record.CreatedAt.Before(opts.Started.Add(-HandoffGrace)) { + if err := opts.Ledger.SetState(ctx, record.ID, StateDiscarded, ReasonBeforeThisRun); err != nil { + return err + } opts.log().Info("connector: a request from before this run started is not handed off", "event_id", record.ID, "created_at", record.CreatedAt) - return opts.Ledger.SetState(ctx, record.ID, StateDiscarded, ReasonBeforeThisRun) + return nil } goes, err := opts.Ledger.isGo(ctx, record.ID) if err != nil { diff --git a/internal/connector/handoff_test.go b/internal/connector/handoff_test.go index dafcd027a..fd476f0b6 100644 --- a/internal/connector/handoff_test.go +++ b/internal/connector/handoff_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "encoding/json" + "log/slog" "strings" "testing" "time" @@ -93,6 +94,37 @@ func TestARequestFromBeforeTheRunIsNotHandedOff(t *testing.T) { assert.Equal(t, ReasonBeforeThisRun, r.Reason) } +func TestAnOldRequestIsLoggedOnlyAfterDiscardSucceeds(t *testing.T) { + for _, failSave := range []bool{false, true} { + name := "saved" + if failSave { + name = "save_failed" + } + t.Run(name, func(t *testing.T) { + ledger := newTestLedger(t) + admitOn(t, ledger, 1, "recording:1") + record := getRecord(t, ledger, 1) + var out, logs bytes.Buffer + opts := handoffOptions(ledger, &out) + opts.Started = opts.Started.Add(time.Hour) + opts.Logger = slog.New(slog.NewTextHandler(&logs, nil)) + if failSave { + require.NoError(t, ledger.Close()) + } + err := handOff(t.Context(), opts, record) + if failSave { + require.Error(t, err) + assert.NotContains(t, logs.String(), "is not handed off") + } else { + require.NoError(t, err) + assert.Contains(t, logs.String(), "is not handed off") + assert.Equal(t, ReasonBeforeThisRun, getRecord(t, ledger, 1).Reason) + } + assert.Empty(t, out.String()) + }) + } +} + // Only the projects the agent serves, narrowed to the run's --project. func TestOnlyServedProjectsAreHandedOff(t *testing.T) { ledger := newTestLedger(t)