YannikSc edited issue #4099:
Note: I'm not sure if my implementation is correct, so please correct me if my implementation or expectations are wrong.
Test Case
Example project is available here
Steps to Reproduce
- Create a wasmtime project with wasi support (wasmtime_wasi)
- Build the
WasiCtx
withinherit_env
- Run a function a couple times
- Leak memory
Expected Results
It might be a user issue, as I'm not sure if my implementation is correct, but I would assume, that it is.
So in this case my expectation would be, that the memory at the end is likely the same as the one at the start.
Actual Results
The memory size at the end is (for 2000 function calls in my example) ~10 time bigger than at the beginning
Versions and Environment
Wasmtime & Wasmtime_wasi version: 0.36.0
uname -srm
: Linux 5.17.5-zen1-1-zen x86_64edit: This also happens if the
env
method is used
alexcrichton commented on issue #4099:
cc @sunfishcode this seems to be an unfortunate interaction between the current command support in LLVM/LLD and wasi-libc perhaps? I don't think that the problem is with
inherit_env
, rather simply any env var being defined. (this reproduces when defining just a single env var). Also note that this isn't a leak in Wasmtime, but rather then wasm module itself.The
do_something
export is wrapped automatically by LLD so that every time it's called it first calls__wasm_call_ctors
followed by a call to__wasm_call_dtors
. For this particular wasm module the ctors initializes the environment but the dtors don't actually free anything, so the environment is initialized every time the function is called, which results in the apparent leak.@sunfishcode is this perhaps updated in wasi-libc already? Does the Rust toolchain just need to update its wasi-libc version?
YannikSc commented on issue #4099:
After some more checking, I can confirm that it happens also for only a single
.env()
call.I also noticed a leak when using the
.preopened_dir()
function. I'm not sure if it's the same cause, but I thought it would be worth to mention.
alexcrichton commented on issue #4099:
That's likely the same issue where
__wasm_call_ctors
is repeatedly initializing internal state without either reusing prior state or cleaning up the prior state.
sunfishcode commented on issue #4099:
The way the LLVM backend and wasm-ld work now is to assume that a "command", which is the default mode, is called into only once. To build a module that can be called into multiple times, the toolchain now expects users to build in "reactor". The rust toolchain unfortunately does not yet have a flag for enabling "reactor" mode. We should consider adding one. Though adding one that can be relatively stable will require answering complex questions about "what is a wasm cdylib?" and "what is a wasm reactor?" which have been difficult to answer while module-linking has been in flux.
It is a change from previous versions. It used to be the case that "command" executables were more forgiving about being called multiple times. Some things didn't work, and it wasn't ever documented or anticipated that calling into wasm modules multiple times would work, but it does appear to have turned out to work in practice for some users. When I made the change, quite a while ago at this point, I was trying to fix the things that didn't work, and I didn't realize how many people were depending on the old behavior continuing to work the way it did. These changes are now showing up in toolchains and unfortunately breaking these users' code.
alexcrichton commented on issue #4099:
I'm going to close this because I don't believe that this is a bug in Wasmtime itself, but @YannikSc if you'd like this would perhaps be a good candidate for opening as an issue on the wasi-libc repository.
alexcrichton closed issue #4099:
Note: I'm not sure if my implementation is correct, so please correct me if my implementation or expectations are wrong.
Test Case
Example project is available here
Steps to Reproduce
- Create a wasmtime project with wasi support (wasmtime_wasi)
- Build the
WasiCtx
withinherit_env
- Run a function a couple times
- Leak memory
Expected Results
It might be a user issue, as I'm not sure if my implementation is correct, but I would assume, that it is.
So in this case my expectation would be, that the memory at the end is likely the same as the one at the start.
Actual Results
The memory size at the end is (for 2000 function calls in my example) ~10 time bigger than at the beginning
Versions and Environment
Wasmtime & Wasmtime_wasi version: 0.36.0
uname -srm
: Linux 5.17.5-zen1-1-zen x86_64edit: This also happens if the
env
method is used
Last updated: Nov 22 2024 at 16:03 UTC