{"record":{"id":"93aeaccea3590214","repo":"dbt-labs/dbt-core","slug":"waker-missing","errorCode":null,"errorMessage":"waker missing","messagePattern":"waker missing","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/dbt-runtime/src/task/core.rs","lineNumber":494,"sourceCode":"            hooks,\n        }\n    }\n\n    pub(super) unsafe fn set_waker(&self, waker: Option<Waker>) {\n        self.waker.with_mut(|ptr| {\n            *ptr = waker;\n        });\n    }\n\n    pub(super) unsafe fn will_wake(&self, waker: &Waker) -> bool {\n        self.waker\n            .with(|ptr| (*ptr).as_ref().unwrap().will_wake(waker))\n    }\n\n    pub(super) fn wake_join(&self) {\n        self.waker.with(|ptr| match unsafe { &*ptr } {\n            Some(waker) => waker.wake_by_ref(),\n            None => panic!(\"waker missing\"),\n        });\n    }\n}\n\n#[test]\nfn header_lte_cache_line() {\n    assert!(size_of::<Header>() <= 8 * size_of::<*const ()>());\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    use std::sync::{Arc, Mutex};\n    use std::task::Waker;\n\n    use tracing::instrument::Instrumented;\n","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/dbt-labs/dbt-core/blob/0267ce9170576975b76b64ce856b2e5848e96617/crates/dbt-runtime/src/task/core.rs#L476-L512","documentation":"wake_join wakes the task blocked on a JoinHandle by invoking the waker previously registered with the task. If the waker slot is None — the join waker was never registered (task not being awaited) or was already taken — the library panics with 'waker missing' rather than silently dropping the wake. This is an internal contract: wake_join must only be called while a join waker is stored.","triggerScenarios":"An internal wakeup path (task completion notifying the JoinHandle's waiter) fires when no waker is registered — e.g. a race or misuse in task scheduling code that calls wake_join without a prior registration of the join waker.","commonSituations":"Encountered almost exclusively when debugging dbt-runtime/task scheduling internals or when reproducing scheduler races; end users normally never trigger it through public APIs.","solutions":["Report to dbt-runtime maintainers with a reproducer; this indicates a scheduler/waker lifecycle bug","Update dbt-runtime to the latest version in case the race is fixed","Add logging around join/drop of JoinHandles to narrow the interleaving that clears the waker before wake_join runs"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Internal scheduler path; at an integration boundary:\nstd::panic::catch_unwind(|| task.wake_join()).map_err(|_| \"waker lifecycle bug\")?;","preventionTips":["Keep dbt-runtime updated; this is a library-internal invariant","Reproduce races under stress tests with many join/drop interleavings","Never drive task internals outside the runtime's scheduler","Report occurrences with interleaving details to maintainers"],"tags":["rust","async","waker","panic","internal-invariant"],"backgroundTag":"internal-invariant-violation","analyzedSha":"0267ce9170576975b76b64ce856b2e5848e96617","analyzedAt":"2026-09-07T21:53:39.732Z","contentChangedAt":"2026-09-07T21:53:39.732Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}