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

  1. 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.
  2. Re-run or re-trigger the refresh so a tracker is re-registered before actors report.
  3. Check whether a meta restart occurred mid-refresh; wait for the refresh job to be re-driven by the refresh scheduler.
  4. 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

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


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)