rivetkit 3.0: HTTP 400 overloaded on node pool upsert is treated as fatal and exits the process
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 78/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- rust
- Domain
- backend, distributed-systems
Research direction
Read rivetkit-rust/packages/rivetkit-core/src/registry/runner_config.rs, especially response_error, and trace how its retryable result reaches the existing retry loop. Treat response body code overloaded as retryable, then check the registry startup tests that reproduce overloaded node pool upserts; done when startup retries this response instead of exiting.
Written by the indexing model from the issue text.
Description
Summary
In rivetkit 3.0.0-preview.3, a registry that starts against a local engine exits the process when the engine answers the node pool upsert with HTTP 400 overloaded. The engine marks that answer as retryable ("retry after 100 ms"), but the client treats it as fatal.
Where
rivetkit-rust/packages/rivetkit-core/src/registry/runner_config.rs, response_error. It classifies only 404, 429, 5xx and body code not_found as retryable. The engine answers a warming or busy storage host with:
400 Bad Request {"code":"overloaded","group":"depot","message":"The storage host refused the command (routing_unavailable); retry after 100 ms."}
400 Bad Request {"code":"overloaded","group":"depot","message":"The storage host refused the command (command_capacity); retry after 100 ms."}
That error goes to ensure_local_normal_runner_config, then to serveRegistry, and rivetkit/dist/tsup/mod.js calls process.exit(1) on "runtime registry serve errored".
Reproduction
Single local engine, rivet-engine 3.0.0-preview.3 on macOS arm64, file-system object storage, storage.auto_provision_partitions=1, storage.balancing.enabled=false (the same settings as engine_env in rivetkit-rust/packages/engine-process).
Send PUT /pools/default?namespace=default with body {"drain_on_version_upgrade":true} every 100 ms:
- From engine start until about 1.7 s, every call gets
overloaded(routing_unavailable). - With 1 call at a time after that, every call succeeds.
- With 8 parallel calls, each round has one success and the other calls get
overloaded(command_capacity), for as long as the loop runs.
So a registry that starts in the first ~1.7 s after the engine, or at the same time as another registry against the same engine, ends its process. In our test suite this failed 6 of 23 tests in one file.
Expected
Treat body code overloaded as AttemptError::Retryable, so the existing 60 x 500 ms retry loop covers it.
Workaround
Before registry.startAndWait(), we send the same PUT ourselves, retry it on overloaded, and start one registry at a time in the process.
- Dominant language
- Rust
- Stars
- 6.5k
- Forks
- 291
- Avg merge
- 14h 38m
- Merged PRs (30d)
- 38
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from rivet-dev/rivet
-
effect: action on a missing actor instance fails as internal_error instead of actor.abortedPossibly taken @kunalgoesbyken claimed this 4 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
rivet-dev/rivet#5891 · 1 comment ·
Maintainers usually reply within 1 day
-
Rust client drops connection-level errors when actionId is null (JSON/CBOR)Possibly taken @DibbayajyotiRoy claimed this 26 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
rivet-dev/rivet#5819 · 1 comment ·
Maintainers usually reply within 1 day
-
Queue docs say completable messages are removed on receive, but they stay stored until complete()Possibly taken @Saisharathchandranandnetha claimed this 37 days ago. Open
Difficulty 1/5 1-3 hours Newbie friendliness 91/100
rivet-dev/rivet#5762 · 1 comment ·
Maintainers usually reply within 1 day
-
Serverless listener forwards /start to the application when basePath is "/"Possibly taken @Saisharathchandranandnetha claimed this 40 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
rivet-dev/rivet#5755 · 1 comment ·
Maintainers usually reply within 1 day
-
v3 engine: default InMemory object store with a persistent log_directory loses all metadata on restart, then refuses envoys with depot.corrupt ("record is lost")Possibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 4/5 3-5 days Newbie friendliness 48/100
rivet-dev/rivet#5932 · 3 comments ·
Maintainers usually reply within 1 day
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
swc-project/swc-next#1165 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 73/100
Alive24/shea-symphony#574 ·
-
bug tests Windows
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
documentation good first issue help wanted
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
dev-five-git/devup-ui#879 ·
Maintainers usually reply within 11 days
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
farion1231/cc-switch#9038 · 1 comment ·
Maintainers usually reply within 1 day