Let cog_open() cap DuckDB threads (USCOGDATA_DUCKDB_THREADS) #60
Closed
opened 2026-08-09 11:21:17 -04:00 by jared
·
0 comments
No Branch/Tag Specified
main
ci/mirror-canonical-tags
chore/release-47-badges-mirror-pr
docs/readme-perf-remeasure-56
feat/pagination-search-balances-57
feat/duckdb-threads-60
feat/cohort-predicates-58
fix/windows-backslash-paths
ci/mirror-to-github
ci/github-actions-matrix
feat/public-release-0.3.0
chore/fixture-sb203
ci/apt-https
fix/pushdown-pagination
feat/all-categories-37
fix/partial-coverage-signposting-9
fix/schema-v7
fix/cog-categories-balance-subtype
feat/cog-balances-25
feat/revenue-concepts-12
feat/expenditure-concepts-11
feat/coverage-disclosure-13
feat/complete-argument-18
fix/kodor-batch-14-15-16
fix/all-scoped-series-breaks-19
fix/regen-fixture-corpus-18
test/walkthrough-findings
feat/expenditure-concept
fix/3-url-trailing-slash
feat/phase-r3-signposting
fix/fixture-option-b-aggregates
feat/phase-r2-harmonization
feat/phase-r1-forward
feat/cog-gov-search-basket-mode
v0.4.0
Labels
Clear labels
kodor
kodor/feature-proposal
kodor/fix
kodor/needs-review
kodor/triaged
madison-walkthrough
severity/high
severity/low
severity/medium
south-guide
verdict/defect
verdict/definitional
kodor
kodor/feature-proposal
kodor/fix
kodor/needs-review
kodor/triaged
Kodor should process this issue
Kodor has written a feature proposal
Kodor should implement a fix (assigned to Kodor)
Kodor's work or failure needs Jared's review
Kodor has already triaged this issue (skip)
Surfaced while building the client-facing Southern API guide
needs
human
Cannot move without a person -- a decision, a check an agent cannot make, something outside the repo
origin
client
Came from a client ask
origin
obligation
Created by a change elsewhere
origin
review
Came from human review
origin
roborev
Promoted from a roborev finding
type
chore
Maintenance with no behaviour change
type
debt
Owed work -- docs, tests, cleanup a change obligated
type
decision
Needs a decision before work can proceed
type
defect
Something is wrong
type
feature
New capability
ws
api
Query verbs and results
ws
corpus
Corpus, mirror, provenance
ws
docs
Vignettes and guides
Assign a task to kodor
Kodor thinks this needs a feature.
Kodor should fix this
Kodor thinks the user is ready to review this.
Kodor is done with this issue.
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Civilytics/uscogdata#60
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
cog_open()connects with a bareDBI::dbConnect(duckdb::duckdb())and sets nothreadspragma, so DuckDB claims every core it can see.
That is right for a single interactive session on a dedicated machine, and wrong for a
server. cog-api now runs two replicas on a host with 8 cores that is shared with other
services and is budgeted 4 for the API. Without a cap, each replica independently claims
all 8 and they fight; with a cap, two replicas fit the budget and a wedged one cannot
starve the box.
Current workaround (please replace it)
cog-api reaches into the namespace at boot, which is not something a consumer should be
doing:
It is wrapped in
tryCatchand degrades to DuckDB's default rather than failing boot, butit depends on an internal name and on the session already being open.
Ask
Have
cog_open()honour an option/env var —USCOGDATA_DUCKDB_THREADS, following theexisting
USCOGDATA_URLprecedence (env var >options()> default) — and apply it whenthe connection is created. Unset keeps today's behaviour exactly, so this is additive.
memory_limitwould be worth the same treatment for the same reason, if it is cheap toadd alongside.
Measured cost of capping
Roughly 5%: a single-government all-years query took 502 ms capped at 2 threads vs 475 ms
uncapped on 16 cores. Cheap enough that a server should always cap, which is the argument
for making it a supported option rather than a workaround.