# Go Storage Engine Todo List This document outlines the implementation tasks for the Go Storage Engine, organized by development phases. Follow these guidelines: - Work on tasks in the order they appear - Check off exactly one item (✓) before moving to the next unchecked item - Each phase must be completed before starting the next phase - Test thoroughly before marking an item complete ## Phase A: Foundation - [✓] Setup project structure and Go module - [✓] Create directory structure following the package layout in PLAN.md - [✓] Initialize Go module and dependencies - [✓] Set up testing framework - [✓] Implement config package - [✓] Define configuration struct with serialization/deserialization - [✓] Include configurable parameters for durability, compaction, memory usage - [✓] Create manifest loading/saving functionality - [✓] Add versioning support for config changes - [✓] Build Write-Ahead Log (WAL) - [✓] Implement append-only file with atomic operations - [✓] Add Put/Delete operation encoding - [✓] Create replay functionality with error recovery - [✓] Implement both synchronous (default) and batched fsync modes - [✓] Add checksumming for entries - [✓] Write WAL tests - [✓] Test durability with simulated crashes - [✓] Verify replay correctness - [✓] Benchmark write performance with different sync options - [✓] Test error handling and recovery ## Phase B: In-Memory Layer - [✓] Implement MemTable - [✓] Create skip list data structure aligned to 64-byte cache lines - [✓] Add key/value insertion and lookup operations - [✓] Implement sorted key iteration - [✓] Add size tracking for flush threshold detection - [✓] Connect WAL replay to MemTable - [✓] Create recovery logic to rebuild MemTable from WAL - [✓] Implement consistent snapshot reads during recovery - [✓] Handle errors during replay with appropriate fallbacks - [✓] Test concurrent read/write scenarios - [✓] Verify reader isolation during writes - [✓] Test snapshot consistency guarantees - [✓] Benchmark read/write performance under load ## Phase C: Persistent Storage - [ ] Design SSTable format - [ ] Define 16KB block structure with restart points - [ ] Create checksumming for blocks (xxHash64) - [ ] Define index structure with entries every ~64KB - [ ] Design file footer with metadata (version, timestamp, key count, etc.) - [ ] Implement SSTable writer - [ ] Add functionality to convert MemTable to blocks - [ ] Create sparse index generator - [ ] Implement footer writing with checksums - [ ] Add atomic file creation for crash safety - [ ] Build SSTable reader - [ ] Implement block loading with validation - [ ] Create binary search through index - [ ] Develop iterator interface for scanning - [ ] Add error handling for corrupted files ## Phase D: Basic Engine Integration - [ ] Implement Level 0 flush mechanism - [ ] Create MemTable to SSTable conversion process - [ ] Implement file management and naming scheme - [ ] Add background flush triggering based on size - [ ] Create read path that merges data sources - [ ] Implement read from current MemTable - [ ] Add reads from immutable MemTables awaiting flush - [ ] Create mechanism to read from Level 0 SSTable files - [ ] Build priority-based lookup across all sources ## Phase E: Compaction - [ ] Implement tiered compaction strategy - [ ] Create file selection algorithm based on overlap/size - [ ] Implement merge-sorted reading from input files - [ ] Add atomic output file generation - [ ] Create size ratio and file count based triggering - [ ] Handle tombstones and key deletion - [ ] Implement tombstone markers - [ ] Create logic for tombstone garbage collection - [ ] Test deletion correctness across compactions - [ ] Manage file obsolescence and cleanup - [ ] Implement safe file deletion after compaction - [ ] Create consistent file tracking - [ ] Add error handling for cleanup failures - [ ] Build background compaction - [ ] Implement worker pool for compaction tasks - [ ] Add rate limiting to prevent I/O saturation - [ ] Create metrics for monitoring compaction progress - [ ] Implement priority scheduling for urgent compactions ## Phase F: Basic Atomicity and Features - [ ] Implement merged iterator across all levels - [ ] Create priority merging iterator - [ ] Add efficient seeking capabilities - [ ] Implement proper cleanup for resources - [ ] Add snapshot capability - [ ] Create point-in-time view mechanism - [ ] Implement consistent reads across all data sources - [ ] Add resource tracking and cleanup - [ ] Test isolation guarantees - [ ] Implement atomic batch operations - [ ] Create batch data structure for multiple operations - [ ] Implement atomic batch commit to WAL - [ ] Add crash recovery for batches - [ ] Design extensible interfaces for future transaction support - [ ] Add basic statistics and metrics - [ ] Implement counters for operations - [ ] Add timing measurements for critical paths - [ ] Create exportable metrics interface - [ ] Test accuracy of metrics ## Phase G: Optimization and Benchmarking - [ ] Develop benchmark suite - [ ] Create random/sequential write benchmarks - [ ] Implement point read and range scan benchmarks - [ ] Add compaction overhead measurements - [ ] Build reproducible benchmark harness - [ ] Optimize critical paths - [ ] Profile and identify bottlenecks - [ ] Optimize memory usage patterns - [ ] Improve cache efficiency in hot paths - [ ] Reduce GC pressure for large operations - [ ] Tune default configuration - [ ] Benchmark with different parameters - [ ] Determine optimal defaults for general use cases - [ ] Document configuration recommendations ## Phase H: Optional Enhancements - [ ] Add Bloom filters - [ ] Implement configurable Bloom filter - [ ] Add to SSTable format - [ ] Create adaptive sizing based on false positive rates - [ ] Benchmark improvement in read performance - [ ] Create monitoring hooks - [ ] Add detailed internal event tracking - [ ] Implement exportable metrics - [ ] Create health check mechanisms - [ ] Add performance alerts - [ ] Add crash recovery testing - [ ] Build fault injection framework - [ ] Create randomized crash scenarios - [ ] Implement validation for post-recovery state - [ ] Test edge cases in recovery ## API Implementation - [ ] Implement Engine interface - [ ] `Put(ctx context.Context, key, value []byte, opts ...WriteOption) error` - [ ] `Get(ctx context.Context, key []byte, opts ...ReadOption) ([]byte, error)` - [ ] `Delete(ctx context.Context, key []byte, opts ...WriteOption) error` - [ ] `Batch(ctx context.Context, ops []Operation, opts ...WriteOption) error` - [ ] `NewIterator(opts IteratorOptions) Iterator` - [ ] `Snapshot() Snapshot` - [ ] `Close() error` - [ ] Implement error types - [ ] `ErrIO` - I/O errors with recovery procedures - [ ] `ErrCorruption` - Data integrity issues - [ ] `ErrConfig` - Configuration errors - [ ] `ErrResource` - Resource exhaustion - [ ] `ErrConcurrency` - Race conditions - [ ] `ErrNotFound` - Key not found - [ ] Create comprehensive documentation - [ ] API usage examples - [ ] Configuration guidelines - [ ] Performance characteristics - [ ] Error handling recommendations