{"record":{"id":"9f72307fb29bebbd","repo":"clockworklabs/SpacetimeDB","slug":"repo-segment-already-exists-and-is-non-empt","errorCode":null,"errorMessage":"repo {}: segment {} already exists and is non-empty: {}","messagePattern":"repo (.+?): segment (.+?) already exists and is non-empty: (.+?)","errorType":"exception","errorClass":"io::Error","httpStatus":null,"severity":"error","filePath":"crates/commitlog/src/stream/writer.rs","lineNumber":466,"sourceCode":"    let segment_offset = last_written_tx_range\n        .as_ref()\n        .map(|range| range.end)\n        .unwrap_or_default();\n    let mut segment = loop {\n        match repo.create_segment(segment_offset, header) {\n            Ok(segment) => break segment,\n            Err(e) if e.kind() == io::ErrorKind::AlreadyExists => {\n                trace!(\"segment already exists\");\n                let mut s = repo.open_segment_writer(segment_offset)?;\n                let len = s.segment_len()?;\n                trace!(\"segment len: {len}\");\n                if len <= segment::Header::LEN as _ {\n                    trace!(\"overwriting existing segment\");\n                    repo.remove_segment(segment_offset)?;\n                    continue;\n                }\n\n                return Err(io::Error::new(\n                    e.kind(),\n                    format!(\n                        \"repo {}: segment {} already exists and is non-empty: {}\",\n                        repo, segment_offset, e\n                    ),\n                ));\n            }\n            Err(e) => return Err(e),\n        }\n    };\n    fallocate(&mut segment, &commitlog_options)?;\n\n    let index_writer = repo\n        .create_offset_index(segment_offset, commitlog_options.offset_index_len())\n        .inspect_err(|e| warn!(\"unable to create offset index segment={segment_offset} err={e:?}\"))\n        .map(|index| OffsetIndexWriter::new(index, commitlog_options))\n        .ok();\n","sourceCodeStart":448,"sourceCodeEnd":484,"githubUrl":"https://github.com/clockworklabs/SpacetimeDB/blob/524b4487d949b61a07d4f39c862d1290259dfd20/crates/commitlog/src/stream/writer.rs#L448-L484","documentation":"When the streaming writer rolls into a new segment it creates the segment file; creation returned AlreadyExists and the existing file is longer than a bare segment header, i.e. it already contains commits. Only header-only stubs are automatically removed and retried; real data is never silently overwritten, so the operation fails with this error naming the repo and segment offset.","triggerScenarios":"Replaying a bootstrap/replication stream into a commitlog repo that already contains segments covering the same offset range; running two writers against the same repo concurrently; restoring an old data directory and replaying overlapping history.","commonSituations":"Re-running follower bootstrap without clearing the data directory; a previous partial replay left segments behind; two nodes misconfigured to share one commitlog path.","solutions":["Clear or move aside the existing commitlog directory before re-bootstrapping.","Start the replay at a segment offset beyond the segments already present.","If the existing data is confirmed disposable, delete the named segment file and retry.","Ensure exactly one writer process per commitlog repo."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Before replay, scan the target repo for existing segments overlapping the range:\nfor seg_offset in existing_segment_offsets(repo)? {\n    if replay_range.contains(&seg_offset) {\n        return Err(format!(\"repo already holds segment {} in replay range\", seg_offset));\n    }\n}","typeGuard":null,"tryCatchPattern":"match writer.append_all(stream, progress).await {\n    Err(e) if e.kind() == io::ErrorKind::AlreadyExists => {\n        // Decide: clear the repo and restart replay, or move the resume point past\n        // the existing segment. Never blind-retry - the file will still be there.\n    }\n    r => r,\n}","preventionTips":["Clear or move aside the commitlog directory before re-bootstrapping.","Keep one writer process per commitlog repo.","Automate bootstrap so replay always starts beyond existing segments."],"tags":["commitlog","filesystem","bootstrap","rust"],"backgroundTag":"file-already-exists","analyzedSha":"524b4487d949b61a07d4f39c862d1290259dfd20","analyzedAt":"2026-08-16T23:58:54.611Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}