Files
Noa afe169ac4a Fix the issues with scheduling procedures (#3816)
# Description of Changes

This reapplies the patch from #3704, and fixes the issues that were
causing it to deadlock.

The reason it was deadlocking was that it allowed for the following
sequence of events:
* `SchedulerActor::handle_queued()` begins mutable tx
* `ModuleHost::disconnect_client()` submits call to `call_reducer(tx:
None)`
* scheduler submits call to `call_reducer(tx: Some)`
* `WasmModuleInstance::disconnect_client` now has to try to take tx
lock, but the scheduler's call_reducer already holds it and is behind it
in the queue

So, I moved most of the logic from `handle_queued` back to being
executed in the module worker thread, but kept the code in
`scheduler.rs` so that it can all be reasoned about locally.

Fixes #3645. Should I uncomment the implementation of
`ExportFunctionForScheduledTable for F: Procedure` now?

# Expected complexity level and risk

2 - there's a chance that this patch hasn't fully fixed the deadlock
issue from #3704, but I'm quite confident.

# Testing

- [x] Manually verified that deadlock no longer occurs - previously,
`while true; do python -m smoketests schedule_reducer -k
test_scheduled_table_subscription; done` would freeze up in only 2 or 3
iterations, but now it can run for 10 minutes without issues.
2025-12-05 22:27:30 +00:00
..
2025-08-22 19:36:47 +00:00
2025-08-20 19:24:42 +00:00

This test client is used with two modules:

Currently, the bindings are generated using only one of those two modules, chosen arbitrarily on each test run. The two tests which use this client, connect_disconnect_callbacks and connect_disconnect_callbacks_csharp, are not intended to test code generation.

The goal of the two tests is to verify that module-side connect and disconnect events fire when an SDK connects or disconnects via WebSocket, and that the client can observe mutations performed by those events.

To (re-)generate the module_bindings, from this directory, run:

mkdir -p src/module_bindings
spacetime generate --lang rust                                     \
    --out-dir src/module_bindings                                  \
    --project-path ../../../../modules/sdk-test-connect-disconnect