{"record":{"id":"0741bcd868f2065f","repo":"quickwit-oss/quickwit","slug":"failed-to-send-upload-split-the-publisher","errorCode":null,"errorMessage":"failed to send upload split `{:?}`. the publisher is probably dead","messagePattern":"failed to send upload split `(.+?)`\\. the publisher is probably dead","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-indexing/src/actors/uploader.rs","lineNumber":149,"sourceCode":"        if let SplitsUpdateSender::Sequencer(split_uploader_tx) = self\n            && split_uploader_tx.send(SequencerCommand::Discard).is_err()\n        {\n            bail!(\"failed to send cancel command to sequencer: it is probably dead\");\n        }\n        Ok(())\n    }\n\n    async fn send(\n        self,\n        split_update: SplitsUpdate,\n        ctx: &ActorContext<Uploader>,\n    ) -> anyhow::Result<()> {\n        match self {\n            SplitsUpdateSender::Sequencer(split_uploaded_tx) => {\n                if let Err(publisher_message) =\n                    split_uploaded_tx.send(SequencerCommand::Proceed(split_update))\n                {\n                    bail!(\n                        \"failed to send upload split `{:?}`. the publisher is probably dead\",\n                        &publisher_message\n                    );\n                }\n            }\n            SplitsUpdateSender::Publisher(publisher_mailbox) => {\n                ctx.send_message(&publisher_mailbox, split_update).await?;\n            }\n        }\n        Ok(())\n    }\n}\n\n#[derive(Clone)]\npub struct Uploader {\n    uploader_type: UploaderType,\n    metastore: MetastoreServiceClient,\n    merge_policy: Arc<dyn MergePolicy>,","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-indexing/src/actors/uploader.rs#L131-L167","documentation":"The uploader actor failed to deliver an `UploadSplits` message through the sequencer/publisher channel because the receiving actor's mailbox is closed, meaning the publisher actor has exited. This is a liveness failure inside the indexing pipeline: uploading succeeded but the result could not be forwarded for publication.","triggerScenarios":"Calling `SplitsUpdateSender::send` when `split_uploaded_tx.send(SequencerCommand::Proceed(...))` returns `Err` because the publisher actor has terminated and its mailbox no longer accepts messages.","commonSituations":"The publisher actor crashed or was killed (e.g., panic, supervision shutdown, node shutdown) while the uploader was still processing split uploads; pipeline shutdown races during index deletion; OOM kill of the indexer process.","solutions":["Inspect indexer logs above this message for the root cause of the publisher actor's death (panic, error, supervisor kill) and fix that first.","Check memory/resource limits on the indexing node (OOM kills silently stop actors).","Ensure the index was not deleted or the pipeline shut down while indexing was in flight.","Restart the indexer; the split upload is retried from the source checkpoint on the next pipeline run."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// act Supervisor handles the failure; ensure the pipeline is observed\nmatch uploader_res {\n    Err(err) => tracing::error!(%err, \"publisher died mid-upload; restart indexer to reprocess checkpoint\"),\n    Ok(_) => {}\n}","preventionTips":["Monitor actor supervisor logs for publisher terminations.","Set adequate memory limits to avoid OOM kills of the indexer.","Avoid deleting indexes while their pipelines are actively uploading."],"tags":["actor-mailbox","indexing-pipeline","dead-actor","rust"],"backgroundTag":"invalid-state-transition","analyzedSha":"a39730c5cdcd1a4fe798403737ae293999ea21f8","analyzedAt":"2026-09-08T13:19:37.784Z","contentChangedAt":"2026-09-08T13:19:37.784Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}