risingwavelabs/risingwave · error
Table tracker not found for table
Error message
Table tracker not found for table {} What it means
mark_list_stage_finished looks up the RefreshProgressTracker registered for a table in the refresh manager. This error means no tracker exists for the given table id, so the list-stage completion cannot be reported. The tracker is removed when a refresh job finishes or fails, so reporting afterwards is a stale/late callback.
Solutions
- Confirm the refresh job for the table already finished or failed; if so the error is a benign stale callback and can be ignored/logged.
- Re-run or re-trigger the refresh so a tracker is re-registered before actors report.
- Check whether a meta restart occurred mid-refresh; wait for the refresh job to be re-driven by the refresh scheduler.
- If persistent for an in-progress refresh, file a bug with the table id — tracker lifecycle is out of sync.
Defensive patterns
Strategy: try-catch
Try / catch
match refresh_manager.mark_list_stage_finished(table_id, &actors) {
Err(e) if e.to_string().contains("Table tracker not found") => {
// stale completion report after the refresh finished/failed; ignore
tracing::debug!(?table_id, "tracker already removed; stale list-stage report");
}
other => other?,
} Prevention
- Check the refresh job's state before reporting stage completion for a table.
- Suppress late actor completion callbacks once a job reaches a terminal state.
- Re-register trackers deterministically after meta recovery restarts.
When it happens
Trigger: mark_list_stage_finished(table_id, actors) called for a table whose tracker was already removed (remove_trackers_by_database, remove_progress_tracker on failure/completion) or never created — e.g. a late actor completion message arriving after the refresh job ended, or recovery wiping in-memory trackers.
Common situations: MV/refresh (dynamic filter / shared source style refresh) jobs finishing concurrently while actors still report; meta node restart during an active refresh losing in-memory trackers; duplicated completion callbacks.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- expected exactly one mview fragment for table
- Failed to refresh table
- id not found
- named already exists
- actor count ( ) exceeds vnode count ( )
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/dcb41147de12574c.
Report an issue: GitHub.
Appendix: source
Thrown at src/meta/src/stream/refresh_manager.rs:147
}
pub async fn mark_refresh_complete(&self, table_id: TableId) -> MetaResult<()> {
self.metadata_manager
.update_refresh_job_status(table_id, RefreshState::Idle, None, true)
.await?;
self.remove_progress_tracker(table_id, "success");
tracing::info!(%table_id, "Table refresh completed, state updated to Idle");
Ok(())
}
pub fn mark_list_stage_finished(
&self,
table_id: TableId,
actors: &HashSet<ActorId>,
) -> MetaResult<bool> {
let mut guard = self.progress_trackers.lock();
let tracker = guard.inner.get_mut(&table_id).ok_or_else(|| {
MetaError::from(anyhow!("Table tracker not found for table {}", table_id))
})?;
tracker.report_list_finished(actors.iter().copied());
tracker.is_list_finished()
}
pub fn mark_load_stage_finished(
&self,
table_id: TableId,
actors: &HashSet<ActorId>,
) -> MetaResult<bool> {
let mut guard = self.progress_trackers.lock();
let tracker = guard.inner.get_mut(&table_id).ok_or_else(|| {
MetaError::from(anyhow!("Table tracker not found for table {}", table_id))
})?;
tracker.report_load_finished(actors.iter().copied());
tracker.is_load_finished()
}
View on GitHub (pinned to 6469eb736d)