|
1 | 1 | # SharpCoreDB 2.0.0.2 — What changed & the 2.x engine vs the 1.9.x line |
2 | 2 |
|
3 | 3 | - **Release:** `2.0.0.2` (2026-09-04) — 4-part patch release on the 2.0.0.x line. |
4 | | -- **Quality gate:** full suite **1770 tests / 0 failed**, CI green on Windows/Ubuntu/macOS + |
5 | | - CodeQL + SonarCloud + Server Compatibility Smoke for every merged PR. |
6 | | -- **Contents:** everything merged since 2.0.0.1 — the perf/hardening batch of PRs #376-#388 — |
7 | | - plus the consolidated 2.x-vs-1.9.x overview below. |
| 4 | +- **Quality gate:** full core suite **1777 tests / 0 failed**; CI-filtered core suite **1674 / 0**, |
| 5 | + plus SharpCoreDB.CQRS.Tests 64/64, VectorSearch 143, EF Core 116 and Functional.Linq2DB 24 — |
| 6 | + validated on Windows/Ubuntu/macOS + CodeQL + SonarCloud + Server Compatibility Smoke. |
| 7 | +- **Contents:** everything merged since 2.0.0.1 — the perf/hardening batch (PRs #376-#388), the |
| 8 | + release documentation PR #389, and the reopen **data-integrity hardening** PR #390 described |
| 9 | + below. |
8 | 10 | - See `docs/CHANGELOG.md` → `[2.0.0.2]` for the detailed change list and |
9 | 11 | `docs/2.0.0.0_WHAT_CHANGED.md` for the full 2.0.0.0 report (this document is the short, |
10 | 12 | forward-looking summary). |
|
15 | 17 | | Step | 1.9.x | 2.x | |
16 | 18 | |---|---|---| |
17 | 19 | | Record layout | variable-length length-prefixed rows only | **Fixed-width record layout** (constant stride + out-of-line `.ovf` overflow arena) for columnar PK tables; **default for new PK tables** since B7; per-table flag **persisted in metadata** (authoritative on reopen) with **1.x → 2.0 auto-migration** (opt-in via `FixedWidthRecordLayout`) | |
18 | | -| DELETE durability | logical delete + full-file rewrite at flush | **Commit-time tombstone markers** (in-place negative length-prefix) → durable in O(delete), no full-file rewrite | |
| 20 | +| DELETE durability | logical delete + full-file rewrite at flush | **Commit-time tombstone markers** (in-place negative length-prefix) → durable in O(delete), no full-file rewrite; legacy (1.x) variable-length tables additionally purge remaining versions of a deleted key so stale rows cannot resurrect after reopen | |
19 | 21 | | In-place writes | only same-length patches, buffered later | **Buffered in-place overwrites flushed per storage page** (C6); markers also batched per page (C5) | |
20 | 22 | | Single-file (`.scdb`) | fixed-layout registry, compression bugs | **Format v2** (block registry/FSM/table directory), crash-safe auto-migration, block-level Brotli/GZip/Zstd, envelope encryption, concurrent-write corruption fix (2.0.0.1) | |
21 | 23 |
|
|
46 | 48 | PageBased (not yet OLTP-ready: ~26K UPDATE ops/s vs ~245K on the fixed-width Columnar path); |
47 | 49 | PageBased remains explicit opt-in. |
48 | 50 | - 4-part patch versioning (`n.n.n.n`) since 2.0.0.0. |
| 51 | +- **Reopen data-integrity fixes (PR #390, found by the new reopen round-trip matrix):** |
| 52 | + - **Overflow-arena reload** — a valid zero-length record (empty TEXT/BLOB value) was treated as |
| 53 | + end-of-file by the `.ovf`/data-file loader, silently dropping every later row/block after a |
| 54 | + reopen; length-0 records are now parsed as valid empty payloads. |
| 55 | + - **Single-file fixed-width overflow arena** — freed blocks were serialized as zero-filled gaps |
| 56 | + that misaligned the sequential loader; dead slots are now persisted as negative-length |
| 57 | + tombstone markers tracked across sessions. |
| 58 | + - **Legacy (1.x) variable-length DELETE** — only the newest row version was tombstoned, so an |
| 59 | + older stale UPDATE version won the reopen index rebuild and resurrected the deleted row; |
| 60 | + DELETE now purges every remaining record of a deleted key (1.x-upgrade path made safe). |
| 61 | + - Locked in by `ReopenRoundTripMatrixTests` (four storage variants × insert/update/delete × |
| 62 | + three reopen rounds) and dedicated empty-value/delete regressions. |
49 | 63 |
|
50 | 64 | ## Benchmark snapshot (fair-PK, tuned harness config, median-of-3, same machine) |
51 | 65 |
|
|
0 commit comments