zoekt index storage: per-owner accounting now; tier gating blocked on upstream (quota can't count it) #162
Etiketter
Inga etiketter
area/backups
area/ci
area/control-panel
area/identity
area/infra
area/observability
area/payments
area/security
area/storage
area/web
blocked
needs-info
needs-triage
ready-for-implementation
type
bug
type
chore
type
docs
type
epic
type
feature
type
task
wontfix
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Inget förfallodatum satt.
Beroenden
Inga beroenden satta
Referens
bitborg/bitborg-infra#162
Läser in…
Hänvisa till i nytt ärende
Ingen beskrivning angiven.
Ta bort grenen "%!s()"
Borttagning av en gren är permanent. Även om den borttagna grenen kan fortsätta existera en kort tid innan den faktiskt tas bort, kan det INTE ångras i de flesta fall. Vill du fortsätta?
Investigated whether Zoekt index storage (
/var/lib/gitea/indexers/repos.zoekt, up to ~6× the repo footprint — #76) can be charged to user quota, and whether code indexing can be made opt-in / a tier entitlement.Findings (Forgejo v16.0, verified in source)
1. Zoekt bytes cannot be counted in Forgejo's quota engine. The full v16 quota-subject list (
models/quota/limit_subject.go:size:all,size:repos:*,size:git:all,size:git:lfs,size:assets:*) has no indexer subject, and usage is computed purely from DB columns (models/quota/used.go:repository.git_size,lfs_size, attachment/artifact/package sizes) — indexer disk is never measured. There is no quota rule we can write for it.2. Per-repo attribution out-of-band is easy. Shard files are named by numeric repo ID (
modules/indexer/code/zoekt/zoekt.go: zoekt repo name =repo.ID, deletes match the<repoID>_vprefix,ShardMax512 MiB). Soduover<repoID>_v*prefixes + repo-ID→owner mapping gives exact per-owner index footprints.3. Opt-in / per-tier indexing is NOT possible in v16.
REPO_INDEXER_INCLUDE/EXCLUDEglob file paths inside repos, not owners/repos (modules/setting/indexer.go) — a reconciler-generated<user>/**pattern is a dead end.REPO_INDEXER_REPO_TYPESfilters only by category (sources/forks/mirrors/templates).is_code_indexer_enabledcolumn) is open/unmerged and targets post-16.0. When it lands (and if API-exposed), the reconciler can default-deny and enable per tier — the ADR 0018 actions-unit pattern.repo_indexer_status; shards regenerate on next push).Plan
indexers/repos.zoekt/<repoID>_v*per owner → node_exporter metric (e.g.gitborg_zoekt_bytes{owner=…}) + Grafana alert on totalindexers/growth and per-owner outliers (N× tier repo quota). Read-only, ~half a day.Refs: #76 (zoekt rollout), ADRs 0014–0017 (tiers/quota via reconciler).
Sources: https://codeberg.org/forgejo/forgejo/raw/branch/v16.0/forgejo/models/quota/limit_subject.go · …/models/quota/used.go · …/modules/indexer/code/zoekt/zoekt.go · …/modules/setting/indexer.go · https://codeberg.org/forgejo/forgejo/pulls/8106 · https://forgejo.org/docs/latest/admin/quota/
Applied to prod 2026-07-20 (PR #165). Verified in the running container:
Forgejo restarted cleanly; health gate green (postgres/kanidm/forgejo/web/caddy active, all public endpoints serving). Zoekt is off and the shards are reclaimed. Closing — re-enable tracked by the "Forgejo PR 8106" trigger noted in the runbook.