- 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
81 lines
2.8 KiB
Go
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
|
|
)
|