Skip to content

Wait to unsubscribe in csharp-testsuite until required ops have finished#5135

Closed
joshua-spacetime wants to merge 1 commit into
masterfrom
joshua/fix/charp-testsuite-flake
Closed

Wait to unsubscribe in csharp-testsuite until required ops have finished#5135
joshua-spacetime wants to merge 1 commit into
masterfrom
joshua/fix/charp-testsuite-flake

Conversation

@joshua-spacetime
Copy link
Copy Markdown
Contributor

Description of Changes

After #4973, WASM procedures can execute concurrently with later operations on the same WebSocket.

Before this change, the C# regression testsuite queued several procedures, then immediately queued UnsubscribeThen. After #4973, the unsubscribe could be applied before the SubscriptionEventOffset procedure callback ran, clearing MyTable from the local subscribed cache. The callback then failed while asserting that the offset-test: row was present.

This change treats unsubscribe as a separate phase. It is scheduled after the main work is queued, but only starts once waiting == 0, so all callbacks that inspect subscribed state run before the cache is cleared.

API and ABI breaking changes

N/A

Expected complexity level and risk

1

Testing

  • csharp-testsuite no longer flakes

@joshua-spacetime
Copy link
Copy Markdown
Contributor Author

Included in #5095 since #5095 made the test flake more consistent.

@joshua-spacetime joshua-spacetime deleted the joshua/fix/charp-testsuite-flake branch May 28, 2026 05:12
pull Bot pushed a commit to age-rs/SpacetimeDB that referenced this pull request May 28, 2026
…bs#5095)

# Description of Changes

Before this change, we used a single async-enabled wasm runtime for all
requests, even though procedures are the only operation that can yield.
Now each module gets two separate runtimes. We continue to use the same
async runtime for procedures, but now reducers are executed against a
synchronous wasm runtime, backed by a single OS-thread instead of a
Tokio runtime.

The purpose of this change is to remove from the critical path the
overhead associated with async calls that really aren't async at all.

Also includes the following fix from clockworklabs#5135:

> After clockworklabs#4973, WASM procedures can execute concurrently with later
operations on the same WebSocket.

> Before this change, the C# regression testsuite queued several
procedures, then immediately queued `UnsubscribeThen`. After clockworklabs#4973, the
unsubscribe could be applied before the `SubscriptionEventOffset`
procedure callback ran, clearing `MyTable` from the local subscribed
cache. The callback then failed while asserting that the `offset-test:`
row was present.

> This change treats unsubscribe as a separate phase. It is scheduled
after the main work is queued, but only starts once `waiting == 0`, so
all callbacks that inspect subscribed state run before the cache is
cleared.

# API and ABI breaking changes

None

# Expected complexity level and risk

2.5

# Testing

Pure refactor. Relies on current test coverage. clockworklabs#5078 will ensure the
performance is on par with V8.
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.

1 participant