···124124 return err
125125}
126126127127-func DistinctPendingStateSubjects(e Execer) ([]syntax.ATURI, error) {
128128- rows, err := e.Query(`select distinct subject from pending_state_records order by subject asc`)
127127+func distinctPendingSubjects(e Execer, nsid string) ([]syntax.ATURI, error) {
128128+ query := `select distinct subject from pending_state_records`
129129+ var args []any
130130+ if nsid != "" {
131131+ query += ` where nsid = ?`
132132+ args = append(args, nsid)
133133+ }
134134+ query += ` order by subject asc`
135135+136136+ rows, err := e.Query(query, args...)
129137 if err != nil {
130138 return nil, err
131139 }
···142150 return subjects, rows.Err()
143151}
144152153153+func DistinctPendingStateSubjects(e Execer) ([]syntax.ATURI, error) {
154154+ return distinctPendingSubjects(e, "")
155155+}
156156+157157+func PendingStateSubjectsForNsid(e Execer, nsid string) ([]syntax.ATURI, error) {
158158+ return distinctPendingSubjects(e, nsid)
159159+}
160160+145161func EvictStalePendingStateRecords(e Execer, before string) (int64, error) {
146146- res, err := e.Exec(`
147147- delete from pending_state_records
148148- where created < ?
149149- and not exists (select 1 from issues where at_uri = pending_state_records.subject)
150150- and not exists (select 1 from pulls where at_uri = pending_state_records.subject)
151151- `, before)
162162+ res, err := e.Exec(
163163+ `delete from pending_state_records where created < ?`,
164164+ before,
165165+ )
152166 if err != nil {
153167 return 0, err
154168 }
+4-4
appview/db/entity_state_test.go
···415415 if err != nil {
416416 t.Fatalf("EvictStalePendingStateRecords: %v", err)
417417 }
418418- if evicted != 1 {
419419- t.Fatalf("only the stale orphan must be evicted, got %d want 1", evicted)
418418+ if evicted != 2 {
419419+ t.Fatalf("both stale rows must be evicted regardless of subject presence, got %d want 2", evicted)
420420 }
421421422422 var remaining int
423423 if err := d.QueryRow(`select count(*) from pending_state_records`).Scan(&remaining); err != nil {
424424 t.Fatalf("count: %v", err)
425425 }
426426- if remaining != 2 {
427427- t.Fatalf("the fresh orphan and the stale row with a live subject must survive, got %d want 2", remaining)
426426+ if remaining != 1 {
427427+ t.Fatalf("only the fresh row must survive the TTL sweep, got %d want 1", remaining)
428428 }
429429}