Skip to content

Commit

Permalink
qe-wasm: Fix consistent now() value (#4650)
Browse files Browse the repository at this point in the history
* qe-wasm: Fix consistent `now()` value

We implemented introduced consitent `request_now` value in #3200,
however, we've opted out of thread local value if there is no active
tokio handle. This is problem for WASM build, since it does not have
use an actual tokio runtime.

Replacing handle check with `LocalKey::try_with` allows us to use task
local variable without the runtime, while still preserving fallback for
immediate value if task local is not set.

Fix prisma/team-orm#645

* Fix formatting

* Reword comment
  • Loading branch information
SevInf committed Jan 17, 2024
1 parent e48dcc7 commit 71726cc
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 13 deletions.
Expand Up @@ -26,11 +26,7 @@ mod prisma_12572 {
.to_owned()
}

#[connector_test(exclude(
Postgres("pg.js.wasm", "neon.js.wasm"),
Sqlite("libsql.js.wasm"),
Vitess("planetscale.js.wasm")
))]
#[connector_test]
async fn all_generated_timestamps_are_the_same(runner: Runner) -> TestResult<()> {
runner
.query(r#"mutation { createOneTest1(data: {id:"one", test2s: { create: {id: "two"}}}) { id }}"#)
Expand Down
17 changes: 9 additions & 8 deletions query-engine/core/src/executor/request_context.rs
Expand Up @@ -18,14 +18,15 @@ tokio::task_local! {
///
/// If we had a query context we carry for the entire lifetime of the query, it would belong there.
pub(crate) fn get_request_now() -> PrismaValue {
// FIXME: we want to bypass task locals if this code is executed outside of a tokio context. As
// of this writing, it happens only in the query validation test suite.
//
// Eventually, this will go away when we have a plain query context reference we pass around.
if tokio::runtime::Handle::try_current().is_err() {
return PrismaValue::DateTime(chrono::Utc::now().into());
}
REQUEST_CONTEXT.with(|rc| rc.request_now.clone())
REQUEST_CONTEXT.try_with(|rc| rc.request_now.clone()).unwrap_or_else(|_|
// Task local might not be set in some cases.
// At the moment of writing, this happens only in query validation test suite.
// In that case, we want to fall back to realtime value. On the other hand, if task local is
// set, we want to use it, even if we are not running inside of tokio runtime (for example,
// in WASM case)
//
// Eventually, this will go away when we have a plain query context reference we pass around.
PrismaValue::DateTime(chrono::Utc::now().into()))
}

/// The engine protocol used for the whole duration of a request.
Expand Down

0 comments on commit 71726cc

Please sign in to comment.