# Any possibility to run an async function inside \`#\[pre\_upgrade\] fn pre\_upgrade() {}\` function?

**URL:** <https://forum.dfinity.org/t/any-possibility-to-run-an-async-function-inside-pre-upgrade-fn-pre-upgrade-function/27653>\
**Category:** Developers\
**Tags:** Discussing\
**Created:** [February 18, 2024, 4:33am UTC](https://forum.dfinity.org/t/any-possibility-to-run-an-async-function-inside-pre-upgrade-fn-pre-upgrade-function/27653 "2024-02-18T04:33:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![q2333gh](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/q2333gh/32/36020_2.png) [@q2333gh](https://forum.dfinity.org/u/q2333gh)\
**Post date:** [February 18, 2024, 4:33am UTC](https://forum.dfinity.org/t/any-possibility-to-run-an-async-function-inside-pre-upgrade-fn-pre-upgrade-function/27653/1 "2024-02-18T04:33:30Z")

</div>

I tried the code below. but none of it works.

```rust
#[pre_upgrade]
#[trace]
fn pre_upgrade() {

//method1:
  use tokio::runtime::Runtime;
  let rt = Runtime::new().unwrap();
  rt.block_on(async {
    save_payload_to_dropbox();
  });
//wasm doesnt support this code above yet.

//or method2:
  save_payload_to_dropbox_blocking(); 
//use   
//`use futures::executor::block_on;
// match block_on(http_request(request, cycles))`  
//inside save_payload_to_dropbox_blocking()

//returns:
//Failed during wasm installation call: The replica returned a replica error:
//reject code CanisterError, 
//reject message Canister bkyz2-fmaaa-aaaaa-qaaaq-cai 
//violated contract: "ic0_call_new" cannot be executed in pre upgrade mode, 
//error code None
}

```

---

<div class="post-metadata">

**Author:** ![Vivienne](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/vivienne/32/29170_2.png) [@Vivienne](https://forum.dfinity.org/u/Vivienne)\
**Post date:** [February 19, 2024, 8:49am UTC](https://forum.dfinity.org/t/any-possibility-to-run-an-async-function-inside-pre-upgrade-fn-pre-upgrade-function/27653/2 "2024-02-19T08:49:28Z")

</div>

No, `await` is forbidden in `init`, `pre_upgrade`, and `post_upgrade`

---

<div class="post-metadata">

**Author:** ![princess\_eth](https://avatars.discourse-cdn.com/v4/letter/p/ce7236/32.png) [@princess\_eth](https://forum.dfinity.org/u/princess_eth)\
**Post date:** [February 20, 2024, 3:48am UTC](https://forum.dfinity.org/t/any-possibility-to-run-an-async-function-inside-pre-upgrade-fn-pre-upgrade-function/27653/3 "2024-02-20T03:48:51Z")

</div>

What is the technical limitation that does not allow for an async function?

---

<div class="post-metadata">

**Author:** ![Vivienne](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/vivienne/32/29170_2.png) [@Vivienne](https://forum.dfinity.org/u/Vivienne)\
**Post date:** [February 20, 2024, 9:07am UTC](https://forum.dfinity.org/t/any-possibility-to-run-an-async-function-inside-pre-upgrade-fn-pre-upgrade-function/27653/4 "2024-02-20T09:07:56Z")

</div>

It would break a bunch of guarantees you have right now. For example now you 100% can be sure that `init` is run to completion before any other function ever runs.

But you can emulate an async-allowed function in these function (except `pre_upgrade`). If you set a timer to run in 0 seconds it’ll run very soon and in there you’re allowed to do async calls

---

<div class="post-metadata">

**Author:** ![q2333gh](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/q2333gh/32/36020_2.png) [@q2333gh](https://forum.dfinity.org/u/q2333gh)\
**Post date:** [February 20, 2024, 9:57am UTC](https://forum.dfinity.org/t/any-possibility-to-run-an-async-function-inside-pre-upgrade-fn-pre-upgrade-function/27653/5 "2024-02-20T09:57:01Z")

</div>

by the way. suggestions for viewers of this post:  
ic doc dont recommend do any err prone code in pre\_upgrade .  
cause if it fail during canister upgrade process. Things may get bad .  
I am one of the silly guy write buggy code on production canister.  
Still strive to fix it yet.
