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

  1. Verify the aws-sdk-sqs version against vector's Cargo.lock/Cargo.toml and restore matching field setters if the builder API changed.
  2. 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.
  3. 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

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


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)