fix: v0.2.3 OPFS数据恢复 + Aria WAL事务边界修复
This commit is contained in:
@@ -133,8 +133,21 @@ export class AriaEngine implements IStorageEngine {
|
||||
// 6. 初始化 LSM(加载 SSTable 元数据)
|
||||
await this.lsm.init();
|
||||
|
||||
// 7. WAL 恢复(恢复未刷盘的数据)
|
||||
await this.wal.recover((record) => this.applyWALRecord(record));
|
||||
// 7. WAL 恢复(两阶段:先扫描事务边界,仅回放已提交事务)
|
||||
const committedTxns = new Set<number>();
|
||||
const allRecords: WALRecord[] = [];
|
||||
await this.wal.recover((r) => allRecords.push(r));
|
||||
// 第一遍:确定已提交事务
|
||||
for (const r of allRecords) {
|
||||
if (r.type === WALRecordType.COMMIT) committedTxns.add(r.txnId);
|
||||
if (r.type === WALRecordType.ROLLBACK) committedTxns.delete(r.txnId);
|
||||
}
|
||||
// 第二遍:仅应用 txnId==0(非事务)或已提交事务的数据
|
||||
for (const r of allRecords) {
|
||||
if (r.txnId === 0 || committedTxns.has(r.txnId)) {
|
||||
this.applyWALRecord(r);
|
||||
}
|
||||
}
|
||||
|
||||
// 8. Checkpoint Manager(BufferPool 暂简化,使用 flush 替代)
|
||||
this.checkpointManager = new CheckpointManager(
|
||||
@@ -668,6 +681,7 @@ export class AriaEngine implements IStorageEngine {
|
||||
case WALRecordType.COMMIT:
|
||||
case WALRecordType.ROLLBACK:
|
||||
case WALRecordType.BEGIN:
|
||||
case WALRecordType.DROP_TABLE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user