Skip to content

Conversation

@gefjon
Copy link
Contributor

@gefjon gefjon commented Jul 13, 2023

Description of Changes

Prior to this commit, it was possible for a module to crash SpacetimeDB by scheduling a reducer with a delay longer than ~2yrs. This was due to our use of tokio_utils::time::DelayQueue to handle scheduling. DelayQueue's internal data structure imposes a limit of 64^6 ms on delays, a little more than two years.
Attempting to insert with a delay longer than that panics.

With this commit, we avoid the panic by checking ourselves that the requested delay is not longer than 64^6 ms.
This requires bubbling a ScheduleError up from Scheduler::schedule to WasmInstanceEnv::schedule, where it is converted into a RuntimeError which crashes the module.

Scheduler::schedule could also fail because its transaction to compute a new id was fallible. This seems unlikely to ever fail, and if it does, we have bigger problems, so unwrapping might still be reasonable for that case, but this commit converts it into a handle-able Error anyway, as there's essentially no cost in complexity to doing so.

API

  • This is a breaking change to the module API
  • This is a breaking change to the ClientAPI

If the API is breaking, please state below what will break

Prior to this commit, it was possible for a module to crash SpacetimeDB
by scheduling a reducer with a delay longer than ~2yrs.
This was due to our use of `tokio_utils::time::DelayQueue` to handle scheduling.
`DelayQueue`'s internal data structure imposes a limit of 64^6 ms on delays,
a little more than two years.
Attempting to insert with a delay longer than that panics.

With this commit, we avoid the panic by checking ourselves that the requested delay
is not longer than 64^6 ms.
This requires bubbling a `ScheduleError` up from `Scheduler::schedule`
to `WasmInstanceEnv::schedule`, where it is converted into a `RuntimeError`
which crashes the module.

`Scheduler::schedule` could also fail because its transaction to compute a new id
was fallible. This seems unlikely to ever fail, and if it does, we have bigger problems,
so `unwrap`ping might still be reasonable for that case,
but this commit converts it into a handle-able `Err`or anyway,
as there's essentially no cost in complexity to doing so.
@gefjon gefjon requested review from cloutiertyler and jdetter July 13, 2023 15:26
Copy link
Collaborator

@jdetter jdetter left a comment

Choose a reason for hiding this comment

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

Tested, SpacetimeDB no longer crashes. We don't really get a meaningful error in the case of using spacetime call from the command line:

Error: Response text: The Wasm instance encountered a fatal error.

Caused by:
    HTTP status server error (530 <unknown status code>) for url (http://localhost:3000/database/call/93dda09db9a56d8fa6c024d843e805d8/test)

And also it appears that the module logs are empty. I think this error is going to be extremely uncommon so this is fine for now.

@gefjon gefjon merged commit 882d4cf into master Jul 13, 2023
cloutiertyler pushed a commit that referenced this pull request Aug 1, 2023
Prior to this commit, it was possible for a module to crash SpacetimeDB
by scheduling a reducer with a delay longer than ~2yrs.
This was due to our use of `tokio_utils::time::DelayQueue` to handle scheduling.
`DelayQueue`'s internal data structure imposes a limit of 64^6 ms on delays,
a little more than two years.
Attempting to insert with a delay longer than that panics.

With this commit, we avoid the panic by checking ourselves that the requested delay
is not longer than 64^6 ms.
This requires bubbling a `ScheduleError` up from `Scheduler::schedule`
to `WasmInstanceEnv::schedule`, where it is converted into a `RuntimeError`
which crashes the module.

`Scheduler::schedule` could also fail because its transaction to compute a new id
was fallible. This seems unlikely to ever fail, and if it does, we have bigger problems,
so `unwrap`ping might still be reasonable for that case,
but this commit converts it into a handle-able `Err`or anyway,
as there's essentially no cost in complexity to doing so.
cloutiertyler pushed a commit that referenced this pull request Aug 1, 2023
Prior to this commit, it was possible for a module to crash SpacetimeDB
by scheduling a reducer with a delay longer than ~2yrs.
This was due to our use of `tokio_utils::time::DelayQueue` to handle scheduling.
`DelayQueue`'s internal data structure imposes a limit of 64^6 ms on delays,
a little more than two years.
Attempting to insert with a delay longer than that panics.

With this commit, we avoid the panic by checking ourselves that the requested delay
is not longer than 64^6 ms.
This requires bubbling a `ScheduleError` up from `Scheduler::schedule`
to `WasmInstanceEnv::schedule`, where it is converted into a `RuntimeError`
which crashes the module.

`Scheduler::schedule` could also fail because its transaction to compute a new id
was fallible. This seems unlikely to ever fail, and if it does, we have bigger problems,
so `unwrap`ping might still be reasonable for that case,
but this commit converts it into a handle-able `Err`or anyway,
as there's essentially no cost in complexity to doing so.
@cloutiertyler cloutiertyler deleted the phoebe/handle-schedule-duration-too-long branch August 1, 2023 21:55
bfops added a commit that referenced this pull request Jul 16, 2025
* Lint script

* modernize: pnpm & prettier (#51)

* Push

* Push

* Run prettier

* Prettier stuff

* modernize: Remove Husky & pre-commit (#53)

* modernize: tsup (#54)

* Push

* jest

* modernize: jest to vitest (#55)

* modernize: pnpm workspace (#56)

* Monorepo

* Readme

* Move tsconfig

* Fix test

* modernize: CRA -> Vite apps (#57)

* Quickstart

* test app too

* Run pnpm

* Remove eslint files

* Format

* modernize: ES2017 classes (#58)

* modernize: in-house EventEmitter (#64)

* Push

* Undo min change

* modernize: undici for WebSocket in Node (#59)

* Use undici, remove other unneeded dependencies

* pnpm install

* Bundle everything

* Move everything to devDependency

* headers object

* Bump version to 0.11.0

* Push

* Hmm not working still

* Add undici to peerDependencies

* Measure size

* Push

* Fix formatting

* Working on node!!

---------

Co-authored-by: Zeke Foppa <github.com/bfops>
Co-authored-by: Zeke Foppa <[email protected]>

* modernize: Single output (#68)

* modernize: quickstart, move server into client (#69)

* Push

* Run pnpm install

* modernize: Engines field (#70)

* modernize: Continuous Releases (#71)

* Add pkg.pr.new

* Fix directory

* modernize: Changesets;provenance (#72)

* Push

* Push

* pnpm install

* Any update

* modernize: Split lint and test GH actions (#73)

* Push

* Forgot to rename

* We only care about Lint at commit level

* modernize: pkg.pr.new compact mode (#75)

* modernize: tweak prettier configuration (#74)

* docs: Undici as peerDependency

* modernize: webpackIgnore undici (#77)

* Push

* Webpackignore

* modernize: Conditional browser build (#79)

* Push

* Remove webpackIgnore

* fix: Remove obsolete comment

* modernize: isolatedDeclarations;de-cyclic imports (#81)

* Push

* Fix test

---------

Co-authored-by: Zeke Foppa <[email protected]>
bfops pushed a commit that referenced this pull request Jul 17, 2025
bfops pushed a commit that referenced this pull request Jul 17, 2025
bfops added a commit that referenced this pull request Aug 7, 2025
* Lint script

* modernize: pnpm & prettier (#51)

* Push

* Push

* Run prettier

* Prettier stuff

* modernize: Remove Husky & pre-commit (#53)

* modernize: tsup (#54)

* Push

* jest

* modernize: jest to vitest (#55)

* modernize: pnpm workspace (#56)

* Monorepo

* Readme

* Move tsconfig

* Fix test

* modernize: CRA -> Vite apps (#57)

* Quickstart

* test app too

* Run pnpm

* Remove eslint files

* Format

* modernize: ES2017 classes (#58)

* modernize: in-house EventEmitter (#64)

* Push

* Undo min change

* modernize: undici for WebSocket in Node (#59)

* Use undici, remove other unneeded dependencies

* pnpm install

* Bundle everything

* Move everything to devDependency

* headers object

* Bump version to 0.11.0

* Push

* Hmm not working still

* Add undici to peerDependencies

* Measure size

* Push

* Fix formatting

* Working on node!!

---------

Co-authored-by: Zeke Foppa <github.com/bfops>
Co-authored-by: Zeke Foppa <[email protected]>

* modernize: Single output (#68)

* modernize: quickstart, move server into client (#69)

* Push

* Run pnpm install

* modernize: Engines field (#70)

* modernize: Continuous Releases (#71)

* Add pkg.pr.new

* Fix directory

* modernize: Changesets;provenance (#72)

* Push

* Push

* pnpm install

* Any update

* modernize: Split lint and test GH actions (#73)

* Push

* Forgot to rename

* We only care about Lint at commit level

* modernize: pkg.pr.new compact mode (#75)

* modernize: tweak prettier configuration (#74)

* docs: Undici as peerDependency

* modernize: webpackIgnore undici (#77)

* Push

* Webpackignore

* modernize: Conditional browser build (#79)

* Push

* Remove webpackIgnore

* fix: Remove obsolete comment

* modernize: isolatedDeclarations;de-cyclic imports (#81)

* Push

* Fix test

---------

Co-authored-by: Zeke Foppa <[email protected]>
bfops pushed a commit that referenced this pull request Aug 7, 2025
Sign up for free to 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.

3 participants