@yydb/light-db 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/LightDB.d.ts +194 -0
- package/dist/api/LightDB.d.ts.map +1 -0
- package/dist/api/LightDB.js +299 -0
- package/dist/api/LightDB.js.map +1 -0
- package/dist/api/Transaction.d.ts +100 -0
- package/dist/api/Transaction.d.ts.map +1 -0
- package/dist/api/Transaction.js +263 -0
- package/dist/api/Transaction.js.map +1 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +54 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types.d.ts +154 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +7 -0
- package/dist/api/types.js.map +1 -0
- package/dist/collection/Collection.d.ts +235 -0
- package/dist/collection/Collection.d.ts.map +1 -0
- package/dist/collection/Collection.js +671 -0
- package/dist/collection/Collection.js.map +1 -0
- package/dist/collection/QueryBuilder.d.ts +225 -0
- package/dist/collection/QueryBuilder.d.ts.map +1 -0
- package/dist/collection/QueryBuilder.js +475 -0
- package/dist/collection/QueryBuilder.js.map +1 -0
- package/dist/collection/QueryParser.d.ts +117 -0
- package/dist/collection/QueryParser.d.ts.map +1 -0
- package/dist/collection/QueryParser.js +438 -0
- package/dist/collection/QueryParser.js.map +1 -0
- package/dist/collection/index.d.ts +42 -0
- package/dist/collection/index.d.ts.map +1 -0
- package/dist/collection/index.js +41 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/collection/types.d.ts +365 -0
- package/dist/collection/types.d.ts.map +1 -0
- package/dist/collection/types.js +7 -0
- package/dist/collection/types.js.map +1 -0
- package/dist/constants/index.d.ts +51 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +68 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/errors/index.d.ts +69 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +132 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +220 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +729 -0
- package/dist/index.js.map +1 -0
- package/dist/indexes/BPlusTree.d.ts +181 -0
- package/dist/indexes/BPlusTree.d.ts.map +1 -0
- package/dist/indexes/BPlusTree.js +528 -0
- package/dist/indexes/BPlusTree.js.map +1 -0
- package/dist/indexes/IndexManager.d.ts +236 -0
- package/dist/indexes/IndexManager.d.ts.map +1 -0
- package/dist/indexes/IndexManager.js +502 -0
- package/dist/indexes/IndexManager.js.map +1 -0
- package/dist/indexes/PrimaryIndex.d.ts +240 -0
- package/dist/indexes/PrimaryIndex.d.ts.map +1 -0
- package/dist/indexes/PrimaryIndex.js +354 -0
- package/dist/indexes/PrimaryIndex.js.map +1 -0
- package/dist/indexes/SecondaryIndex.d.ts +204 -0
- package/dist/indexes/SecondaryIndex.d.ts.map +1 -0
- package/dist/indexes/SecondaryIndex.js +480 -0
- package/dist/indexes/SecondaryIndex.js.map +1 -0
- package/dist/indexes/errors.d.ts +66 -0
- package/dist/indexes/errors.d.ts.map +1 -0
- package/dist/indexes/errors.js +117 -0
- package/dist/indexes/errors.js.map +1 -0
- package/dist/indexes/index.d.ts +52 -0
- package/dist/indexes/index.d.ts.map +1 -0
- package/dist/indexes/index.js +131 -0
- package/dist/indexes/index.js.map +1 -0
- package/dist/indexes/types.d.ts +246 -0
- package/dist/indexes/types.d.ts.map +1 -0
- package/dist/indexes/types.js +30 -0
- package/dist/indexes/types.js.map +1 -0
- package/dist/performance/BatchWALWriter.d.ts +185 -0
- package/dist/performance/BatchWALWriter.d.ts.map +1 -0
- package/dist/performance/BatchWALWriter.js +490 -0
- package/dist/performance/BatchWALWriter.js.map +1 -0
- package/dist/performance/ColumnarStorage.d.ts +138 -0
- package/dist/performance/ColumnarStorage.d.ts.map +1 -0
- package/dist/performance/ColumnarStorage.js +875 -0
- package/dist/performance/ColumnarStorage.js.map +1 -0
- package/dist/performance/LazyQuery.d.ts +307 -0
- package/dist/performance/LazyQuery.d.ts.map +1 -0
- package/dist/performance/LazyQuery.js +588 -0
- package/dist/performance/LazyQuery.js.map +1 -0
- package/dist/performance/OptimizedBuffer.d.ts +375 -0
- package/dist/performance/OptimizedBuffer.d.ts.map +1 -0
- package/dist/performance/OptimizedBuffer.js +730 -0
- package/dist/performance/OptimizedBuffer.js.map +1 -0
- package/dist/performance/RWLock.d.ts +260 -0
- package/dist/performance/RWLock.d.ts.map +1 -0
- package/dist/performance/RWLock.js +570 -0
- package/dist/performance/RWLock.js.map +1 -0
- package/dist/performance/index.d.ts +41 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +162 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/performance/types.d.ts +247 -0
- package/dist/performance/types.d.ts.map +1 -0
- package/dist/performance/types.js +26 -0
- package/dist/performance/types.js.map +1 -0
- package/dist/storage/Checkpoint.d.ts +128 -0
- package/dist/storage/Checkpoint.d.ts.map +1 -0
- package/dist/storage/Checkpoint.js +251 -0
- package/dist/storage/Checkpoint.js.map +1 -0
- package/dist/storage/LightFile.d.ts +227 -0
- package/dist/storage/LightFile.d.ts.map +1 -0
- package/dist/storage/LightFile.js +526 -0
- package/dist/storage/LightFile.js.map +1 -0
- package/dist/storage/Recovery.d.ts +172 -0
- package/dist/storage/Recovery.d.ts.map +1 -0
- package/dist/storage/Recovery.js +399 -0
- package/dist/storage/Recovery.js.map +1 -0
- package/dist/storage/SHMFile.d.ts +243 -0
- package/dist/storage/SHMFile.d.ts.map +1 -0
- package/dist/storage/SHMFile.js +436 -0
- package/dist/storage/SHMFile.js.map +1 -0
- package/dist/storage/StorageEngine.d.ts +146 -0
- package/dist/storage/StorageEngine.d.ts.map +1 -0
- package/dist/storage/StorageEngine.js +353 -0
- package/dist/storage/StorageEngine.js.map +1 -0
- package/dist/storage/WALFile.d.ts +248 -0
- package/dist/storage/WALFile.d.ts.map +1 -0
- package/dist/storage/WALFile.js +597 -0
- package/dist/storage/WALFile.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +153 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/types/index.d.ts +220 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/binary.d.ts +271 -0
- package/dist/utils/binary.d.ts.map +1 -0
- package/dist/utils/binary.js +454 -0
- package/dist/utils/binary.js.map +1 -0
- package/dist/utils/file.d.ts +166 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +346 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +39 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +37 -0
- package/readme.md +124 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 崩溃恢复流程实现
|
|
3
|
+
* 负责数据库启动时的恢复操作
|
|
4
|
+
*/
|
|
5
|
+
import { RecoveryResult, RecordMap, WalRecord } from "../types";
|
|
6
|
+
import { LightFileManager, PageManager } from "./LightFile";
|
|
7
|
+
import { WalManager } from "./WALFile";
|
|
8
|
+
import { WalIndexManager } from "./SHMFile";
|
|
9
|
+
/**
|
|
10
|
+
* 恢复阶段枚举
|
|
11
|
+
*/
|
|
12
|
+
export declare enum RecoveryPhase {
|
|
13
|
+
/** 初始化阶段 */
|
|
14
|
+
Initialize = "initialize",
|
|
15
|
+
/** 加载 SHM 索引 */
|
|
16
|
+
LoadSHM = "load_shm",
|
|
17
|
+
/** 加载 Light 文件 */
|
|
18
|
+
LoadLight = "load_light",
|
|
19
|
+
/** 回放 WAL */
|
|
20
|
+
ReplayWAL = "replay_wal",
|
|
21
|
+
/** 重建索引 */
|
|
22
|
+
RebuildIndex = "rebuild_index",
|
|
23
|
+
/** 完成 */
|
|
24
|
+
Complete = "complete",
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 恢复上下文
|
|
28
|
+
* 存储恢复过程中的状态信息
|
|
29
|
+
*/
|
|
30
|
+
export interface RecoveryContext {
|
|
31
|
+
/** 当前阶段 */
|
|
32
|
+
phase: RecoveryPhase;
|
|
33
|
+
/** SHM 是否有效 */
|
|
34
|
+
shmValid: boolean;
|
|
35
|
+
/** Light 文件是否存在 */
|
|
36
|
+
lightExists: boolean;
|
|
37
|
+
/** WAL 文件是否存在 */
|
|
38
|
+
walExists: boolean;
|
|
39
|
+
/** 最后检查点 LSN */
|
|
40
|
+
lastCheckpointLsn: bigint;
|
|
41
|
+
/** 需要回放的 WAL 记录数 */
|
|
42
|
+
recordsToReplay: number;
|
|
43
|
+
/** 已回放的记录数 */
|
|
44
|
+
recordsReplayed: number;
|
|
45
|
+
/** 错误信息 */
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 恢复管理器
|
|
50
|
+
* 负责数据库启动时的完整恢复流程
|
|
51
|
+
*/
|
|
52
|
+
export declare class RecoveryManager {
|
|
53
|
+
private readonly basePath;
|
|
54
|
+
private readonly dbName;
|
|
55
|
+
private readonly lightFileManager;
|
|
56
|
+
private readonly walManager;
|
|
57
|
+
private readonly walIndexManager;
|
|
58
|
+
private readonly pageManager;
|
|
59
|
+
private context;
|
|
60
|
+
/**
|
|
61
|
+
* 创建恢复管理器
|
|
62
|
+
* @param basePath 数据库基础路径
|
|
63
|
+
* @param dbName 数据库名称
|
|
64
|
+
* @param lightFileManager Light 文件管理器
|
|
65
|
+
* @param walManager WAL 管理器
|
|
66
|
+
* @param walIndexManager WAL 索引管理器
|
|
67
|
+
* @param pageManager 页面管理器
|
|
68
|
+
*/
|
|
69
|
+
constructor(
|
|
70
|
+
basePath: string,
|
|
71
|
+
dbName: string,
|
|
72
|
+
lightFileManager: LightFileManager,
|
|
73
|
+
walManager: WalManager,
|
|
74
|
+
walIndexManager: WalIndexManager,
|
|
75
|
+
pageManager: PageManager,
|
|
76
|
+
);
|
|
77
|
+
/**
|
|
78
|
+
* 执行完整恢复流程
|
|
79
|
+
*/
|
|
80
|
+
recover(): Promise<RecoveryResult>;
|
|
81
|
+
/**
|
|
82
|
+
* 初始化恢复
|
|
83
|
+
*/
|
|
84
|
+
private initializeRecovery;
|
|
85
|
+
/**
|
|
86
|
+
* 检查 WAL 文件是否存在
|
|
87
|
+
*/
|
|
88
|
+
private checkWalExists;
|
|
89
|
+
/**
|
|
90
|
+
* 加载 SHM 索引
|
|
91
|
+
*/
|
|
92
|
+
private loadShmIndex;
|
|
93
|
+
/**
|
|
94
|
+
* 加载 Light 文件
|
|
95
|
+
*/
|
|
96
|
+
private loadLightFile;
|
|
97
|
+
/**
|
|
98
|
+
* 回放 WAL 记录
|
|
99
|
+
* @param records 当前记录映射
|
|
100
|
+
*/
|
|
101
|
+
private replayWal;
|
|
102
|
+
/**
|
|
103
|
+
* 应用单条 WAL 记录
|
|
104
|
+
* @param records 记录映射
|
|
105
|
+
* @param record WAL 记录
|
|
106
|
+
*/
|
|
107
|
+
private applyWalRecord;
|
|
108
|
+
/**
|
|
109
|
+
* 重建索引
|
|
110
|
+
*/
|
|
111
|
+
private rebuildIndex;
|
|
112
|
+
/**
|
|
113
|
+
* 获取恢复上下文
|
|
114
|
+
*/
|
|
115
|
+
getContext(): RecoveryContext;
|
|
116
|
+
/**
|
|
117
|
+
* 获取恢复后的记录
|
|
118
|
+
*/
|
|
119
|
+
getRecoveredRecords(): Promise<RecordMap>;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 快速恢复管理器
|
|
123
|
+
* 利用 SHM 索引加速恢复过程
|
|
124
|
+
*/
|
|
125
|
+
export declare class FastRecoveryManager {
|
|
126
|
+
private readonly basePath;
|
|
127
|
+
private readonly dbName;
|
|
128
|
+
private readonly lightFileManager;
|
|
129
|
+
private readonly walManager;
|
|
130
|
+
private readonly walIndexManager;
|
|
131
|
+
/**
|
|
132
|
+
* 创建快速恢复管理器
|
|
133
|
+
* @param basePath 数据库基础路径
|
|
134
|
+
* @param dbName 数据库名称
|
|
135
|
+
* @param lightFileManager Light 文件管理器
|
|
136
|
+
* @param walManager WAL 管理器
|
|
137
|
+
* @param walIndexManager WAL 索引管理器
|
|
138
|
+
*/
|
|
139
|
+
constructor(basePath: string, dbName: string, lightFileManager: LightFileManager, walManager: WalManager, walIndexManager: WalIndexManager);
|
|
140
|
+
/**
|
|
141
|
+
* 快速恢复
|
|
142
|
+
* 只回放必要的 WAL 记录
|
|
143
|
+
*/
|
|
144
|
+
fastRecover(): Promise<RecoveryResult>;
|
|
145
|
+
/**
|
|
146
|
+
* 应用 WAL 记录
|
|
147
|
+
*/
|
|
148
|
+
private applyRecord;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 恢复验证器
|
|
152
|
+
* 验证恢复后的数据完整性
|
|
153
|
+
*/
|
|
154
|
+
export declare class RecoveryValidator {
|
|
155
|
+
/**
|
|
156
|
+
* 验证记录完整性
|
|
157
|
+
* @param records 记录映射
|
|
158
|
+
*/
|
|
159
|
+
validateRecords(records: RecordMap): {
|
|
160
|
+
valid: boolean;
|
|
161
|
+
errors: string[];
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* 验证 WAL 完整性
|
|
165
|
+
* @param walRecords WAL 记录数组
|
|
166
|
+
*/
|
|
167
|
+
validateWAL(walRecords: WalRecord[]): {
|
|
168
|
+
valid: boolean;
|
|
169
|
+
errors: string[];
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=Recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Recovery.d.ts","sourceRoot":"","sources":["../../src/storage/Recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 崩溃恢复流程实现
|
|
4
|
+
* 负责数据库启动时的恢复操作
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RecoveryValidator = exports.FastRecoveryManager = exports.RecoveryManager = exports.RecoveryPhase = void 0;
|
|
8
|
+
const constants_1 = require("../constants");
|
|
9
|
+
const WALFile_1 = require("./WALFile");
|
|
10
|
+
const errors_1 = require("../errors");
|
|
11
|
+
/**
|
|
12
|
+
* 恢复阶段枚举
|
|
13
|
+
*/
|
|
14
|
+
var RecoveryPhase;
|
|
15
|
+
(function (RecoveryPhase) {
|
|
16
|
+
/** 初始化阶段 */
|
|
17
|
+
RecoveryPhase["Initialize"] = "initialize";
|
|
18
|
+
/** 加载 SHM 索引 */
|
|
19
|
+
RecoveryPhase["LoadSHM"] = "load_shm";
|
|
20
|
+
/** 加载 Light 文件 */
|
|
21
|
+
RecoveryPhase["LoadLight"] = "load_light";
|
|
22
|
+
/** 回放 WAL */
|
|
23
|
+
RecoveryPhase["ReplayWAL"] = "replay_wal";
|
|
24
|
+
/** 重建索引 */
|
|
25
|
+
RecoveryPhase["RebuildIndex"] = "rebuild_index";
|
|
26
|
+
/** 完成 */
|
|
27
|
+
RecoveryPhase["Complete"] = "complete";
|
|
28
|
+
})(RecoveryPhase || (exports.RecoveryPhase = RecoveryPhase = {}));
|
|
29
|
+
/**
|
|
30
|
+
* 恢复管理器
|
|
31
|
+
* 负责数据库启动时的完整恢复流程
|
|
32
|
+
*/
|
|
33
|
+
class RecoveryManager {
|
|
34
|
+
/**
|
|
35
|
+
* 创建恢复管理器
|
|
36
|
+
* @param basePath 数据库基础路径
|
|
37
|
+
* @param dbName 数据库名称
|
|
38
|
+
* @param lightFileManager Light 文件管理器
|
|
39
|
+
* @param walManager WAL 管理器
|
|
40
|
+
* @param walIndexManager WAL 索引管理器
|
|
41
|
+
* @param pageManager 页面管理器
|
|
42
|
+
*/
|
|
43
|
+
constructor(basePath, dbName, lightFileManager, walManager, walIndexManager, pageManager) {
|
|
44
|
+
this.basePath = basePath;
|
|
45
|
+
this.dbName = dbName;
|
|
46
|
+
this.lightFileManager = lightFileManager;
|
|
47
|
+
this.walManager = walManager;
|
|
48
|
+
this.walIndexManager = walIndexManager;
|
|
49
|
+
this.pageManager = pageManager;
|
|
50
|
+
this.context = {
|
|
51
|
+
phase: RecoveryPhase.Initialize,
|
|
52
|
+
shmValid: false,
|
|
53
|
+
lightExists: false,
|
|
54
|
+
walExists: false,
|
|
55
|
+
lastCheckpointLsn: 0n,
|
|
56
|
+
recordsToReplay: 0,
|
|
57
|
+
recordsReplayed: 0,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 执行完整恢复流程
|
|
62
|
+
*/
|
|
63
|
+
async recover() {
|
|
64
|
+
const startTime = Date.now();
|
|
65
|
+
const records = new Map();
|
|
66
|
+
try {
|
|
67
|
+
this.context.phase = RecoveryPhase.Initialize;
|
|
68
|
+
await this.initializeRecovery();
|
|
69
|
+
this.context.phase = RecoveryPhase.LoadSHM;
|
|
70
|
+
await this.loadShmIndex();
|
|
71
|
+
this.context.phase = RecoveryPhase.LoadLight;
|
|
72
|
+
const lightRecords = await this.loadLightFile();
|
|
73
|
+
for (const [key, value] of lightRecords) {
|
|
74
|
+
records.set(key, value);
|
|
75
|
+
}
|
|
76
|
+
this.context.phase = RecoveryPhase.ReplayWAL;
|
|
77
|
+
const walRecords = await this.replayWal(records);
|
|
78
|
+
this.context.recordsReplayed = walRecords;
|
|
79
|
+
this.context.phase = RecoveryPhase.RebuildIndex;
|
|
80
|
+
await this.rebuildIndex();
|
|
81
|
+
this.context.phase = RecoveryPhase.Complete;
|
|
82
|
+
const endTime = Date.now();
|
|
83
|
+
const durationMs = endTime - startTime;
|
|
84
|
+
return {
|
|
85
|
+
success: true,
|
|
86
|
+
recordsReplayed: walRecords,
|
|
87
|
+
pagesLoaded: this.pageManager.getPageCount(),
|
|
88
|
+
durationMs,
|
|
89
|
+
};
|
|
90
|
+
} catch (error) {
|
|
91
|
+
const err = error;
|
|
92
|
+
this.context.error = err.message;
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
recordsReplayed: this.context.recordsReplayed,
|
|
96
|
+
pagesLoaded: this.pageManager.getPageCount(),
|
|
97
|
+
durationMs: Date.now() - startTime,
|
|
98
|
+
error: err.message,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 初始化恢复
|
|
104
|
+
*/
|
|
105
|
+
async initializeRecovery() {
|
|
106
|
+
this.context.lightExists = await this.lightFileManager.exists();
|
|
107
|
+
this.context.walExists = await this.checkWalExists();
|
|
108
|
+
if (this.context.lightExists) {
|
|
109
|
+
const header = await this.lightFileManager.readHeader();
|
|
110
|
+
if (header) {
|
|
111
|
+
this.context.lastCheckpointLsn = header.lastSnapshotLsn;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 检查 WAL 文件是否存在
|
|
117
|
+
*/
|
|
118
|
+
async checkWalExists() {
|
|
119
|
+
const reader = new WALFile_1.WalReader(this.basePath, this.dbName);
|
|
120
|
+
await reader.open();
|
|
121
|
+
const size = reader.getFileSize();
|
|
122
|
+
await reader.close();
|
|
123
|
+
return size > 0;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 加载 SHM 索引
|
|
127
|
+
*/
|
|
128
|
+
async loadShmIndex() {
|
|
129
|
+
const shmManager = this.walIndexManager.getShmManager();
|
|
130
|
+
this.context.shmValid = await shmManager.load();
|
|
131
|
+
if (!this.context.shmValid) {
|
|
132
|
+
// SHM 无效,需要重建
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 加载 Light 文件
|
|
137
|
+
*/
|
|
138
|
+
async loadLightFile() {
|
|
139
|
+
if (!this.context.lightExists) {
|
|
140
|
+
return new Map();
|
|
141
|
+
}
|
|
142
|
+
await this.lightFileManager.open();
|
|
143
|
+
const records = await this.lightFileManager.loadAllRecords();
|
|
144
|
+
await this.lightFileManager.close();
|
|
145
|
+
return records;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 回放 WAL 记录
|
|
149
|
+
* @param records 当前记录映射
|
|
150
|
+
*/
|
|
151
|
+
async replayWal(records) {
|
|
152
|
+
const reader = new WALFile_1.WalReader(this.basePath, this.dbName);
|
|
153
|
+
await reader.open();
|
|
154
|
+
let replayCount = 0;
|
|
155
|
+
let lastLsn = 0n;
|
|
156
|
+
try {
|
|
157
|
+
while (true) {
|
|
158
|
+
const record = await reader.readNext();
|
|
159
|
+
if (!record) {
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
if (record.lsn <= this.context.lastCheckpointLsn) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
this.applyWalRecord(records, record);
|
|
166
|
+
replayCount++;
|
|
167
|
+
lastLsn = record.lsn;
|
|
168
|
+
}
|
|
169
|
+
this.walManager.setCurrentLsn(lastLsn);
|
|
170
|
+
} finally {
|
|
171
|
+
await reader.close();
|
|
172
|
+
}
|
|
173
|
+
this.context.recordsToReplay = replayCount;
|
|
174
|
+
return replayCount;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 应用单条 WAL 记录
|
|
178
|
+
* @param records 记录映射
|
|
179
|
+
* @param record WAL 记录
|
|
180
|
+
*/
|
|
181
|
+
applyWalRecord(records, record) {
|
|
182
|
+
switch (record.operationType) {
|
|
183
|
+
case constants_1.OperationType.Insert:
|
|
184
|
+
case constants_1.OperationType.Update:
|
|
185
|
+
if (record.value) {
|
|
186
|
+
records.set(record.key, record.value);
|
|
187
|
+
}
|
|
188
|
+
break;
|
|
189
|
+
case constants_1.OperationType.Delete:
|
|
190
|
+
records.delete(record.key);
|
|
191
|
+
break;
|
|
192
|
+
case constants_1.OperationType.Checkpoint:
|
|
193
|
+
// 检查点标记,不需要特殊处理
|
|
194
|
+
break;
|
|
195
|
+
default:
|
|
196
|
+
throw new errors_1.RecoveryError(`Unknown operation type: ${record.operationType}`, "replay_wal", { lsn: record.lsn });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* 重建索引
|
|
201
|
+
*/
|
|
202
|
+
async rebuildIndex() {
|
|
203
|
+
// 重建 SHM 索引
|
|
204
|
+
const shmManager = this.walIndexManager.getShmManager();
|
|
205
|
+
await shmManager.clear();
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* 获取恢复上下文
|
|
209
|
+
*/
|
|
210
|
+
getContext() {
|
|
211
|
+
return { ...this.context };
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* 获取恢复后的记录
|
|
215
|
+
*/
|
|
216
|
+
async getRecoveredRecords() {
|
|
217
|
+
const records = new Map();
|
|
218
|
+
// 从 Light 文件加载
|
|
219
|
+
if (this.context.lightExists) {
|
|
220
|
+
await this.lightFileManager.open();
|
|
221
|
+
const lightRecords = await this.lightFileManager.loadAllRecords();
|
|
222
|
+
for (const [key, value] of lightRecords) {
|
|
223
|
+
records.set(key, value);
|
|
224
|
+
}
|
|
225
|
+
await this.lightFileManager.close();
|
|
226
|
+
}
|
|
227
|
+
// 回放 WAL
|
|
228
|
+
const reader = new WALFile_1.WalReader(this.basePath, this.dbName);
|
|
229
|
+
await reader.open();
|
|
230
|
+
try {
|
|
231
|
+
while (true) {
|
|
232
|
+
const record = await reader.readNext();
|
|
233
|
+
if (!record) {
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
if (record.lsn > this.context.lastCheckpointLsn) {
|
|
237
|
+
this.applyWalRecord(records, record);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
} finally {
|
|
241
|
+
await reader.close();
|
|
242
|
+
}
|
|
243
|
+
return records;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
exports.RecoveryManager = RecoveryManager;
|
|
247
|
+
/**
|
|
248
|
+
* 快速恢复管理器
|
|
249
|
+
* 利用 SHM 索引加速恢复过程
|
|
250
|
+
*/
|
|
251
|
+
class FastRecoveryManager {
|
|
252
|
+
/**
|
|
253
|
+
* 创建快速恢复管理器
|
|
254
|
+
* @param basePath 数据库基础路径
|
|
255
|
+
* @param dbName 数据库名称
|
|
256
|
+
* @param lightFileManager Light 文件管理器
|
|
257
|
+
* @param walManager WAL 管理器
|
|
258
|
+
* @param walIndexManager WAL 索引管理器
|
|
259
|
+
*/
|
|
260
|
+
constructor(basePath, dbName, lightFileManager, walManager, walIndexManager) {
|
|
261
|
+
this.basePath = basePath;
|
|
262
|
+
this.dbName = dbName;
|
|
263
|
+
this.lightFileManager = lightFileManager;
|
|
264
|
+
this.walManager = walManager;
|
|
265
|
+
this.walIndexManager = walIndexManager;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* 快速恢复
|
|
269
|
+
* 只回放必要的 WAL 记录
|
|
270
|
+
*/
|
|
271
|
+
async fastRecover() {
|
|
272
|
+
const startTime = Date.now();
|
|
273
|
+
const records = new Map();
|
|
274
|
+
try {
|
|
275
|
+
// 1. 加载 Light 文件
|
|
276
|
+
const lightExists = await this.lightFileManager.exists();
|
|
277
|
+
if (lightExists) {
|
|
278
|
+
await this.lightFileManager.open();
|
|
279
|
+
const lightRecords = await this.lightFileManager.loadAllRecords();
|
|
280
|
+
for (const [key, value] of lightRecords) {
|
|
281
|
+
records.set(key, value);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// 2. 加载 SHM 索引
|
|
285
|
+
const shmManager = this.walIndexManager.getShmManager();
|
|
286
|
+
const shmValid = await shmManager.load();
|
|
287
|
+
// 3. 获取需要回放的 WAL 范围
|
|
288
|
+
let startLsn = 0n;
|
|
289
|
+
if (shmValid) {
|
|
290
|
+
startLsn = shmManager.getLastCompleteLsn();
|
|
291
|
+
}
|
|
292
|
+
// 4. 回放 WAL
|
|
293
|
+
const reader = new WALFile_1.WalReader(this.basePath, this.dbName);
|
|
294
|
+
await reader.open();
|
|
295
|
+
let replayCount = 0;
|
|
296
|
+
let lastLsn = 0n;
|
|
297
|
+
try {
|
|
298
|
+
while (true) {
|
|
299
|
+
const record = await reader.readNext();
|
|
300
|
+
if (!record) {
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
if (record.lsn > startLsn) {
|
|
304
|
+
this.applyRecord(records, record);
|
|
305
|
+
replayCount++;
|
|
306
|
+
}
|
|
307
|
+
lastLsn = record.lsn;
|
|
308
|
+
}
|
|
309
|
+
} finally {
|
|
310
|
+
await reader.close();
|
|
311
|
+
}
|
|
312
|
+
// 5. 更新 LSN
|
|
313
|
+
if (lastLsn > 0n) {
|
|
314
|
+
this.walManager.setCurrentLsn(lastLsn);
|
|
315
|
+
}
|
|
316
|
+
const endTime = Date.now();
|
|
317
|
+
return {
|
|
318
|
+
success: true,
|
|
319
|
+
recordsReplayed: replayCount,
|
|
320
|
+
pagesLoaded: lightExists ? 1 : 0,
|
|
321
|
+
durationMs: endTime - startTime,
|
|
322
|
+
};
|
|
323
|
+
} catch (error) {
|
|
324
|
+
const err = error;
|
|
325
|
+
return {
|
|
326
|
+
success: false,
|
|
327
|
+
recordsReplayed: 0,
|
|
328
|
+
pagesLoaded: 0,
|
|
329
|
+
durationMs: Date.now() - startTime,
|
|
330
|
+
error: err.message,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* 应用 WAL 记录
|
|
336
|
+
*/
|
|
337
|
+
applyRecord(records, record) {
|
|
338
|
+
switch (record.operationType) {
|
|
339
|
+
case constants_1.OperationType.Insert:
|
|
340
|
+
case constants_1.OperationType.Update:
|
|
341
|
+
if (record.value) {
|
|
342
|
+
records.set(record.key, record.value);
|
|
343
|
+
}
|
|
344
|
+
break;
|
|
345
|
+
case constants_1.OperationType.Delete:
|
|
346
|
+
records.delete(record.key);
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
exports.FastRecoveryManager = FastRecoveryManager;
|
|
352
|
+
/**
|
|
353
|
+
* 恢复验证器
|
|
354
|
+
* 验证恢复后的数据完整性
|
|
355
|
+
*/
|
|
356
|
+
class RecoveryValidator {
|
|
357
|
+
/**
|
|
358
|
+
* 验证记录完整性
|
|
359
|
+
* @param records 记录映射
|
|
360
|
+
*/
|
|
361
|
+
validateRecords(records) {
|
|
362
|
+
const errors = [];
|
|
363
|
+
for (const [key, value] of records) {
|
|
364
|
+
if (!key || key.length === 0) {
|
|
365
|
+
errors.push(`Invalid key: empty key found`);
|
|
366
|
+
}
|
|
367
|
+
if (!value || value.length === 0) {
|
|
368
|
+
errors.push(`Invalid value for key "${key}": empty value`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
valid: errors.length === 0,
|
|
373
|
+
errors,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* 验证 WAL 完整性
|
|
378
|
+
* @param walRecords WAL 记录数组
|
|
379
|
+
*/
|
|
380
|
+
validateWAL(walRecords) {
|
|
381
|
+
const errors = [];
|
|
382
|
+
let lastLsn = 0n;
|
|
383
|
+
for (const record of walRecords) {
|
|
384
|
+
if (record.lsn <= lastLsn) {
|
|
385
|
+
errors.push(`LSN not monotonic: ${lastLsn} -> ${record.lsn}`);
|
|
386
|
+
}
|
|
387
|
+
lastLsn = record.lsn;
|
|
388
|
+
if (!Object.values(constants_1.OperationType).includes(record.operationType)) {
|
|
389
|
+
errors.push(`Invalid operation type: ${record.operationType}`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
valid: errors.length === 0,
|
|
394
|
+
errors,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
exports.RecoveryValidator = RecoveryValidator;
|
|
399
|
+
//# sourceMappingURL=Recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Recovery.js","sourceRoot":"","sources":["../../src/storage/Recovery.ts"],"names":[],"mappings":"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"}
|