zeroclaw-labs/zeroclaw · error

Qdrant set payload failed during migration ({status}): {text

Error message

Qdrant set payload failed during migration ({status}): {text}

What it means

During the same startup migration, points whose session_id payload needs sanitizing are rewritten via POST /collections/{c}/points/payload (set payload). This error means the set-payload call returned non-2xx partway through; progress is lost and the whole migration retries on the next startup.

Source

Thrown at crates/zeroclaw-memory/src/qdrant.rs:365

                    }]
                }
            });

            let resp = self
                .request(
                    reqwest::Method::POST,
                    &format!("/collections/{}/points/payload", self.collection),
                )
                .query(&[("wait", "true")])
                .json(&body)
                .send()
                .await
                .context("failed to set payload during Qdrant session_id migration")?;

            if !resp.status().is_success() {
                let status = resp.status();
                let text = resp.text().await.unwrap_or_default();
                anyhow::bail!("Qdrant set payload failed during migration ({status}): {text}");
            }

            rewritten += 1;
        }

        if rewritten > 0 {
            ::zeroclaw_log::record!(
                INFO,
                ::zeroclaw_log::Event::new(module_path!(), ::zeroclaw_log::Action::Note)
                    .with_attrs(
                        ::serde_json::json!({"rewritten": rewritten, "collection": self.collection})
                    ),
                "Normalized session_id payload values in Qdrant collection to sanitized form"
            );
        }

        Ok(())
    }

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Retry startup — the migration re-scrolls and only rewrites points that still need it (idempotent)
  2. 429: stagger restarts or raise rate limits so bursts of set-payload calls fit
  3. 404 on point ids is benign if the points were deleted concurrently; a retry clears it
  4. Ensure only one instance runs the migration at a time
Defensive patterns

Strategy: retry

Type guard

fn is_migration_set_payload_error(e: &anyhow::Error) -> bool {
    e.to_string().starts_with("Qdrant set payload failed during migration")
}

Try / catch

match memory.store(k, v).await {
    Err(e) if is_migration_set_payload_error(&e) => { tokio::time::sleep(backoff).await; memory.store(k, v).await } // idempotent migration
    other => other,
}

Prevention

When it happens

Trigger: Points deleted concurrently between scroll and set-payload (Qdrant 404 on missing point ids); 400 from a malformed filter; 429 rate limiting when many points need rewriting; collection dropped mid-migration.

Common situations: Two instances migrating the same collection simultaneously; Qdrant Cloud rate limits on a collection with many legacy session ids; ops tooling pruning points while agents restart.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/b3b2c4726c58cbf3. Report an issue: GitHub.