{"record":{"id":"4aca06ee8fc50b8a","repo":"clockworklabs/SpacetimeDB","slug":"segment-offset-already-exists","errorCode":null,"errorMessage":"segment {offset} already exists","messagePattern":"segment (.+?) already exists","errorType":"exception","errorClass":"std::io::Error","httpStatus":null,"severity":"error","filePath":"crates/commitlog/src/repo/mem.rs","lineNumber":66,"sourceCode":"impl fmt::Display for Memory {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(\"<memory>\")\n    }\n}\n\nimpl Repo for Memory {\n    type SegmentWriter = Segment;\n    type SegmentReader = ReadOnlySegment;\n\n    fn create_segment(&self, offset: u64, header: crate::segment::Header) -> io::Result<Self::SegmentWriter> {\n        let mut inner = self.segments.write().unwrap();\n        let mut segment = match inner.entry(offset) {\n            btree_map::Entry::Occupied(entry) => {\n                let entry = entry.get();\n                if entry.read().unwrap().is_empty() {\n                    Segment::from_shared(self.space.clone(), entry.clone())\n                } else {\n                    return Err(io::Error::new(\n                        io::ErrorKind::AlreadyExists,\n                        format!(\"segment {offset} already exists\"),\n                    ));\n                }\n            }\n            btree_map::Entry::Vacant(entry) => {\n                let storage = entry.insert(Arc::new(RwLock::new(Storage::new())));\n                Segment::from_shared(self.space.clone(), storage.clone())\n            }\n        };\n        header.write(&mut segment)?;\n\n        Ok(segment)\n    }\n\n    fn open_segment_writer(&self, offset: u64) -> io::Result<Self::SegmentWriter> {\n        let inner = self.segments.read().unwrap();\n        let Some(buf) = inner.get(&offset) else {","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/clockworklabs/SpacetimeDB/blob/6dee26c6efc2856793e12b148a59742964f5d783/crates/commitlog/src/repo/mem.rs#L48-L84","documentation":"In-memory counterpart of the filesystem 'segment already exists' error: Memory::create_segment looks the offset up in its BTreeMap and only recycles an entry that is empty. If a non-empty in-memory segment already exists at that offset, creation fails with AlreadyExists. Because Memory repos back tests and ephemeral stores, this almost always indicates offset bookkeeping bugs in test or setup code.","triggerScenarios":"Calling create_segment(offset, ...) twice at the same offset on a Memory repo where the first segment received data; deriving offsets from stale head state in a test harness.","commonSituations":"Unit tests that re-initialize a shared Memory repo without resetting it; helper code with off-by-one segment-offset arithmetic that collides with the previous segment.","solutions":["Create a fresh Memory repo (or clear its segments) between test cases that reuse offsets.","Derive new segment offsets from the current head's min_tx_offset plus its commit count, not from a constant.","If the segment legitimately exists, open it with open_segment_writer instead of creating."],"exampleFix":"// before\nlet repo = Memory::default();\nrepo.create_segment(0, hdr)?;\nrepo.create_segment(0, hdr)?; // AlreadyExists\n\n// after\nlet repo = Memory::default();\nlet seg = repo.create_segment(0, hdr)?;\n// append commits, then open (not create) when revisiting offset 0\nlet seg = repo.open_segment_writer(0)?;","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match repo.create_segment(off, hdr) {\n    Ok(seg) => seg,\n    Err(e) if e.kind() == std::io::ErrorKind::AlreadyExists => repo.open_segment_writer(off)?,\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Reset Memory repos between test cases instead of re-creating segments at the same offsets.","Centralize 'next segment offset' arithmetic in one helper shared by all tests.","Prefer open_segment_writer when a segment is known to already carry data."],"tags":["rust","commitlog","in-memory","segments","tests"],"backgroundTag":"segment-already-exists","analyzedSha":"6dee26c6efc2856793e12b148a59742964f5d783","analyzedAt":"2026-08-20T06:08:37.179Z","contentChangedAt":"2026-08-20T06:08:37.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}