Files
go-kv/wal/constants.go
T
dailz cf913b1d52 feat: initialize project structure and error types
- go.mod with github.com/dailz/go-kv, Go 1.26.3, testify
- config/config.go with WalConfig, Validate() with checked arithmetic
- errors.go with sentinel errors (ErrCommitUnknown, ErrWriteStopped, etc.)
- wal/constants.go with all WAL format constants and enums
- wal/header.go with WAL File Header encode/decode (CRC32 IEEE)
- wal/record.go with Physical Record codec, block boundary, SplitIntoRecords
- wal/entry.go with WAL Entry codec (varint keys/values, OpType, ValueKind)
- wal/sequence.go with SequenceManager (atomic, CAS, overflow-safe)
- manifest/manifest.go with MANIFEST stub (Load/Save atomic)
- manifest/current.go with CURRENT file (WriteCurrent/ReadCurrent)
- Comprehensive tests for all modules
- .golangci.yml configuration
2026-06-12 13:23:27 +08:00

81 lines
2.8 KiB
Go

package wal
// WAL file format constants.
const (
// WalMagic is the file type identifier for WAL segment files ("WALK").
WalMagic uint32 = 0x57414C4B
// WalFormatVersion is the WAL file format version. First version is 1.
WalFormatVersion uint16 = 1
// WalFileHeaderSize is the size of the WAL file header in bytes.
// Fields: magic(4) + formatVersion(2) + headerSize(2) + blockSize(4) +
// segmentID(8) + startSequence(8) + headerCRC(4) = 32.
WalFileHeaderSize = 32
// WalBlockSize is the fixed size of each WAL block in bytes (32 KB).
WalBlockSize = 32 * 1024
// PhysicalRecordHeaderSize is the size of a physical record header in bytes.
// Fields: crc32c(4) + length(2) + type(1) = 7.
PhysicalRecordHeaderSize = 7
// WalBatchHeaderSize is the size of a WAL batch header in bytes.
// Fields: flags(2) + baseSequence(8) + entryCount(4) + entriesSize(4) = 18.
WalBatchHeaderSize = 18
// MaxWalBatchEntryCount limits the number of entries in a single batch.
MaxWalBatchEntryCount uint32 = 10000
// MaxWalBatchEntriesSize limits the total size of the entries region in bytes (4 MB).
MaxWalBatchEntriesSize uint32 = 4 * 1024 * 1024
// MaxWalKeyBytes limits the size of a single key in bytes (4 KB).
MaxWalKeyBytes uint32 = 4 * 1024
// MaxWalInlineValueBytes limits the size of an inline value in bytes (4 KB).
// Values exceeding this must use ValueLogPointer.
MaxWalInlineValueBytes uint32 = 4 * 1024
// MaxWalVarintBytes is the maximum encoded length of a varint field.
MaxWalVarintBytes = 5
// DefaultMaxWalSegmentSize is the default maximum size of a WAL segment file (64 MB).
DefaultMaxWalSegmentSize uint64 = 64 * 1024 * 1024
)
// Fragment types for physical records.
const (
// RecInvalid is an illegal fragment type used for corruption detection.
RecInvalid uint8 = 0
// RecFull indicates a complete WAL batch in a single physical record.
RecFull uint8 = 1
// RecFirst is the first fragment of a multi-record WAL batch.
RecFirst uint8 = 2
// RecMiddle is a middle fragment (may appear zero or more times).
RecMiddle uint8 = 3
// RecLast is the last fragment of a multi-record WAL batch.
RecLast uint8 = 4
)
// OpType represents the operation type of a WAL entry.
const (
// OpInvalid is an illegal operation type used for corruption detection.
OpInvalid uint8 = 0
// OpPut represents a key-value put operation.
OpPut uint8 = 1
// OpDelete represents a key deletion operation.
OpDelete uint8 = 2
)
// ValueKind represents how the value field is encoded in a WAL entry.
const (
// VKNone indicates no value (used with Delete operations).
VKNone uint8 = 0
// VKInline indicates the value field contains inline user bytes.
VKInline uint8 = 1
// VKValueLogPointer indicates the value field contains an encoded Value Log pointer.
VKValueLogPointer uint8 = 2
)