{"record":{"id":"08744408edc8efa1","repo":"clockworklabs/SpacetimeDB","slug":"segment-offset-does-not-exist","errorCode":null,"errorMessage":"segment {offset} does not exist","messagePattern":"segment (.+?) does not exist","errorType":"exception","errorClass":"std::io::Error","httpStatus":null,"severity":"error","filePath":"crates/commitlog/src/repo/mem.rs","lineNumber":85,"sourceCode":"                        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 {\n            return Err(io::Error::new(\n                io::ErrorKind::NotFound,\n                format!(\"segment {offset} does not exist\"),\n            ));\n        };\n        Ok(Segment::from_shared(self.space.clone(), buf.clone()))\n    }\n\n    fn open_segment_reader(&self, offset: u64) -> io::Result<Self::SegmentReader> {\n        self.open_segment_writer(offset).map(Into::into)\n    }\n\n    fn remove_segment(&self, offset: u64) -> io::Result<()> {\n        let mut inner = self.segments.write().unwrap();\n        if inner.remove(&offset).is_none() {\n            return Err(io::Error::new(\n                io::ErrorKind::NotFound,\n                format!(\"segment {offset} does not exist\"),\n            ));","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/clockworklabs/SpacetimeDB/blob/6dee26c6efc2856793e12b148a59742964f5d783/crates/commitlog/src/repo/mem.rs#L67-L103","documentation":"In-memory Memory::open_segment_writer (and, by delegation, open_segment_reader) failed because no segment exists in the map at the given offset; the BTreeMap lookup miss is converted to io::ErrorKind::NotFound with this message. It signals offset bookkeeping pointing at a segment that was never created or has been removed - on the filesystem repo the OS returns the equivalent NotFound from opening a nonexistent file.","triggerScenarios":"Opening a segment offset that was never created (or was removed) on a Memory repo: opening the head before the first create_segment, computing an offset from the wrong base, or reopening a segment after remove_segment.","commonSituations":"Test harnesses that assume a segment exists after truncation/removal; offset math that forgets a head segment starts at its min_tx_offset rather than zero after rollover.","solutions":["Create the segment before opening it - track the set of live offsets in the harness.","Re-check offset arithmetic: after N commits the next segment offset is head.min_tx_offset + head commit count, not a file index.","If the segment was removed deliberately, stop referencing that offset."],"exampleFix":"// before\nlet seg = repo.open_segment_writer(next_offset)?; // NotFound: never created\n\n// after\nlet seg = repo.create_segment(next_offset, header)?;\nlet seg = repo.open_segment_writer(next_offset)?; // open only after create","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match repo.open_segment_writer(off) {\n    Ok(seg) => seg,\n    Err(e) if e.kind() == std::io::ErrorKind::NotFound => repo.create_segment(off, hdr)?,\n    Err(e) => return Err(e.into()),\n}","preventionTips":["Maintain an explicit list of live segment offsets in test harnesses instead of assuming existence.","Follow create-then-open: never open an offset you did not create or verify.","After remove_segment, purge the offset from any cached bookkeeping."],"tags":["rust","commitlog","in-memory","segments","tests"],"backgroundTag":"segment-not-found","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"}