From baf38ddaaa030ce9a7a63acde82ca95e90cd95f6 Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Thu, 18 Jun 2026 17:15:49 -0700 Subject: [PATCH] Fix lock-closed-issues workflow: use search API instead of offset pagination (#69470) The workflow has been failing daily since 2026-04-27 with HTTP 422 "Pagination with the page parameter is not supported for large datasets" at page=100. The repo now has ~58k closed issues and the script was paging past ~10k already-locked ones every run before reaching any candidates. Replace listForRepo + page=N with the search API (is:issue is:closed is:unlocked updated: new Promise((r) => setTimeout(r, ms)); + const MAX_PER_RUN = 250; + const processed = new Set(); let totalLocked = 0; - while (hasMore) { - // Get closed issues (pagination) - const { data: issues } = await github.rest.issues.listForRepo({ - owner: context.repo.owner, - repo: context.repo.repo, - state: 'closed', + while (totalLocked < MAX_PER_RUN) { + const { data } = await github.rest.search.issuesAndPullRequests({ + q: query, sort: 'updated', - direction: 'asc', + order: 'asc', per_page: 100, - page: page }); - - if (issues.length === 0) { - hasMore = false; - break; + + if (totalLocked === 0) { + console.log(`Total candidates: ${data.total_count}`); } - - for (const issue of issues) { - // Skip if already locked - if (issue.locked) continue; - - // Skip pull requests - if (issue.pull_request) continue; - - // Check if updated more than 7 days ago - const updatedAt = new Date(issue.updated_at); - if (updatedAt > sevenDaysAgo) { - // Since issues are sorted by updated_at ascending, - // once we hit a recent issue, all remaining will be recent too - hasMore = false; - break; - } - + + const fresh = data.items.filter((i) => !processed.has(i.number)); + if (fresh.length === 0) break; + + for (const issue of fresh) { + if (totalLocked >= MAX_PER_RUN) break; + processed.add(issue.number); try { - // Add comment before locking await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, - body: lockComment + body: lockComment, }); - - // Lock the issue await github.rest.issues.lock({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, - lock_reason: 'resolved' + lock_reason: 'resolved', }); - totalLocked++; console.log(`Locked issue #${issue.number}: ${issue.title}`); + await sleep(1000); } catch (error) { console.error(`Failed to lock issue #${issue.number}: ${error.message}`); } } - - page++; } console.log(`Total issues locked: ${totalLocked}`);