Immutable blocks with mmap reads

Flush sealed head chunks to ULID-named block directories on disk. Each
block contains CRC'd chunk segment files (mmap'd for reads), a binary
index (symbol table, series, postings with TOC), and a meta.json written
last as the immutability gate. WAL is truncated after block fsync,
preserving the crash-safety ording invariant.
This commit is contained in:
2026-07-04 14:59:39 -04:00
parent 376d3faf25
commit 42b03db2fa
16 changed files with 2176 additions and 2 deletions
+55
View File
@@ -0,0 +1,55 @@
package block
import (
"encoding/json"
"os"
"path/filepath"
)
// BlockMeta describes a block on disk.
type BlockMeta struct {
ULID string `json:"ulid"`
MinTime int64 `json:"minTime"`
MaxTime int64 `json:"maxTime"`
Stats BlockStats `json:"stats"`
Compaction CompactionInfo `json:"compaction"`
Version int `json:"version"`
}
// BlockStats holds summary statistics for a block.
type BlockStats struct {
NumSamples int `json:"numSamples"`
NumSeries int `json:"numSeries"`
NumChunks int `json:"numChunks"`
}
// CompactionInfo records the block's compaction lineage.
type CompactionInfo struct {
Level int `json:"level"`
Sources []string `json:"sources"`
}
const metaFilename = "meta.json"
// readMeta reads a block's meta.json from the given block directory.
func readMeta(dir string) (BlockMeta, error) {
data, err := os.ReadFile(filepath.Join(dir, metaFilename))
if err != nil {
return BlockMeta{}, err
}
var m BlockMeta
if err := json.Unmarshal(data, &m); err != nil {
return BlockMeta{}, err
}
return m, nil
}
// writeMeta writes a block's meta.json to the given block directory.
// This is the last file written when creating a block — the immutability gate.
func writeMeta(dir string, m BlockMeta) error {
data, err := json.MarshalIndent(m, "", " ")
if err != nil {
return err
}
return os.WriteFile(filepath.Join(dir, metaFilename), data, 0644)
}