fix(worker): reindex repos with missing zoekt shards - #1350

Closed
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex
Closed

fix(worker): reindex repos with missing zoekt shards#1350
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex

Conversation

@RitwijParmar

@RitwijParmarRitwijParmar commented Jun 18, 2026

Copy link
Copy Markdown

Fixes#1210

Summary

  • detect indexed repos whose committed zoekt shard files are missing on worker startup
  • mark those repos stale and queue reindex jobs, while skipping repos that already have pending or in-progress index work
  • ignore temporary shard files so failed partial indexes do not count as searchable shards

Verification

  • yarn workspace @sourcebot/backend test repoIndexManager.test.ts
  • yarn workspace @sourcebot/backend test
  • yarn workspace @sourcebot/backend build

Summary by CodeRabbit

  • Bug Fixes
    • Fixed cases where repositories appeared indexed in the database but were missing their on-disk search shard files, which previously prevented automatic re-indexing.
    • On worker startup, the system now detects these mismatches, marks affected repositories for re-indexing, and schedules the required reindex jobs.
  • Tests
    • Added coverage to validate the new startup reconciliation behavior and job scheduling for stale repositories.

@RitwijParmar
RitwijParmar marked this pull request as ready for review June 18, 2026 19:33
@coderabbitai

coderabbitaiBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4819eed0-eafb-4da9-94b0-8f5e74f5677d

📥 Commits

Reviewing files that changed from the base of the PR and between 5f268f1 and b24f26f.

📒 Files selected for processing (2)
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/backend/src/repoIndexManager.ts
  • packages/backend/src/repoIndexManager.test.ts

Walkthrough

Adds a startup reconciliation step to RepoIndexManager that scans INDEX_CACHE_DIR for .zoekt shard files, identifies DB-indexed repos with no corresponding shard on disk, resets their indexed state in batches via updateMany, and enqueues new INDEX jobs. A new test suite and changelog entry accompany the change.

Changes

Shard-Missing Startup Reconciliation

Layer / File(s)Summary
Core reconciliation method and startup wiring
packages/backend/src/repoIndexManager.ts, CHANGELOG.md
Adds STALE_REPO_UPDATE_BATCH_SIZE constant, wires a new reconciliation call into startScheduler() after orphaned disk cleanup, and implements the private method that reads .zoekt shard filenames, maps them to repo IDs via getRepoIdFromShardFileName, queries Prisma for indexed repos without active INDEX jobs in the timeout window, identifies repos with no shard file, clears indexedAt/indexedCommitHash in batched updateMany calls, logs warnings, and enqueues INDEX jobs via createJobs. Changelog entry added under Unreleased → Fixed.
Test mocks and startup reconciliation test
packages/backend/src/repoIndexManager.test.ts
Extends @sourcebot/shared, ./zoekt.js, and ./utils.js mocks with getRepoIdFromPath, REPOS_CACHE_DIR, cleanupTempShards, and getRepoIdFromShardFileName; adds updateMany to the Prisma repo mock; and adds a Startup Reconciliation test that mocks stale vs. healthy repo state, runs manager.startScheduler(), and asserts that repo.updateMany clears indexed markers for stale repos and that repo-index-job messages are enqueued with the correct payloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • sourcebot-dev/sourcebot#805: Both PRs involve Zoekt .tmp shard file handling in packages/backend/src/repoIndexManager.ts; #805 adds best-effort cleanup of .tmp shards on indexing failure, while the main PR's startup reconciliation explicitly excludes .tmp files when deciding which repos need reindexing.
  • sourcebot-dev/sourcebot#973: Both PRs modify RepoIndexManager.startScheduler() to add/await startup filesystem scans and shard/repo ID parsing helpers; the main PR extends the same startup flow by additionally scheduling reindex jobs for indexed repos missing .zoekt shards.

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'fix(worker): reindex repos with missing zoekt shards' directly describes the main change—automatic detection and recovery of indexed repositories with missing shard files.
Linked Issues check✅ PassedThe PR fully addresses the objectives from issue #1210: it detects repos marked indexed in DB but missing shard files, marks them stale, queues reindex jobs, skips active jobs, and ignores temp files.
Out of Scope Changes check✅ PassedAll changes directly implement the missing shard recovery mechanism specified in issue #1210. CHANGELOG and test additions support the core feature with no extraneous modifications.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 769-786: The startup reconciliation query in the findMany call on
this.db.repo is excluding repos with PENDING or IN_PROGRESS INDEX jobs without
checking if those jobs are actually stale. Modify the NOT.jobs.some condition to
additionally check if the job's createdAt or updatedAt timestamp is older than
repoIndexTimeoutMs by adding a time-based filter (e.g., createdAt greater than
current time minus repoIndexTimeoutMs). This ensures that only active, non-stale
jobs prevent the repo from being included in the startup reconciliation,
allowing stale jobs to be properly recovered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bd2948c-857a-438a-8c6f-f20a93b745aa

📥 Commits

Reviewing files that changed from the base of the PR and between 9320065 and 5f268f1.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts

Comment threadpackages/backend/src/repoIndexManager.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug/rfe] Rebuild or mark repos stale when zoekt shard files are missing but DB marks repos indexed

2 participants

@RitwijParmar@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(worker): reindex repos with missing zoekt shards - #1350

Closed
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex
Closed

fix(worker): reindex repos with missing zoekt shards#1350
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex

Conversation

@RitwijParmar

@RitwijParmarRitwijParmar commented Jun 18, 2026

Copy link
Copy Markdown

Fixes#1210

Summary

  • detect indexed repos whose committed zoekt shard files are missing on worker startup
  • mark those repos stale and queue reindex jobs, while skipping repos that already have pending or in-progress index work
  • ignore temporary shard files so failed partial indexes do not count as searchable shards

Verification

  • yarn workspace @sourcebot/backend test repoIndexManager.test.ts
  • yarn workspace @sourcebot/backend test
  • yarn workspace @sourcebot/backend build

Summary by CodeRabbit

  • Bug Fixes
    • Fixed cases where repositories appeared indexed in the database but were missing their on-disk search shard files, which previously prevented automatic re-indexing.
    • On worker startup, the system now detects these mismatches, marks affected repositories for re-indexing, and schedules the required reindex jobs.
  • Tests
    • Added coverage to validate the new startup reconciliation behavior and job scheduling for stale repositories.

@RitwijParmar
RitwijParmar marked this pull request as ready for review June 18, 2026 19:33
@coderabbitai

coderabbitaiBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4819eed0-eafb-4da9-94b0-8f5e74f5677d

📥 Commits

Reviewing files that changed from the base of the PR and between 5f268f1 and b24f26f.

📒 Files selected for processing (2)
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/backend/src/repoIndexManager.ts
  • packages/backend/src/repoIndexManager.test.ts

Walkthrough

Adds a startup reconciliation step to RepoIndexManager that scans INDEX_CACHE_DIR for .zoekt shard files, identifies DB-indexed repos with no corresponding shard on disk, resets their indexed state in batches via updateMany, and enqueues new INDEX jobs. A new test suite and changelog entry accompany the change.

Changes

Shard-Missing Startup Reconciliation

Layer / File(s)Summary
Core reconciliation method and startup wiring
packages/backend/src/repoIndexManager.ts, CHANGELOG.md
Adds STALE_REPO_UPDATE_BATCH_SIZE constant, wires a new reconciliation call into startScheduler() after orphaned disk cleanup, and implements the private method that reads .zoekt shard filenames, maps them to repo IDs via getRepoIdFromShardFileName, queries Prisma for indexed repos without active INDEX jobs in the timeout window, identifies repos with no shard file, clears indexedAt/indexedCommitHash in batched updateMany calls, logs warnings, and enqueues INDEX jobs via createJobs. Changelog entry added under Unreleased → Fixed.
Test mocks and startup reconciliation test
packages/backend/src/repoIndexManager.test.ts
Extends @sourcebot/shared, ./zoekt.js, and ./utils.js mocks with getRepoIdFromPath, REPOS_CACHE_DIR, cleanupTempShards, and getRepoIdFromShardFileName; adds updateMany to the Prisma repo mock; and adds a Startup Reconciliation test that mocks stale vs. healthy repo state, runs manager.startScheduler(), and asserts that repo.updateMany clears indexed markers for stale repos and that repo-index-job messages are enqueued with the correct payloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • sourcebot-dev/sourcebot#805: Both PRs involve Zoekt .tmp shard file handling in packages/backend/src/repoIndexManager.ts; #805 adds best-effort cleanup of .tmp shards on indexing failure, while the main PR's startup reconciliation explicitly excludes .tmp files when deciding which repos need reindexing.
  • sourcebot-dev/sourcebot#973: Both PRs modify RepoIndexManager.startScheduler() to add/await startup filesystem scans and shard/repo ID parsing helpers; the main PR extends the same startup flow by additionally scheduling reindex jobs for indexed repos missing .zoekt shards.

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'fix(worker): reindex repos with missing zoekt shards' directly describes the main change—automatic detection and recovery of indexed repositories with missing shard files.
Linked Issues check✅ PassedThe PR fully addresses the objectives from issue #1210: it detects repos marked indexed in DB but missing shard files, marks them stale, queues reindex jobs, skips active jobs, and ignores temp files.
Out of Scope Changes check✅ PassedAll changes directly implement the missing shard recovery mechanism specified in issue #1210. CHANGELOG and test additions support the core feature with no extraneous modifications.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 769-786: The startup reconciliation query in the findMany call on
this.db.repo is excluding repos with PENDING or IN_PROGRESS INDEX jobs without
checking if those jobs are actually stale. Modify the NOT.jobs.some condition to
additionally check if the job's createdAt or updatedAt timestamp is older than
repoIndexTimeoutMs by adding a time-based filter (e.g., createdAt greater than
current time minus repoIndexTimeoutMs). This ensures that only active, non-stale
jobs prevent the repo from being included in the startup reconciliation,
allowing stale jobs to be properly recovered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bd2948c-857a-438a-8c6f-f20a93b745aa

📥 Commits

Reviewing files that changed from the base of the PR and between 9320065 and 5f268f1.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts

Comment threadpackages/backend/src/repoIndexManager.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug/rfe] Rebuild or mark repos stale when zoekt shard files are missing but DB marks repos indexed

2 participants

@RitwijParmar@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(worker): reindex repos with missing zoekt shards - #1350

Closed
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex
Closed

fix(worker): reindex repos with missing zoekt shards#1350
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex

Conversation

@RitwijParmar

@RitwijParmarRitwijParmar commented Jun 18, 2026

Copy link
Copy Markdown

Fixes#1210

Summary

  • detect indexed repos whose committed zoekt shard files are missing on worker startup
  • mark those repos stale and queue reindex jobs, while skipping repos that already have pending or in-progress index work
  • ignore temporary shard files so failed partial indexes do not count as searchable shards

Verification

  • yarn workspace @sourcebot/backend test repoIndexManager.test.ts
  • yarn workspace @sourcebot/backend test
  • yarn workspace @sourcebot/backend build

Summary by CodeRabbit

  • Bug Fixes
    • Fixed cases where repositories appeared indexed in the database but were missing their on-disk search shard files, which previously prevented automatic re-indexing.
    • On worker startup, the system now detects these mismatches, marks affected repositories for re-indexing, and schedules the required reindex jobs.
  • Tests
    • Added coverage to validate the new startup reconciliation behavior and job scheduling for stale repositories.

@RitwijParmar
RitwijParmar marked this pull request as ready for review June 18, 2026 19:33
@coderabbitai

coderabbitaiBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4819eed0-eafb-4da9-94b0-8f5e74f5677d

📥 Commits

Reviewing files that changed from the base of the PR and between 5f268f1 and b24f26f.

📒 Files selected for processing (2)
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/backend/src/repoIndexManager.ts
  • packages/backend/src/repoIndexManager.test.ts

Walkthrough

Adds a startup reconciliation step to RepoIndexManager that scans INDEX_CACHE_DIR for .zoekt shard files, identifies DB-indexed repos with no corresponding shard on disk, resets their indexed state in batches via updateMany, and enqueues new INDEX jobs. A new test suite and changelog entry accompany the change.

Changes

Shard-Missing Startup Reconciliation

Layer / File(s)Summary
Core reconciliation method and startup wiring
packages/backend/src/repoIndexManager.ts, CHANGELOG.md
Adds STALE_REPO_UPDATE_BATCH_SIZE constant, wires a new reconciliation call into startScheduler() after orphaned disk cleanup, and implements the private method that reads .zoekt shard filenames, maps them to repo IDs via getRepoIdFromShardFileName, queries Prisma for indexed repos without active INDEX jobs in the timeout window, identifies repos with no shard file, clears indexedAt/indexedCommitHash in batched updateMany calls, logs warnings, and enqueues INDEX jobs via createJobs. Changelog entry added under Unreleased → Fixed.
Test mocks and startup reconciliation test
packages/backend/src/repoIndexManager.test.ts
Extends @sourcebot/shared, ./zoekt.js, and ./utils.js mocks with getRepoIdFromPath, REPOS_CACHE_DIR, cleanupTempShards, and getRepoIdFromShardFileName; adds updateMany to the Prisma repo mock; and adds a Startup Reconciliation test that mocks stale vs. healthy repo state, runs manager.startScheduler(), and asserts that repo.updateMany clears indexed markers for stale repos and that repo-index-job messages are enqueued with the correct payloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • sourcebot-dev/sourcebot#805: Both PRs involve Zoekt .tmp shard file handling in packages/backend/src/repoIndexManager.ts; #805 adds best-effort cleanup of .tmp shards on indexing failure, while the main PR's startup reconciliation explicitly excludes .tmp files when deciding which repos need reindexing.
  • sourcebot-dev/sourcebot#973: Both PRs modify RepoIndexManager.startScheduler() to add/await startup filesystem scans and shard/repo ID parsing helpers; the main PR extends the same startup flow by additionally scheduling reindex jobs for indexed repos missing .zoekt shards.

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'fix(worker): reindex repos with missing zoekt shards' directly describes the main change—automatic detection and recovery of indexed repositories with missing shard files.
Linked Issues check✅ PassedThe PR fully addresses the objectives from issue #1210: it detects repos marked indexed in DB but missing shard files, marks them stale, queues reindex jobs, skips active jobs, and ignores temp files.
Out of Scope Changes check✅ PassedAll changes directly implement the missing shard recovery mechanism specified in issue #1210. CHANGELOG and test additions support the core feature with no extraneous modifications.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 769-786: The startup reconciliation query in the findMany call on
this.db.repo is excluding repos with PENDING or IN_PROGRESS INDEX jobs without
checking if those jobs are actually stale. Modify the NOT.jobs.some condition to
additionally check if the job's createdAt or updatedAt timestamp is older than
repoIndexTimeoutMs by adding a time-based filter (e.g., createdAt greater than
current time minus repoIndexTimeoutMs). This ensures that only active, non-stale
jobs prevent the repo from being included in the startup reconciliation,
allowing stale jobs to be properly recovered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bd2948c-857a-438a-8c6f-f20a93b745aa

📥 Commits

Reviewing files that changed from the base of the PR and between 9320065 and 5f268f1.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts

Comment threadpackages/backend/src/repoIndexManager.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug/rfe] Rebuild or mark repos stale when zoekt shard files are missing but DB marks repos indexed

2 participants

@RitwijParmar@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(worker): reindex repos with missing zoekt shards - #1350

Closed
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex
Closed

fix(worker): reindex repos with missing zoekt shards#1350
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex

Conversation

@RitwijParmar

@RitwijParmarRitwijParmar commented Jun 18, 2026

Copy link
Copy Markdown

Fixes#1210

Summary

  • detect indexed repos whose committed zoekt shard files are missing on worker startup
  • mark those repos stale and queue reindex jobs, while skipping repos that already have pending or in-progress index work
  • ignore temporary shard files so failed partial indexes do not count as searchable shards

Verification

  • yarn workspace @sourcebot/backend test repoIndexManager.test.ts
  • yarn workspace @sourcebot/backend test
  • yarn workspace @sourcebot/backend build

Summary by CodeRabbit

  • Bug Fixes
    • Fixed cases where repositories appeared indexed in the database but were missing their on-disk search shard files, which previously prevented automatic re-indexing.
    • On worker startup, the system now detects these mismatches, marks affected repositories for re-indexing, and schedules the required reindex jobs.
  • Tests
    • Added coverage to validate the new startup reconciliation behavior and job scheduling for stale repositories.

@RitwijParmar
RitwijParmar marked this pull request as ready for review June 18, 2026 19:33
@coderabbitai

coderabbitaiBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4819eed0-eafb-4da9-94b0-8f5e74f5677d

📥 Commits

Reviewing files that changed from the base of the PR and between 5f268f1 and b24f26f.

📒 Files selected for processing (2)
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/backend/src/repoIndexManager.ts
  • packages/backend/src/repoIndexManager.test.ts

Walkthrough

Adds a startup reconciliation step to RepoIndexManager that scans INDEX_CACHE_DIR for .zoekt shard files, identifies DB-indexed repos with no corresponding shard on disk, resets their indexed state in batches via updateMany, and enqueues new INDEX jobs. A new test suite and changelog entry accompany the change.

Changes

Shard-Missing Startup Reconciliation

Layer / File(s)Summary
Core reconciliation method and startup wiring
packages/backend/src/repoIndexManager.ts, CHANGELOG.md
Adds STALE_REPO_UPDATE_BATCH_SIZE constant, wires a new reconciliation call into startScheduler() after orphaned disk cleanup, and implements the private method that reads .zoekt shard filenames, maps them to repo IDs via getRepoIdFromShardFileName, queries Prisma for indexed repos without active INDEX jobs in the timeout window, identifies repos with no shard file, clears indexedAt/indexedCommitHash in batched updateMany calls, logs warnings, and enqueues INDEX jobs via createJobs. Changelog entry added under Unreleased → Fixed.
Test mocks and startup reconciliation test
packages/backend/src/repoIndexManager.test.ts
Extends @sourcebot/shared, ./zoekt.js, and ./utils.js mocks with getRepoIdFromPath, REPOS_CACHE_DIR, cleanupTempShards, and getRepoIdFromShardFileName; adds updateMany to the Prisma repo mock; and adds a Startup Reconciliation test that mocks stale vs. healthy repo state, runs manager.startScheduler(), and asserts that repo.updateMany clears indexed markers for stale repos and that repo-index-job messages are enqueued with the correct payloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • sourcebot-dev/sourcebot#805: Both PRs involve Zoekt .tmp shard file handling in packages/backend/src/repoIndexManager.ts; #805 adds best-effort cleanup of .tmp shards on indexing failure, while the main PR's startup reconciliation explicitly excludes .tmp files when deciding which repos need reindexing.
  • sourcebot-dev/sourcebot#973: Both PRs modify RepoIndexManager.startScheduler() to add/await startup filesystem scans and shard/repo ID parsing helpers; the main PR extends the same startup flow by additionally scheduling reindex jobs for indexed repos missing .zoekt shards.

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'fix(worker): reindex repos with missing zoekt shards' directly describes the main change—automatic detection and recovery of indexed repositories with missing shard files.
Linked Issues check✅ PassedThe PR fully addresses the objectives from issue #1210: it detects repos marked indexed in DB but missing shard files, marks them stale, queues reindex jobs, skips active jobs, and ignores temp files.
Out of Scope Changes check✅ PassedAll changes directly implement the missing shard recovery mechanism specified in issue #1210. CHANGELOG and test additions support the core feature with no extraneous modifications.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 769-786: The startup reconciliation query in the findMany call on
this.db.repo is excluding repos with PENDING or IN_PROGRESS INDEX jobs without
checking if those jobs are actually stale. Modify the NOT.jobs.some condition to
additionally check if the job's createdAt or updatedAt timestamp is older than
repoIndexTimeoutMs by adding a time-based filter (e.g., createdAt greater than
current time minus repoIndexTimeoutMs). This ensures that only active, non-stale
jobs prevent the repo from being included in the startup reconciliation,
allowing stale jobs to be properly recovered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bd2948c-857a-438a-8c6f-f20a93b745aa

📥 Commits

Reviewing files that changed from the base of the PR and between 9320065 and 5f268f1.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts

Comment threadpackages/backend/src/repoIndexManager.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug/rfe] Rebuild or mark repos stale when zoekt shard files are missing but DB marks repos indexed

2 participants

@RitwijParmar@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(worker): reindex repos with missing zoekt shards - #1350

Closed
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex
Closed

fix(worker): reindex repos with missing zoekt shards#1350
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex

Conversation

@RitwijParmar

@RitwijParmarRitwijParmar commented Jun 18, 2026

Copy link
Copy Markdown

Fixes#1210

Summary

  • detect indexed repos whose committed zoekt shard files are missing on worker startup
  • mark those repos stale and queue reindex jobs, while skipping repos that already have pending or in-progress index work
  • ignore temporary shard files so failed partial indexes do not count as searchable shards

Verification

  • yarn workspace @sourcebot/backend test repoIndexManager.test.ts
  • yarn workspace @sourcebot/backend test
  • yarn workspace @sourcebot/backend build

Summary by CodeRabbit

  • Bug Fixes
    • Fixed cases where repositories appeared indexed in the database but were missing their on-disk search shard files, which previously prevented automatic re-indexing.
    • On worker startup, the system now detects these mismatches, marks affected repositories for re-indexing, and schedules the required reindex jobs.
  • Tests
    • Added coverage to validate the new startup reconciliation behavior and job scheduling for stale repositories.

@RitwijParmar
RitwijParmar marked this pull request as ready for review June 18, 2026 19:33
@coderabbitai

coderabbitaiBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4819eed0-eafb-4da9-94b0-8f5e74f5677d

📥 Commits

Reviewing files that changed from the base of the PR and between 5f268f1 and b24f26f.

📒 Files selected for processing (2)
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/backend/src/repoIndexManager.ts
  • packages/backend/src/repoIndexManager.test.ts

Walkthrough

Adds a startup reconciliation step to RepoIndexManager that scans INDEX_CACHE_DIR for .zoekt shard files, identifies DB-indexed repos with no corresponding shard on disk, resets their indexed state in batches via updateMany, and enqueues new INDEX jobs. A new test suite and changelog entry accompany the change.

Changes

Shard-Missing Startup Reconciliation

Layer / File(s)Summary
Core reconciliation method and startup wiring
packages/backend/src/repoIndexManager.ts, CHANGELOG.md
Adds STALE_REPO_UPDATE_BATCH_SIZE constant, wires a new reconciliation call into startScheduler() after orphaned disk cleanup, and implements the private method that reads .zoekt shard filenames, maps them to repo IDs via getRepoIdFromShardFileName, queries Prisma for indexed repos without active INDEX jobs in the timeout window, identifies repos with no shard file, clears indexedAt/indexedCommitHash in batched updateMany calls, logs warnings, and enqueues INDEX jobs via createJobs. Changelog entry added under Unreleased → Fixed.
Test mocks and startup reconciliation test
packages/backend/src/repoIndexManager.test.ts
Extends @sourcebot/shared, ./zoekt.js, and ./utils.js mocks with getRepoIdFromPath, REPOS_CACHE_DIR, cleanupTempShards, and getRepoIdFromShardFileName; adds updateMany to the Prisma repo mock; and adds a Startup Reconciliation test that mocks stale vs. healthy repo state, runs manager.startScheduler(), and asserts that repo.updateMany clears indexed markers for stale repos and that repo-index-job messages are enqueued with the correct payloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • sourcebot-dev/sourcebot#805: Both PRs involve Zoekt .tmp shard file handling in packages/backend/src/repoIndexManager.ts; #805 adds best-effort cleanup of .tmp shards on indexing failure, while the main PR's startup reconciliation explicitly excludes .tmp files when deciding which repos need reindexing.
  • sourcebot-dev/sourcebot#973: Both PRs modify RepoIndexManager.startScheduler() to add/await startup filesystem scans and shard/repo ID parsing helpers; the main PR extends the same startup flow by additionally scheduling reindex jobs for indexed repos missing .zoekt shards.

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'fix(worker): reindex repos with missing zoekt shards' directly describes the main change—automatic detection and recovery of indexed repositories with missing shard files.
Linked Issues check✅ PassedThe PR fully addresses the objectives from issue #1210: it detects repos marked indexed in DB but missing shard files, marks them stale, queues reindex jobs, skips active jobs, and ignores temp files.
Out of Scope Changes check✅ PassedAll changes directly implement the missing shard recovery mechanism specified in issue #1210. CHANGELOG and test additions support the core feature with no extraneous modifications.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 769-786: The startup reconciliation query in the findMany call on
this.db.repo is excluding repos with PENDING or IN_PROGRESS INDEX jobs without
checking if those jobs are actually stale. Modify the NOT.jobs.some condition to
additionally check if the job's createdAt or updatedAt timestamp is older than
repoIndexTimeoutMs by adding a time-based filter (e.g., createdAt greater than
current time minus repoIndexTimeoutMs). This ensures that only active, non-stale
jobs prevent the repo from being included in the startup reconciliation,
allowing stale jobs to be properly recovered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bd2948c-857a-438a-8c6f-f20a93b745aa

📥 Commits

Reviewing files that changed from the base of the PR and between 9320065 and 5f268f1.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts

Comment threadpackages/backend/src/repoIndexManager.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug/rfe] Rebuild or mark repos stale when zoekt shard files are missing but DB marks repos indexed

2 participants

@RitwijParmar@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(worker): reindex repos with missing zoekt shards - #1350

Closed
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex
Closed

fix(worker): reindex repos with missing zoekt shards#1350
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex

Conversation

@RitwijParmar

@RitwijParmarRitwijParmar commented Jun 18, 2026

Copy link
Copy Markdown

Fixes#1210

Summary

  • detect indexed repos whose committed zoekt shard files are missing on worker startup
  • mark those repos stale and queue reindex jobs, while skipping repos that already have pending or in-progress index work
  • ignore temporary shard files so failed partial indexes do not count as searchable shards

Verification

  • yarn workspace @sourcebot/backend test repoIndexManager.test.ts
  • yarn workspace @sourcebot/backend test
  • yarn workspace @sourcebot/backend build

Summary by CodeRabbit

  • Bug Fixes
    • Fixed cases where repositories appeared indexed in the database but were missing their on-disk search shard files, which previously prevented automatic re-indexing.
    • On worker startup, the system now detects these mismatches, marks affected repositories for re-indexing, and schedules the required reindex jobs.
  • Tests
    • Added coverage to validate the new startup reconciliation behavior and job scheduling for stale repositories.

@RitwijParmar
RitwijParmar marked this pull request as ready for review June 18, 2026 19:33
@coderabbitai

coderabbitaiBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4819eed0-eafb-4da9-94b0-8f5e74f5677d

📥 Commits

Reviewing files that changed from the base of the PR and between 5f268f1 and b24f26f.

📒 Files selected for processing (2)
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/backend/src/repoIndexManager.ts
  • packages/backend/src/repoIndexManager.test.ts

Walkthrough

Adds a startup reconciliation step to RepoIndexManager that scans INDEX_CACHE_DIR for .zoekt shard files, identifies DB-indexed repos with no corresponding shard on disk, resets their indexed state in batches via updateMany, and enqueues new INDEX jobs. A new test suite and changelog entry accompany the change.

Changes

Shard-Missing Startup Reconciliation

Layer / File(s)Summary
Core reconciliation method and startup wiring
packages/backend/src/repoIndexManager.ts, CHANGELOG.md
Adds STALE_REPO_UPDATE_BATCH_SIZE constant, wires a new reconciliation call into startScheduler() after orphaned disk cleanup, and implements the private method that reads .zoekt shard filenames, maps them to repo IDs via getRepoIdFromShardFileName, queries Prisma for indexed repos without active INDEX jobs in the timeout window, identifies repos with no shard file, clears indexedAt/indexedCommitHash in batched updateMany calls, logs warnings, and enqueues INDEX jobs via createJobs. Changelog entry added under Unreleased → Fixed.
Test mocks and startup reconciliation test
packages/backend/src/repoIndexManager.test.ts
Extends @sourcebot/shared, ./zoekt.js, and ./utils.js mocks with getRepoIdFromPath, REPOS_CACHE_DIR, cleanupTempShards, and getRepoIdFromShardFileName; adds updateMany to the Prisma repo mock; and adds a Startup Reconciliation test that mocks stale vs. healthy repo state, runs manager.startScheduler(), and asserts that repo.updateMany clears indexed markers for stale repos and that repo-index-job messages are enqueued with the correct payloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • sourcebot-dev/sourcebot#805: Both PRs involve Zoekt .tmp shard file handling in packages/backend/src/repoIndexManager.ts; #805 adds best-effort cleanup of .tmp shards on indexing failure, while the main PR's startup reconciliation explicitly excludes .tmp files when deciding which repos need reindexing.
  • sourcebot-dev/sourcebot#973: Both PRs modify RepoIndexManager.startScheduler() to add/await startup filesystem scans and shard/repo ID parsing helpers; the main PR extends the same startup flow by additionally scheduling reindex jobs for indexed repos missing .zoekt shards.

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'fix(worker): reindex repos with missing zoekt shards' directly describes the main change—automatic detection and recovery of indexed repositories with missing shard files.
Linked Issues check✅ PassedThe PR fully addresses the objectives from issue #1210: it detects repos marked indexed in DB but missing shard files, marks them stale, queues reindex jobs, skips active jobs, and ignores temp files.
Out of Scope Changes check✅ PassedAll changes directly implement the missing shard recovery mechanism specified in issue #1210. CHANGELOG and test additions support the core feature with no extraneous modifications.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 769-786: The startup reconciliation query in the findMany call on
this.db.repo is excluding repos with PENDING or IN_PROGRESS INDEX jobs without
checking if those jobs are actually stale. Modify the NOT.jobs.some condition to
additionally check if the job's createdAt or updatedAt timestamp is older than
repoIndexTimeoutMs by adding a time-based filter (e.g., createdAt greater than
current time minus repoIndexTimeoutMs). This ensures that only active, non-stale
jobs prevent the repo from being included in the startup reconciliation,
allowing stale jobs to be properly recovered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bd2948c-857a-438a-8c6f-f20a93b745aa

📥 Commits

Reviewing files that changed from the base of the PR and between 9320065 and 5f268f1.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts

Comment threadpackages/backend/src/repoIndexManager.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug/rfe] Rebuild or mark repos stale when zoekt shard files are missing but DB marks repos indexed

2 participants

@RitwijParmar@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(worker): reindex repos with missing zoekt shards - #1350

Closed
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex
Closed

fix(worker): reindex repos with missing zoekt shards#1350
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex

Conversation

@RitwijParmar

@RitwijParmarRitwijParmar commented Jun 18, 2026

Copy link
Copy Markdown

Fixes#1210

Summary

  • detect indexed repos whose committed zoekt shard files are missing on worker startup
  • mark those repos stale and queue reindex jobs, while skipping repos that already have pending or in-progress index work
  • ignore temporary shard files so failed partial indexes do not count as searchable shards

Verification

  • yarn workspace @sourcebot/backend test repoIndexManager.test.ts
  • yarn workspace @sourcebot/backend test
  • yarn workspace @sourcebot/backend build

Summary by CodeRabbit

  • Bug Fixes
    • Fixed cases where repositories appeared indexed in the database but were missing their on-disk search shard files, which previously prevented automatic re-indexing.
    • On worker startup, the system now detects these mismatches, marks affected repositories for re-indexing, and schedules the required reindex jobs.
  • Tests
    • Added coverage to validate the new startup reconciliation behavior and job scheduling for stale repositories.

@RitwijParmar
RitwijParmar marked this pull request as ready for review June 18, 2026 19:33
@coderabbitai

coderabbitaiBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4819eed0-eafb-4da9-94b0-8f5e74f5677d

📥 Commits

Reviewing files that changed from the base of the PR and between 5f268f1 and b24f26f.

📒 Files selected for processing (2)
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/backend/src/repoIndexManager.ts
  • packages/backend/src/repoIndexManager.test.ts

Walkthrough

Adds a startup reconciliation step to RepoIndexManager that scans INDEX_CACHE_DIR for .zoekt shard files, identifies DB-indexed repos with no corresponding shard on disk, resets their indexed state in batches via updateMany, and enqueues new INDEX jobs. A new test suite and changelog entry accompany the change.

Changes

Shard-Missing Startup Reconciliation

Layer / File(s)Summary
Core reconciliation method and startup wiring
packages/backend/src/repoIndexManager.ts, CHANGELOG.md
Adds STALE_REPO_UPDATE_BATCH_SIZE constant, wires a new reconciliation call into startScheduler() after orphaned disk cleanup, and implements the private method that reads .zoekt shard filenames, maps them to repo IDs via getRepoIdFromShardFileName, queries Prisma for indexed repos without active INDEX jobs in the timeout window, identifies repos with no shard file, clears indexedAt/indexedCommitHash in batched updateMany calls, logs warnings, and enqueues INDEX jobs via createJobs. Changelog entry added under Unreleased → Fixed.
Test mocks and startup reconciliation test
packages/backend/src/repoIndexManager.test.ts
Extends @sourcebot/shared, ./zoekt.js, and ./utils.js mocks with getRepoIdFromPath, REPOS_CACHE_DIR, cleanupTempShards, and getRepoIdFromShardFileName; adds updateMany to the Prisma repo mock; and adds a Startup Reconciliation test that mocks stale vs. healthy repo state, runs manager.startScheduler(), and asserts that repo.updateMany clears indexed markers for stale repos and that repo-index-job messages are enqueued with the correct payloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • sourcebot-dev/sourcebot#805: Both PRs involve Zoekt .tmp shard file handling in packages/backend/src/repoIndexManager.ts; #805 adds best-effort cleanup of .tmp shards on indexing failure, while the main PR's startup reconciliation explicitly excludes .tmp files when deciding which repos need reindexing.
  • sourcebot-dev/sourcebot#973: Both PRs modify RepoIndexManager.startScheduler() to add/await startup filesystem scans and shard/repo ID parsing helpers; the main PR extends the same startup flow by additionally scheduling reindex jobs for indexed repos missing .zoekt shards.

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'fix(worker): reindex repos with missing zoekt shards' directly describes the main change—automatic detection and recovery of indexed repositories with missing shard files.
Linked Issues check✅ PassedThe PR fully addresses the objectives from issue #1210: it detects repos marked indexed in DB but missing shard files, marks them stale, queues reindex jobs, skips active jobs, and ignores temp files.
Out of Scope Changes check✅ PassedAll changes directly implement the missing shard recovery mechanism specified in issue #1210. CHANGELOG and test additions support the core feature with no extraneous modifications.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 769-786: The startup reconciliation query in the findMany call on
this.db.repo is excluding repos with PENDING or IN_PROGRESS INDEX jobs without
checking if those jobs are actually stale. Modify the NOT.jobs.some condition to
additionally check if the job's createdAt or updatedAt timestamp is older than
repoIndexTimeoutMs by adding a time-based filter (e.g., createdAt greater than
current time minus repoIndexTimeoutMs). This ensures that only active, non-stale
jobs prevent the repo from being included in the startup reconciliation,
allowing stale jobs to be properly recovered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bd2948c-857a-438a-8c6f-f20a93b745aa

📥 Commits

Reviewing files that changed from the base of the PR and between 9320065 and 5f268f1.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts

Comment threadpackages/backend/src/repoIndexManager.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug/rfe] Rebuild or mark repos stale when zoekt shard files are missing but DB marks repos indexed

2 participants

@RitwijParmar@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(worker): reindex repos with missing zoekt shards - #1350

Closed
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex
Closed

fix(worker): reindex repos with missing zoekt shards#1350
RitwijParmar wants to merge 3 commits into
sourcebot-dev:mainfrom
RitwijParmar:codex/sourcebot-missing-shards-reindex

Conversation

@RitwijParmar

@RitwijParmarRitwijParmar commented Jun 18, 2026

Copy link
Copy Markdown

Fixes#1210

Summary

  • detect indexed repos whose committed zoekt shard files are missing on worker startup
  • mark those repos stale and queue reindex jobs, while skipping repos that already have pending or in-progress index work
  • ignore temporary shard files so failed partial indexes do not count as searchable shards

Verification

  • yarn workspace @sourcebot/backend test repoIndexManager.test.ts
  • yarn workspace @sourcebot/backend test
  • yarn workspace @sourcebot/backend build

Summary by CodeRabbit

  • Bug Fixes
    • Fixed cases where repositories appeared indexed in the database but were missing their on-disk search shard files, which previously prevented automatic re-indexing.
    • On worker startup, the system now detects these mismatches, marks affected repositories for re-indexing, and schedules the required reindex jobs.
  • Tests
    • Added coverage to validate the new startup reconciliation behavior and job scheduling for stale repositories.

@RitwijParmar
RitwijParmar marked this pull request as ready for review June 18, 2026 19:33
@coderabbitai

coderabbitaiBot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4819eed0-eafb-4da9-94b0-8f5e74f5677d

📥 Commits

Reviewing files that changed from the base of the PR and between 5f268f1 and b24f26f.

📒 Files selected for processing (2)
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/backend/src/repoIndexManager.ts
  • packages/backend/src/repoIndexManager.test.ts

Walkthrough

Adds a startup reconciliation step to RepoIndexManager that scans INDEX_CACHE_DIR for .zoekt shard files, identifies DB-indexed repos with no corresponding shard on disk, resets their indexed state in batches via updateMany, and enqueues new INDEX jobs. A new test suite and changelog entry accompany the change.

Changes

Shard-Missing Startup Reconciliation

Layer / File(s)Summary
Core reconciliation method and startup wiring
packages/backend/src/repoIndexManager.ts, CHANGELOG.md
Adds STALE_REPO_UPDATE_BATCH_SIZE constant, wires a new reconciliation call into startScheduler() after orphaned disk cleanup, and implements the private method that reads .zoekt shard filenames, maps them to repo IDs via getRepoIdFromShardFileName, queries Prisma for indexed repos without active INDEX jobs in the timeout window, identifies repos with no shard file, clears indexedAt/indexedCommitHash in batched updateMany calls, logs warnings, and enqueues INDEX jobs via createJobs. Changelog entry added under Unreleased → Fixed.
Test mocks and startup reconciliation test
packages/backend/src/repoIndexManager.test.ts
Extends @sourcebot/shared, ./zoekt.js, and ./utils.js mocks with getRepoIdFromPath, REPOS_CACHE_DIR, cleanupTempShards, and getRepoIdFromShardFileName; adds updateMany to the Prisma repo mock; and adds a Startup Reconciliation test that mocks stale vs. healthy repo state, runs manager.startScheduler(), and asserts that repo.updateMany clears indexed markers for stale repos and that repo-index-job messages are enqueued with the correct payloads.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • sourcebot-dev/sourcebot#805: Both PRs involve Zoekt .tmp shard file handling in packages/backend/src/repoIndexManager.ts; #805 adds best-effort cleanup of .tmp shards on indexing failure, while the main PR's startup reconciliation explicitly excludes .tmp files when deciding which repos need reindexing.
  • sourcebot-dev/sourcebot#973: Both PRs modify RepoIndexManager.startScheduler() to add/await startup filesystem scans and shard/repo ID parsing helpers; the main PR extends the same startup flow by additionally scheduling reindex jobs for indexed repos missing .zoekt shards.

Suggested reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'fix(worker): reindex repos with missing zoekt shards' directly describes the main change—automatic detection and recovery of indexed repositories with missing shard files.
Linked Issues check✅ PassedThe PR fully addresses the objectives from issue #1210: it detects repos marked indexed in DB but missing shard files, marks them stale, queues reindex jobs, skips active jobs, and ignores temp files.
Out of Scope Changes check✅ PassedAll changes directly implement the missing shard recovery mechanism specified in issue #1210. CHANGELOG and test additions support the core feature with no extraneous modifications.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/backend/src/repoIndexManager.ts`:
- Around line 769-786: The startup reconciliation query in the findMany call on
this.db.repo is excluding repos with PENDING or IN_PROGRESS INDEX jobs without
checking if those jobs are actually stale. Modify the NOT.jobs.some condition to
additionally check if the job's createdAt or updatedAt timestamp is older than
repoIndexTimeoutMs by adding a time-based filter (e.g., createdAt greater than
current time minus repoIndexTimeoutMs). This ensures that only active, non-stale
jobs prevent the repo from being included in the startup reconciliation,
allowing stale jobs to be properly recovered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2bd2948c-857a-438a-8c6f-f20a93b745aa

📥 Commits

Reviewing files that changed from the base of the PR and between 9320065 and 5f268f1.

📒 Files selected for processing (3)
  • CHANGELOG.md
  • packages/backend/src/repoIndexManager.test.ts
  • packages/backend/src/repoIndexManager.ts

Comment threadpackages/backend/src/repoIndexManager.ts
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug/rfe] Rebuild or mark repos stale when zoekt shard files are missing but DB marks repos indexed

2 participants

@RitwijParmar@brendan-kellam