Skip to content

Commit 3a9d2bc

Browse files
committed
fix: don't defer packagist refresh on p2-only failure
Signed-off-by: anilb <epipav@gmail.com>
1 parent ad5e92e commit 3a9d2bc

3 files changed

Lines changed: 29 additions & 4 deletions

File tree

services/apps/packages_worker/src/packagist/__tests__/ingest.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,14 @@ describe('ingestOnePackagistMetadata', () => {
197197
await p
198198

199199
expect(mockPersistMetadata).not.toHaveBeenCalled()
200+
// p2-only failure must not bump metadata_last_run_at — phase 1 already succeeded,
201+
// but versions/deps never refreshed, so the package must stay due
200202
expect(mockMarkMetadata).toHaveBeenCalledWith(
201203
qx,
202204
PURL,
203205
expect.objectContaining({ status: 'error', errorKind: 'NOT_FOUND' }),
206+
undefined,
207+
false,
204208
)
205209
})
206210

@@ -224,6 +228,8 @@ describe('ingestOnePackagistMetadata', () => {
224228
qx,
225229
PURL,
226230
expect.objectContaining({ status: 'error', errorKind: 'NOT_FOUND' }),
231+
undefined,
232+
false,
227233
)
228234
})
229235

services/apps/packages_worker/src/packagist/activities.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,16 @@ export async function ingestOnePackagistMetadata(
151151
{ purl: candidate.purl, statusCode: p2.error.statusCode, kind: p2.error.kind },
152152
'packagist metadata 4xx/malformed after fast retries — marking scanned and skipping',
153153
)
154-
await markPackagistMetadataScanned(qx, candidate.purl, giveUpResult(p2.error, p2.attempts))
154+
// Phase 1 already succeeded — only p2 (versions/deps) failed to refresh. Don't push
155+
// metadata_last_run_at forward, or due-selection wrongly treats this package as
156+
// "recently scanned" and skips it for the full refresh window despite stale p2 data.
157+
await markPackagistMetadataScanned(
158+
qx,
159+
candidate.purl,
160+
giveUpResult(p2.error, p2.attempts),
161+
undefined,
162+
false,
163+
)
155164
return
156165
}
157166

services/libs/data-access-layer/src/packages/packagistPackageState.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,25 @@ export async function markPackagistMetadataScanned(
2626
purl: string,
2727
result: PackagistRunResult,
2828
metadataLastModified?: string | null,
29+
// p2-only failures (phase 1 already succeeded) should NOT push the refresh watermark
30+
// forward — versions/dependencies never actually refreshed, so the package must stay
31+
// (or become) due again on the next run instead of sitting out the full refresh window.
32+
bumpLastRunAt = true,
2933
): Promise<void> {
3034
await qx.result(
3135
`INSERT INTO packagist_package_state (purl, metadata_run_result, metadata_last_run_at, metadata_last_modified)
32-
VALUES ($(purl), $(result)::jsonb, NOW(), $(metadataLastModified))
36+
VALUES ($(purl), $(result)::jsonb, CASE WHEN $(bumpLastRunAt) THEN NOW() ELSE NULL END, $(metadataLastModified))
3337
ON CONFLICT (purl) DO UPDATE SET
3438
metadata_run_result = EXCLUDED.metadata_run_result,
35-
metadata_last_run_at = EXCLUDED.metadata_last_run_at,
39+
metadata_last_run_at = CASE WHEN $(bumpLastRunAt) THEN EXCLUDED.metadata_last_run_at
40+
ELSE packagist_package_state.metadata_last_run_at END,
3641
metadata_last_modified = COALESCE(EXCLUDED.metadata_last_modified, packagist_package_state.metadata_last_modified)`,
37-
{ purl, result: JSON.stringify(result), metadataLastModified: metadataLastModified ?? null },
42+
{
43+
purl,
44+
result: JSON.stringify(result),
45+
metadataLastModified: metadataLastModified ?? null,
46+
bumpLastRunAt,
47+
},
3848
)
3949
}
4050

0 commit comments

Comments
 (0)