{"record":{"id":"8fa892a5be852cce","repo":"clockworklabs/SpacetimeDB","slug":"alreadyexists-8fa892","errorCode":"AlreadyExists","errorMessage":"segment {offset} already exists","messagePattern":"segment (.+?) already exists","errorType":"exception","errorClass":"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/524b4487d949b61a07d4f39c862d1290259dfd20/crates/commitlog/src/repo/mem.rs#L48-L84","documentation":"In-memory repo counterpart of the filesystem AlreadyExists error: create_segment found an entry for this offset in the repo's segment map and it is non-empty (empty crash-remnant segments are reused). The guard prevents one Commitlog from silently clobbering another's in-memory data.","triggerScenarios":"Sharing a single repo::Memory instance across two Commitlog constructions; calling create_segment for an offset whose in-memory segment already holds a header or commits; test harnesses that reuse Memory state between cases.","commonSituations":"Unit tests reusing one Memory repo; simulating double-initialization; porting FS-repo code that relied on fresh directories.","solutions":["Construct a fresh Memory::new(...) for each Commitlog instance or test","Remove the existing segment (remove_segment) before re-creating it","Reuse the existing segment via open_segment_writer / resume instead of creating a new one"],"exampleFix":"// before\nlet repo = Memory::new(1 << 20);\nlet a = Commitlog::open_with_repo(repo.clone(), opts.clone())?;\nlet b = Commitlog::open_with_repo(repo, opts)?; // same offsets -> AlreadyExists\n\n// after\nlet b = Commitlog::open_with_repo(Memory::new(1 << 20), opts)?; // fresh space","handlingStrategy":"validation","validationCode":"// give each Commitlog its own memory space\nfn fresh_repo(budget: u64) -> Memory {\n    Memory::new(budget) // never share one Memory across instances\n}","typeGuard":"fn is_mem_segment_exists(e: &io::Error) -> bool {\n    e.kind() == io::ErrorKind::AlreadyExists\n        && e.to_string().contains(\"segment\")\n        && e.to_string().contains(\"already exists\")\n}","tryCatchPattern":"let segment = match repo.create_segment(offset, header) {\n    Ok(s) => s,\n    Err(e) if is_mem_segment_exists(&e) => repo.open_segment_writer(offset)?, // reuse existing\n    Err(e) => return Err(e),\n};","preventionTips":["Construct a new Memory::new(...) per Commitlog and per test","In test harnesses, build fresh repos in setup rather than resetting shared ones"],"tags":["rust","commitlog","memory-repo","segment","already-exists"],"backgroundTag":"resource-already-exists","analyzedSha":"524b4487d949b61a07d4f39c862d1290259dfd20","analyzedAt":"2026-08-16T23:58:54.611Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}