diff --git a/appview/db/entity_state.go b/appview/db/entity_state.go index aba28f96..61436063 100644 --- a/appview/db/entity_state.go +++ b/appview/db/entity_state.go @@ -124,8 +124,16 @@ func UnparkStateRecord(tx *sql.Tx, did, rkey, nsid string) error { return err } -func DistinctPendingStateSubjects(e Execer) ([]syntax.ATURI, error) { - rows, err := e.Query(`select distinct subject from pending_state_records order by subject asc`) +func distinctPendingSubjects(e Execer, nsid string) ([]syntax.ATURI, error) { + query := `select distinct subject from pending_state_records` + var args []any + if nsid != "" { + query += ` where nsid = ?` + args = append(args, nsid) + } + query += ` order by subject asc` + + rows, err := e.Query(query, args...) if err != nil { return nil, err } @@ -142,13 +150,19 @@ func DistinctPendingStateSubjects(e Execer) ([]syntax.ATURI, error) { return subjects, rows.Err() } +func DistinctPendingStateSubjects(e Execer) ([]syntax.ATURI, error) { + return distinctPendingSubjects(e, "") +} + +func PendingStateSubjectsForNsid(e Execer, nsid string) ([]syntax.ATURI, error) { + return distinctPendingSubjects(e, nsid) +} + func EvictStalePendingStateRecords(e Execer, before string) (int64, error) { - res, err := e.Exec(` - delete from pending_state_records - where created < ? - and not exists (select 1 from issues where at_uri = pending_state_records.subject) - and not exists (select 1 from pulls where at_uri = pending_state_records.subject) - `, before) + res, err := e.Exec( + `delete from pending_state_records where created < ?`, + before, + ) if err != nil { return 0, err } diff --git a/appview/db/entity_state_test.go b/appview/db/entity_state_test.go index 68b165d0..d58c439c 100644 --- a/appview/db/entity_state_test.go +++ b/appview/db/entity_state_test.go @@ -415,15 +415,15 @@ func TestEvictStalePendingStateRecords(t *testing.T) { if err != nil { t.Fatalf("EvictStalePendingStateRecords: %v", err) } - if evicted != 1 { - t.Fatalf("only the stale orphan must be evicted, got %d want 1", evicted) + if evicted != 2 { + t.Fatalf("both stale rows must be evicted regardless of subject presence, got %d want 2", evicted) } var remaining int if err := d.QueryRow(`select count(*) from pending_state_records`).Scan(&remaining); err != nil { t.Fatalf("count: %v", err) } - if remaining != 2 { - t.Fatalf("the fresh orphan and the stale row with a live subject must survive, got %d want 2", remaining) + if remaining != 1 { + t.Fatalf("only the fresh row must survive the TTL sweep, got %d want 1", remaining) } }