|
2 | 2 |
|
3 | 3 | All notable changes to SurfManager will be documented in this file. |
4 | 4 |
|
| 5 | +## [2.5.0] - 2026-02-07 |
| 6 | + |
| 7 | +### Summary |
| 8 | + |
| 9 | +Major performance optimization release. Backup/restore operations are now 3-5x faster, and session listing is instant. |
| 10 | + |
| 11 | +### 🚀 Performance Improvements |
| 12 | + |
| 13 | +**Parallel File Copying** |
| 14 | +- Backup and restore now use a worker pool with all available CPU cores |
| 15 | +- Each worker uses optimized 4MB I/O buffers for maximum throughput |
| 16 | +- File operations run concurrently instead of sequentially |
| 17 | + |
| 18 | +**Streaming Hash Computation** |
| 19 | +- Files are hashed while being copied using `io.TeeReader` |
| 20 | +- Eliminates the previous double-read pattern (copy then hash) |
| 21 | +- Reduces I/O by 50% during backup operations |
| 22 | + |
| 23 | +**Cached Metadata** |
| 24 | +- Session size and file count now stored in `.backup_meta.json` |
| 25 | +- Session listing no longer walks directory trees to calculate size |
| 26 | +- Session list loads instantly regardless of backup size |
| 27 | + |
| 28 | +**Lazy Hash Verification** |
| 29 | +- Hash verification removed from session listing (was blocking UI) |
| 30 | +- New on-demand `VerifySessionIntegrity` API for explicit integrity checks |
| 31 | +- Corrupted status no longer computed at list time |
| 32 | + |
| 33 | +### ✨ New Features |
| 34 | + |
| 35 | +**Backend** |
| 36 | +- Added `VerifySessionIntegrity(appKey, sessionName)` API for on-demand backup verification |
| 37 | +- Enhanced metadata schema with `hash_version`, `size`, and `file_count` fields |
| 38 | +- New v2 hash algorithm matching streaming computation |
| 39 | + |
| 40 | +### 📝 Technical Changes |
| 41 | + |
| 42 | +**New Types** |
| 43 | +- `CopyJob` - represents a file copy operation with source, destination, and relative path |
| 44 | +- `FileCopyResult` - holds copy result including size, hash, and error status |
| 45 | +- `BackupMetadata` - full metadata structure with cached values |
| 46 | + |
| 47 | +**New Functions** |
| 48 | +- `copyFileStreaming()` - copies files while computing SHA256 in single pass |
| 49 | +- `copyWithWorkerPool()` - parallel file copying with worker pool |
| 50 | +- `collectCopyJobs*()` - job collection helpers for items and addons |
| 51 | +- `computeHashFromResults()` - aggregate hash from sorted file results |
| 52 | +- `readBackupMetadataFull()` - reads full metadata including cached size |
| 53 | +- `computeBackupHashV2()` - v2 hash algorithm for new backups |
| 54 | + |
| 55 | +### 🔄 Backwards Compatibility |
| 56 | + |
| 57 | +- Old backups without cached size fall back to directory walk |
| 58 | +- Old hash format (v1) automatically detected and verified correctly |
| 59 | +- No migration required - old backups work seamlessly |
| 60 | + |
5 | 61 | ## [2.2.1] - 2026-02-05 |
6 | 62 |
|
7 | 63 | ### Summary (vs 2.2.0) |
|
0 commit comments