vectordotdev/vector · error · Error
Pagefind is unavailable.
Error message
Pagefind is unavailable.
What it means
This is a panic raised by `.expect("all required builder params specified")` on the aws-sdk-sqs `DeleteMessageBatchRequestEntry` builder. The SDK builder's `build()` returns a Result and fails when a mandatory field (`id` or `receipt_handle`) was never set. In this call site both fields are set unconditionally from a successfully processed message, so the expect documents the invariant that the build cannot fail; if it fires, the surrounding code's invariant is broken (e.g. a None receipt_handle was force-unwrapped or an SDK version changed builder semantics).
Solutions
- Verify the aws-sdk-sqs version against vector's Cargo.lock/Cargo.toml and restore matching field setters if the builder API changed.
- Check that `receipt_handle` is a non-Option String built from `message.receipt_handle` before the loop and is not moved/consumed in earlier iterations.
- If a runtime failure is possible, replace `.expect()` with proper error handling that emits `SqsMessageDeleteError` and skips the entry instead of panicking the source task.
Example fix
// before
DeleteMessageBatchRequestEntry::builder()
.id(message_id.clone())
.receipt_handle(receipt_handle)
.build()
.expect("all required builder params specified")
// after
DeleteMessageBatchRequestEntry::builder()
.id(message_id.clone())
.receipt_handle(receipt_handle)
.build()
.unwrap_or_else(|e| panic!("SQS delete entry build failed: {e}")) Defensive patterns
Strategy: validation
Validate before calling
fn valid_delete_entry(id: &str, receipt_handle: &str) -> bool {
!id.is_empty() && !receipt_handle.is_empty()
} Type guard
fn as_receipt(m: &Message) -> Option<&str> { m.receipt_handle.as_deref().filter(|r| !r.is_empty()) } Try / catch
// Rust: replace .expect with match on build Result
match DeleteMessageBatchRequestEntry::builder().id(id).receipt_handle(rh).build() {
Ok(entry) => entries.push(entry),
Err(e) => { emit!(SqsMessageDeleteError { error: &e.into() }); }
} Prevention
- After every aws-sdk-sqs upgrade, compile-check all builder call sites (build() Result forces review).
- Never unwrap Option receipt_handles before the builder; thread Options through and handle None explicitly.
- Add a unit test asserting delete entries build successfully for representative messages.
When it happens
Trigger: Calling `DeleteMessageBatchRequestEntry::builder().id(..).receipt_handle(..).build()` without setting `id` or `receipt_handle`. In vector's `run_once` (src/sources/aws_s3/sqs.rs:486) this only triggers if `receipt_handle` extraction produced None that was unwrapped earlier, or an aws-sdk upgrade made additional fields required.
Common situations: Upgrading the `aws-sdk-sqs` crate to a version where the builder gained a new required field; refactoring the delete loop and accidentally dropping a `.receipt_handle()` call; a receipt_handle Option being consumed/moved after the first message in a batch so later iterations build with None.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- Serializer does not support JSON
- shutdown_force_trigger for source
- Unable to load exact documentation search index
- backoff never ends
- shutdown_begun_trigger for source
AI-assisted analysis of vectordotdev/vector@bdb87aeaa4 (2026-09-16).
Data as JSON: /api/errors/2904993e45ff46ec.
Report an issue: GitHub.
Appendix: source
Thrown at website/assets/js/search.tsx:83
return records
.filter((record) =>
record.aliases.some((alias) => {
const normalizedAlias = normalizeSearchTerm(alias);
const exactMatch = normalizedAlias === normalizedQuery;
const vrlPrefixMatch =
record.category === "VRL function" &&
normalizedQuery.length >= minVrlPrefixLength &&
normalizedAlias.startsWith(normalizedQuery);
return exactMatch || vrlPrefixMatch;
})
)
.map(({ aliases: _, ...record }) => record);
};
const getPagefind = async () => {
if (!window.loadPagefind) {
throw new Error("Pagefind is unavailable.");
}
pagefindModule ??= window.loadPagefind().catch((error) => {
pagefindModule = undefined;
throw error;
});
return pagefindModule;
};
const pagefindCategory = (url: string) => {
const resultUrl = new URL(url, window.location.origin);
const path = resultUrl.pathname.split("/").filter(Boolean);
if (path.slice(0, 3).join("/") === "docs/reference/configuration") {
if (/^#enrichment[-_]tables(?:[._-]|$)/.test(resultUrl.hash)) {
return "Enrichment tables";
}
View on GitHub (pinned to bdb87aeaa4)