Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: on low wasm memory hook #286

Draft
wants to merge 12 commits into
base: master
Choose a base branch
from
Draft

Conversation

ielashi
Copy link
Contributor

@ielashi ielashi commented Mar 22, 2024

This proposal is based on this forum post and has already been approved by motion proposal 106146.

Canister developers have to actively monitor their canisters to know if they are low on wasm memory. If detected too late, a canister can be completely stuck and forever un-upgradable.

To address this, we introduce a hook called on_low_wasm_memory. When defined, it is triggered whenever the canister's memory usage exceeds some developer-defined threshold.

Copy link

github-actions bot commented Mar 22, 2024

🤖 Here's your preview: https://oov64-qqaaa-aaaak-qcnsa-cai.icp0.io/docs

@ielashi

This comment was marked as resolved.

spec/index.md Show resolved Hide resolved
@dsarlis

This comment was marked as resolved.

@ielashi

This comment was marked as resolved.

@mraszyk

This comment was marked as resolved.

@ielashi

This comment was marked as resolved.

@mraszyk

This comment was marked as resolved.

@ielashi

This comment was marked as resolved.

@mraszyk

This comment was marked as resolved.

spec/index.md Outdated Show resolved Hide resolved
spec/index.md Outdated Show resolved Hide resolved
spec/index.md Outdated Show resolved Hide resolved
spec/index.md Outdated Show resolved Hide resolved
@dragoljub-duric

This comment was marked as resolved.

@Dfinity-Bjoern

This comment was marked as outdated.

@dragoljub-duric

This comment was marked as resolved.

github-merge-queue bot pushed a commit to dfinity/ic that referenced this pull request Sep 24, 2024
This PR is part of the OnLowWasmMemoryHook effort. Here we implement
checking for hook condition and propagating hook status to SystemState.
Condition for executing hook, as agreed in interface spec
[discussion](dfinity/interface-spec#286 (comment))
is:

1. In the case with memory_allocation `min(memory_allocation -
used_stable_memory, wasm_memory_limit) - used_wasm_memory`
2. Without memory allocation `wasm_memory_limit - used_wasm_memory` 

Hook status can be one of:

1. Condition is not satisfied
3. Ready for execution
4. Executed

The hook condition is checked whenever additional execution (stable or
Wasm) memory allocation is requested.

After this change, we will have all the required information of
SystemState and it will be necessary only to schedule hook execution in
the following round.

This PR will be followed with:

1. [EXC-1724](https://dfinity.atlassian.net/browse/EXC-1724) In which we
will refactor `SystemState::task_queue` to be new struct with additional
field `on_low_wasm_memory_hook_status`, to ensure that whenever
available first task that will be poped form task queue is
`OnLowWasmMemoryHook` (excluding paused executions). For that reason
`SystemState::on_low_wasm_memory_hook status` is private, and we use
`set` and `get`, so it can be easier encapsulated in the future
`TaskQueue` struct.
2. [EXC-1725](https://dfinity.atlassian.net/browse/EXC-1725) Schedule
and execute `OnLowWasmMemoryHook`


[EXC-1724]:
https://dfinity.atlassian.net/browse/EXC-1724?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
[EXC-1725]:
https://dfinity.atlassian.net/browse/EXC-1725?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

---------

Co-authored-by: Alin Sinpalean <[email protected]>
frankdavid pushed a commit to dfinity/ic that referenced this pull request Sep 25, 2024
This PR is part of the OnLowWasmMemoryHook effort. Here we implement
checking for hook condition and propagating hook status to SystemState.
Condition for executing hook, as agreed in interface spec
[discussion](dfinity/interface-spec#286 (comment))
is:

1. In the case with memory_allocation `min(memory_allocation -
used_stable_memory, wasm_memory_limit) - used_wasm_memory`
2. Without memory allocation `wasm_memory_limit - used_wasm_memory` 

Hook status can be one of:

1. Condition is not satisfied
3. Ready for execution
4. Executed

The hook condition is checked whenever additional execution (stable or
Wasm) memory allocation is requested.

After this change, we will have all the required information of
SystemState and it will be necessary only to schedule hook execution in
the following round.

This PR will be followed with:

1. [EXC-1724](https://dfinity.atlassian.net/browse/EXC-1724) In which we
will refactor `SystemState::task_queue` to be new struct with additional
field `on_low_wasm_memory_hook_status`, to ensure that whenever
available first task that will be poped form task queue is
`OnLowWasmMemoryHook` (excluding paused executions). For that reason
`SystemState::on_low_wasm_memory_hook status` is private, and we use
`set` and `get`, so it can be easier encapsulated in the future
`TaskQueue` struct.
2. [EXC-1725](https://dfinity.atlassian.net/browse/EXC-1725) Schedule
and execute `OnLowWasmMemoryHook`


[EXC-1724]:
https://dfinity.atlassian.net/browse/EXC-1724?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
[EXC-1725]:
https://dfinity.atlassian.net/browse/EXC-1725?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

---------

Co-authored-by: Alin Sinpalean <[email protected]>
levifeldman pushed a commit to levifeldman/ic that referenced this pull request Oct 1, 2024
…ity#667)

This PR is part of the OnLowWasmMemoryHook effort. Here we implement
checking for hook condition and propagating hook status to SystemState.
Condition for executing hook, as agreed in interface spec
[discussion](dfinity/interface-spec#286 (comment))
is:

1. In the case with memory_allocation `min(memory_allocation -
used_stable_memory, wasm_memory_limit) - used_wasm_memory`
2. Without memory allocation `wasm_memory_limit - used_wasm_memory` 

Hook status can be one of:

1. Condition is not satisfied
3. Ready for execution
4. Executed

The hook condition is checked whenever additional execution (stable or
Wasm) memory allocation is requested.

After this change, we will have all the required information of
SystemState and it will be necessary only to schedule hook execution in
the following round.

This PR will be followed with:

1. [EXC-1724](https://dfinity.atlassian.net/browse/EXC-1724) In which we
will refactor `SystemState::task_queue` to be new struct with additional
field `on_low_wasm_memory_hook_status`, to ensure that whenever
available first task that will be poped form task queue is
`OnLowWasmMemoryHook` (excluding paused executions). For that reason
`SystemState::on_low_wasm_memory_hook status` is private, and we use
`set` and `get`, so it can be easier encapsulated in the future
`TaskQueue` struct.
2. [EXC-1725](https://dfinity.atlassian.net/browse/EXC-1725) Schedule
and execute `OnLowWasmMemoryHook`


[EXC-1724]:
https://dfinity.atlassian.net/browse/EXC-1724?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
[EXC-1725]:
https://dfinity.atlassian.net/browse/EXC-1725?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

---------

Co-authored-by: Alin Sinpalean <[email protected]>
spec/index.md Outdated Show resolved Hide resolved
spec/index.md Outdated Show resolved Hide resolved
:::note

While the above function is scheduled immediately once the condition above is triggered, it may not necessarily be executed immediately if it does not have enough cycles.
If the canister gets frozen immediately after the function is scheduled for execution, the function will run once the canister's unfrozen _if_ the canister's wasm memory remains above the threshold `t`.
Copy link
Contributor

Choose a reason for hiding this comment

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

If the canister gets frozen immediately after the function is scheduled for execution, the function will run once the canister's unfrozen if the canister's wasm memory remains above the threshold t.

This property is not established by the implementation.

@@ -25,6 +26,7 @@ type definite_canister_settings = record {
reserved_cycles_limit : nat;
log_visibility : log_visibility;
wasm_memory_limit : nat;
wasm_memory_threshold: nat;
Copy link
Contributor

Choose a reason for hiding this comment

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

This field is not exported by the implementation.

@mraszyk
Copy link
Contributor

mraszyk commented Oct 30, 2024

The implementation only considers stable memory and ignores, e.g., the chunk store and snapshot size, when deriving the wasm memory capacity.

@mraszyk
Copy link
Contributor

mraszyk commented Oct 30, 2024

The hook should not run after an upgrade/reinstall/uninstall/install if the condition is not satisfied after the upgrade (although the condition was satisfied before the upgrade and the hook did not execute yet).

spec/index.md Outdated Show resolved Hide resolved
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.

5 participants