fix: 存储引擎回归 AriaEngine — sqlark 0.4.4 修复 SSTable 大 value 编码缺陷
- 0.4.4 引入 v2 格式(magic SSTC):u32 长度字段(修复 u16 截断 >64KB value) + UTF-8 字节精确估算(修复块大小低估导致写入越界)+ 超大条目独立成块 - 真实 Chromium 实测:300KB 中文内容写入 → close → 重启 → 读回数据完好,5 轮零失败 - schema.ts 切回 aria(version 0 + aria- 前缀内部库名)
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>🧪 在线演示 — MetonaSqlark v0.4.3</title>
|
||||
<title>🧪 在线演示 — MetonaSqlark v0.4.4</title>
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='8' fill='%236366f1'/><text x='16' y='22' text-anchor='middle' font-size='20' fill='white'>◈</text></svg>">
|
||||
<style>
|
||||
:root {
|
||||
@@ -84,7 +84,7 @@
|
||||
<a href="demo.html" class="nav-active">演示</a>
|
||||
<a href="benchmark.html">基准</a>
|
||||
</nav>
|
||||
<div class="status"><span class="dot" id="engine-dot"></span> <span id="engine-status">Memory</span> 模式 — v0.4.3</div>
|
||||
<div class="status"><span class="dot" id="engine-dot"></span> <span id="engine-status">Memory</span> 模式 — v0.4.4</div>
|
||||
<button class="btn btn-preset" onclick="switchEngine('memory')" id="btn-memory" style="margin:6px 4px 6px 0;padding:6px 12px;">⚡ Memory</button>
|
||||
<button class="btn btn-preset" onclick="switchEngine('aria')" id="btn-aria" style="margin:6px 0;padding:6px 12px;color:#ec4899;border-color:#ec4899;">🌲 Aria</button>
|
||||
</header>
|
||||
@@ -92,7 +92,7 @@
|
||||
<div class="main">
|
||||
<div class="editor-panel">
|
||||
<div class="editor-area">
|
||||
<textarea id="sql-input" placeholder="输入 SQL 语句... SELECT * FROM users; INSERT INTO users VALUES ('4', 'Diana', 'diana@test.com', 28); SELECT u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id;">-- 🚀 MetonaSqlark v0.4.3 在线演示
|
||||
<textarea id="sql-input" placeholder="输入 SQL 语句... SELECT * FROM users; INSERT INTO users VALUES ('4', 'Diana', 'diana@test.com', 28); SELECT u.name, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id;">-- 🚀 MetonaSqlark v0.4.4 在线演示
|
||||
-- 已预置 users / orders / products 表数据
|
||||
-- 新特性: ALTER TABLE · TRUNCATE TABLE · WAL同步 · MVCC · SQL注入防护
|
||||
|
||||
@@ -554,7 +554,7 @@ SELECT COUNT(*) as total FROM temp_logs;
|
||||
|
||||
-- 清理
|
||||
DROP TABLE temp_logs;`,
|
||||
aria: `-- 🌲 AriaEngine 演示 (v0.4.3)
|
||||
aria: `-- 🌲 AriaEngine 演示 (v0.4.4)
|
||||
-- 点击右上角「🌲 Aria」按钮切换数据库引擎到 AriaEngine
|
||||
-- 当前数据库即运行在 Aria 引擎上(LSM-Tree · WAL 崩溃恢复 · MVCC · BloomFilter)
|
||||
-- 基础 CRUD 与 Memory 引擎完全兼容
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>📖 API 文档 — MetonaSqlark v0.4.3</title>
|
||||
<title>📖 API 文档 — MetonaSqlark v0.4.4</title>
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='8' fill='%236366f1'/><text x='16' y='22' text-anchor='middle' font-size='20' fill='white'>◈</text></svg>">
|
||||
<style>
|
||||
:root {
|
||||
@@ -762,7 +762,8 @@ db.<span class="f">broadcastChange</span>(<span class="s">'users'</span>);</pre>
|
||||
<strong>v0.2.4 生产级</strong> — 二级索引 · MVCC · BloomFilter · WAL CRC全同步 · AES-GCM加密 · Savepoint · EXPLAIN · ANALYZE · REINDEX · VACUUM · BufferPool · 零死代码。<br>
|
||||
<strong>v0.3.2 表达式与并发</strong> — WAL full模式真正同步 · MVCC接入读写路径 · SSTableReader二分查找统一 · crypto实例化 · IndexedDB索引利用 · compactLevel public接口 · WAL大小阈值自动checkpoint · SQL注入防护 · ALTER TABLE · TRUNCATE TABLE · 多标签页同步 · IDB schema持久化。<br>
|
||||
<strong>v0.4.2 生产就绪与崩溃自愈</strong> — 残缺 SSTable 打开自动跳过(不删库)· WAL 记录与计数原子写入 + 按 key 扫描恢复 · 事务进行中 checkpoint 不截断 WAL · 二级索引跨重启自动恢复 · ALTER TABLE / 事务内 DDL 全引擎持久化 · ON UPDATE 外键级联(含更新主键)· OPFS schema 持久化(空表/索引完整保留)· `repair()` / `clearAll()` 统一自愈接口 · 迁移版本持久化到库内。<br>
|
||||
<strong>v0.4.3 关闭时序与后台任务加固</strong> — 后台 flush/compaction 不再使用 setTimeout 延迟(close 排空全部任务后才关闭存储,杜绝"backend 关闭后写存储/重开污染")· 后台失败在 `flush()`/`close()` 显式报告(`ARIA_BACKGROUND_ERROR`,不静默吞错)· 预加载等待链稳定(修复 compaction 竞态跳块丢数据)· 事务提交先落 WAL 再合并快照(崩溃一致)· OPFS 写操作串行队列 + close 等待 · 950 测试 51 套件。</p>
|
||||
<strong>v0.4.3 关闭时序与后台任务加固</strong> — 后台 flush/compaction 不再使用 setTimeout 延迟(close 排空全部任务后才关闭存储,杜绝"backend 关闭后写存储/重开污染")· 后台失败在 `flush()`/`close()` 显式报告(`ARIA_BACKGROUND_ERROR`,不静默吞错)· 预加载等待链稳定(修复 compaction 竞态跳块丢数据)· 事务提交先落 WAL 再合并快照(崩溃一致)· OPFS 写操作串行队列 + close 等待。<br>
|
||||
<strong>v0.4.4 SSTable 编码修复</strong> — 大段中文内容(如 300KB 笔记)写入 AriaEngine 不再崩溃:块大小估算改 UTF-8 字节精确计算(修复中文 3 字节 vs 1 码元导致的缓冲区低估越界)· 长度字段 u16 → u32(修复 >64KB value 截断)· 大 value 独立成块 · 格式 v2("SSTC")与 v1("SSTB")双格式兼容(旧库数据不丢)· 中文主键 / 大内容索引列同步支持 · 958 测试 52 套件。</p>
|
||||
|
||||
<h3>存储模式对比</h3>
|
||||
<table>
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@metona-team/metona-editor": "0.4.1",
|
||||
"@metona-team/metona-sqlark": "0.4.3",
|
||||
"@metona-team/metona-sqlark": "0.4.4",
|
||||
"@metona-team/metona-toast": "^0.5.0",
|
||||
"mermaid": "^10.9.6",
|
||||
"nanoid": "^5.1.5",
|
||||
|
||||
@@ -37,11 +37,9 @@ export type RecentFile = {
|
||||
}
|
||||
|
||||
// v0.5.0: 库名更换为 MarkLiteV2,与旧 Dexie 库(MarkLite)彻底隔离,旧数据已放弃
|
||||
// v0.6.1: 存储引擎使用 HybridEngine(write-through 直写 IndexedDB)。
|
||||
// 弃用 AriaEngine:SSTable 构建的块大小按 JS 字符串 length 估算(非 UTF-8 字节),
|
||||
// 且 valueLen 为 u16(上限 64KB)——大文件内容(中文 markdown)写入时
|
||||
// 缓冲区溢出崩溃(offset is out of bounds),关闭时 flush 半写导致下次打开
|
||||
// DataView 越界(ARIA_OPEN_ERROR)。等 sqlark 修复后回归 aria。
|
||||
// v0.6.1: 存储引擎回归 AriaEngine(LSM-Tree + WAL + MVCC,功能最强)。
|
||||
// sqlark 0.4.4 修复 SSTable 大 value 编码缺陷(v2 格式 "SSTC":
|
||||
// u32 长度字段 + UTF-8 字节精确估算 + 超大条目独立成块,兼容旧 v1 格式)。
|
||||
const DB_NAME = 'MarkLiteV2'
|
||||
|
||||
/**
|
||||
@@ -99,7 +97,8 @@ let isClosing = false
|
||||
let initChain: Promise<unknown> = Promise.resolve()
|
||||
|
||||
const RESET_PENDING_KEY = 'marklite-db-reset-pending'
|
||||
const DB_STORAGE_NAME = DB_NAME
|
||||
// AriaEngine 的 IndexedDBBackend 内部库名 = `aria-${name}`(sqlark 源码约定)
|
||||
const DB_STORAGE_NAME = `aria-${DB_NAME}`
|
||||
|
||||
/** 删除损坏数据库(无活动连接时立即成功) */
|
||||
function deleteStorageDatabase(): Promise<void> {
|
||||
@@ -129,9 +128,9 @@ async function resetCorruptDatabaseIfNeeded(): Promise<void> {
|
||||
async function createDatabase(): Promise<MetonaSqlark> {
|
||||
const db = await create({
|
||||
name: DB_NAME,
|
||||
mode: 'hybrid', // HybridEngine: 内存读写 + 直写 IndexedDB(行级存储,无 64KB 单值限制)
|
||||
diskEngine: 'indexeddb',
|
||||
version: 1, // IndexedDBEngine 需要合法版本号(0.4.2+ 打开时自动版本自适应)
|
||||
mode: 'aria', // AriaEngine: LSM-Tree + WAL + MVCC 快照隔离(sqlark 0.4.4 修复大 value 编码)
|
||||
diskEngine: 'indexeddb', // 底层存储后端(indexeddb | opfs | memory)
|
||||
version: 0, // AriaEngine 忽略版本号(0 表示无 schema 迁移门槛)
|
||||
onError: (err: Error) => logError('数据库错误', err),
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user