Skip to content

Conversation

@dicej
Copy link
Contributor

@dicej dicej commented Sep 9, 2025

Previously, we were unconditionally deleting the callee subtask once it returned a value to a sync-lowered call, but that's only appropriate if the subtask has exited. Otherwise, it needs to keep running and only be deleted once it actually exits.

Thanks to Luke for the sync-streams.wast test that uncovered this, which I've copied from the component-model repo.

This also makes a couple of debug logging tweaks that proved useful while investigating the above issue.

Closes #11611

@dicej dicej requested a review from a team as a code owner September 9, 2025 16:04
@dicej dicej requested review from alexcrichton and removed request for a team September 9, 2025 16:04
Previously, we were unconditionally deleting the callee subtask once it returned
a value to a sync-lowered call, but that's only appropriate if the subtask has
exited.  Otherwise, it needs to keep running and only be deleted once it
actually exits.

Thanks to Luke for the `sync-streams.wast` test that uncovered this, which I've
copied from the `component-model` repo.

This also makes a couple of debug logging tweaks that proved useful while
investigating the above issue.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>
@dicej dicej force-pushed the sync-lower-subtask-lifecycle branch from 49c18c9 to 98e7fb6 Compare September 9, 2025 16:40
@alexcrichton alexcrichton moved this to In progress in Ship WASIp3 Sep 9, 2025
@github-actions github-actions bot added the wasmtime:api Related to the API of the `wasmtime` crate itself label Sep 9, 2025
@alexcrichton alexcrichton added this pull request to the merge queue Sep 9, 2025
github-merge-queue bot pushed a commit that referenced this pull request Sep 9, 2025
Previously, we were unconditionally deleting the callee subtask once it returned
a value to a sync-lowered call, but that's only appropriate if the subtask has
exited.  Otherwise, it needs to keep running and only be deleted once it
actually exits.

Thanks to Luke for the `sync-streams.wast` test that uncovered this, which I've
copied from the `component-model` repo.

This also makes a couple of debug logging tweaks that proved useful while
investigating the above issue.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>
Merged via the queue into bytecodealliance:main with commit 078364f Sep 9, 2025
44 checks passed
@github-project-automation github-project-automation bot moved this from In progress to Done in Ship WASIp3 Sep 9, 2025
alexcrichton pushed a commit to alexcrichton/wasmtime that referenced this pull request Sep 9, 2025
…iance#11655)

Previously, we were unconditionally deleting the callee subtask once it returned
a value to a sync-lowered call, but that's only appropriate if the subtask has
exited.  Otherwise, it needs to keep running and only be deleted once it
actually exits.

Thanks to Luke for the `sync-streams.wast` test that uncovered this, which I've
copied from the `component-model` repo.

This also makes a couple of debug logging tweaks that proved useful while
investigating the above issue.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>
alexcrichton added a commit that referenced this pull request Sep 9, 2025
* support non-async `{stream,future}.cancel-{read,write}` (#11625)

* support non-async `{stream,future}.cancel-{read,write}`

During my earlier stream API refactoring, I had forgotten to support or test
synchronous cancellation; this commit does both.  In the process, I realized the
future API ought to be updated to support blocking cancellation just like the
stream API, so I made that change as well.

This also adds `{Source,Destination}::reborrow` functions, allowing instances of
those types to be reborrowed, such that they may be passed as parameters but
also used again.

Note that I had to move some functions from `impl ConcurrentState` to `impl
Instance` in order to access the store and suspend the current fiber when
synchronously cancelling.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

* reduce code duplication

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

---------

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

* support and test synchronous `{stream,future}.cancel-{read,write}` (#11645)

* support and test synchronous `{stream,future}.cancel-{read,write}`

Previously, we only supported async calls to those intrinsics; now we support
blocking, synchronous calls as well.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

* update future-read.wast test

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

---------

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

* p3-http: finish `wasi:http@0.3` implementation (#11636)

* refactor(p3-http): use trappable errors

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* feat(p3-http): implement `content-length` handling

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* refactor(p3-http): remove a few resource utilities

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* remove unused test import

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* fix(p3-http): close stream handles on drop

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* test(p3-http): stream responses back

This is something we've been doing in wasip3, but I forgot to port this
over

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* doc(p3-http): add missing docs, internalize more, simplify

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* refactor(p3-http): extract `Body::consume`

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* refactor(p3-http): clean-up `content-length` error reporting

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* refactor(p3-http): drop elided lifetime

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* fix(p3-http): avoid guest body deadlock hazard

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* refactor(p3-http): add more docs, clean-up

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* doc(p3-http): add more docs

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* fix(p3-http): rework result future handling

Most importantly this avoids a race condition between `content-length` error observed by `GuestBody`
and hyper I/O driver

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* add new imports after rebase

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* clean-up `poll_consume`

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* assert content-length `handle` results

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* relax `content_length` test `handle` assert

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

---------

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* p3-http: implementation follow-up (#11649)

* p3: refactor future producers/consumers

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* p3-http: tie lifetime of the spawned task to the bodies

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* p3-http: improve docs

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

---------

Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>

* Ignore a wasip3 http test temporarily (#11657)

Filed #11656 to track the eventual resolution.

* don't delete sync-lowered subtasks unless they've exited (#11655)

Previously, we were unconditionally deleting the callee subtask once it returned
a value to a sync-lowered call, but that's only appropriate if the subtask has
exited.  Otherwise, it needs to keep running and only be deleted once it
actually exits.

Thanks to Luke for the `sync-streams.wast` test that uncovered this, which I've
copied from the `component-model` repo.

This also makes a couple of debug logging tweaks that proved useful while
investigating the above issue.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>

---------

Signed-off-by: Joel Dice <joel.dice@fermyon.com>
Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>
Co-authored-by: Joel Dice <joel.dice@fermyon.com>
Co-authored-by: Roman Volosatovs <rvolosatovs@users.noreply.github.com>
bongjunj pushed a commit to prosyslab/wasmtime that referenced this pull request Oct 20, 2025
…iance#11655)

Previously, we were unconditionally deleting the callee subtask once it returned
a value to a sync-lowered call, but that's only appropriate if the subtask has
exited.  Otherwise, it needs to keep running and only be deleted once it
actually exits.

Thanks to Luke for the `sync-streams.wast` test that uncovered this, which I've
copied from the `component-model` repo.

This also makes a couple of debug logging tweaks that proved useful while
investigating the above issue.

Signed-off-by: Joel Dice <joel.dice@fermyon.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

wasmtime:api Related to the API of the `wasmtime` crate itself

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

Async canonical ABI option not respected on all intrinsics

2 participants