Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/queue/job-dispatch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,13 @@ export async function processJob(env: Env, message: JobMessage): Promise<void> {
return;
case "backfill-registered-repos":
if (!message.repoFullName && message.requestedBy !== "test") {
// #5021 retargeted the two downstream entry points (backfillRegisteredRepositories,
// enqueueRepositoryOpenDataBackfill) from isRegistered to isInstalled, but this cron-scheduled
// fan-out is the actual candidate-selection step for the periodic sweep, and was left on
// isRegistered -- an installed-but-not-subnet-registered repo never got a per-repo job dispatched
// for it in the first place, so #5021's fix never took effect on the real 30-min cron path.
const repositories = (await listRepositories(env)).filter(
(repo) => repo.isRegistered,
(repo) => repo.isInstalled,
);
if (repositories.length > 0) {
const delayStepSeconds =
Expand Down
6 changes: 5 additions & 1 deletion test/unit/queue-2.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3131,11 +3131,15 @@ describe("queue processors", () => {
"we-promise/sure": { emission_share: 0.02, issue_discovery_share: 0, label_multipliers: {}, trusted_label_pipeline: false },
},
{ kind: "raw-github", url: "fixture://registry" },
"2026-05-25T00:00:00.000Z",
"2026-05-23T00:00:00.000Z",
),
);
// The cron fan-out now gates on isInstalled, not isRegistered.
await upsertRepositoryFromGitHub(env, { name: "gittensory", full_name: "JSONbored/gittensory", private: true, owner: { login: "JSONbored" } }, 9408);
await upsertRepositoryFromGitHub(env, { name: "sure", full_name: "we-promise/sure", private: true, owner: { login: "we-promise" } }, 9409);
vi.stubGlobal("fetch", async (input: RequestInfo | URL) => {
const url = input.toString();
if (url.includes("/access_tokens")) return Response.json({ token: "installation-token" });
if (url === "https://github.com/@api/graphql") {
return Response.json({
data: {
Expand Down
29 changes: 28 additions & 1 deletion test/unit/queue.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -678,9 +678,12 @@ describe("queue processors", () => {
"we-promise/sure": { emission_share: 0.02, issue_discovery_share: 0, label_multipliers: {}, trusted_label_pipeline: false },
},
{ kind: "raw-github", url: "fixture://registry" },
"2026-05-25T00:00:00.000Z",
"2026-05-23T00:00:00.000Z",
),
);
// The cron fan-out now gates on isInstalled, not isRegistered (completes #5021's real cron-path fix).
await upsertRepositoryFromGitHub(env, { name: "gittensory", full_name: "JSONbored/gittensory", private: true, owner: { login: "JSONbored" } }, 9405);
await upsertRepositoryFromGitHub(env, { name: "sure", full_name: "we-promise/sure", private: true, owner: { login: "we-promise" } }, 9406);

await processJob(env, { type: "backfill-registered-repos", requestedBy: "api", force: true, mode: "full" });

Expand All @@ -691,6 +694,30 @@ describe("queue processors", () => {
expect(await listRepoSyncStates(env)).toEqual([]);
});

it("#cron-backfill-dispatch-isinstalled: cron fan-out includes an installed-but-not-registered repo and excludes a registered-but-not-installed one", async () => {
const sent: import("../../src/types").JobMessage[] = [];
const env = createTestEnv({
JOBS: {
async send(message: import("../../src/types").JobMessage) {
sent.push(message);
},
} as unknown as Queue,
});
await persistRegistrySnapshot(
env,
normalizeRegistryPayload(
{ "acme/registered-only": { emission_share: 0.01, issue_discovery_share: 0, label_multipliers: {}, trusted_label_pipeline: false } },
{ kind: "raw-github", url: "fixture://registry" },
"2026-05-23T00:00:00.000Z",
),
);
await upsertRepositoryFromGitHub(env, { name: "installed-only", full_name: "acme/installed-only", private: false, owner: { login: "acme" } }, 9407);

await processJob(env, { type: "backfill-registered-repos", requestedBy: "api" });

expect(sent).toEqual([expect.objectContaining({ type: "backfill-registered-repos", repoFullName: "acme/installed-only" })]);
});

it("falls back to inline all-repo backfill when no registered repositories exist", async () => {
const sent: import("../../src/types").JobMessage[] = [];
const env = createTestEnv({
Expand Down