@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.
Files changed (150) hide show
  1. package/dist/api/LightDB.d.ts +194 -0
  2. package/dist/api/LightDB.d.ts.map +1 -0
  3. package/dist/api/LightDB.js +299 -0
  4. package/dist/api/LightDB.js.map +1 -0
  5. package/dist/api/Transaction.d.ts +100 -0
  6. package/dist/api/Transaction.d.ts.map +1 -0
  7. package/dist/api/Transaction.js +263 -0
  8. package/dist/api/Transaction.js.map +1 -0
  9. package/dist/api/index.d.ts +24 -0
  10. package/dist/api/index.d.ts.map +1 -0
  11. package/dist/api/index.js +54 -0
  12. package/dist/api/index.js.map +1 -0
  13. package/dist/api/types.d.ts +154 -0
  14. package/dist/api/types.d.ts.map +1 -0
  15. package/dist/api/types.js +7 -0
  16. package/dist/api/types.js.map +1 -0
  17. package/dist/collection/Collection.d.ts +235 -0
  18. package/dist/collection/Collection.d.ts.map +1 -0
  19. package/dist/collection/Collection.js +671 -0
  20. package/dist/collection/Collection.js.map +1 -0
  21. package/dist/collection/QueryBuilder.d.ts +225 -0
  22. package/dist/collection/QueryBuilder.d.ts.map +1 -0
  23. package/dist/collection/QueryBuilder.js +475 -0
  24. package/dist/collection/QueryBuilder.js.map +1 -0
  25. package/dist/collection/QueryParser.d.ts +117 -0
  26. package/dist/collection/QueryParser.d.ts.map +1 -0
  27. package/dist/collection/QueryParser.js +438 -0
  28. package/dist/collection/QueryParser.js.map +1 -0
  29. package/dist/collection/index.d.ts +42 -0
  30. package/dist/collection/index.d.ts.map +1 -0
  31. package/dist/collection/index.js +41 -0
  32. package/dist/collection/index.js.map +1 -0
  33. package/dist/collection/types.d.ts +365 -0
  34. package/dist/collection/types.d.ts.map +1 -0
  35. package/dist/collection/types.js +7 -0
  36. package/dist/collection/types.js.map +1 -0
  37. package/dist/constants/index.d.ts +51 -0
  38. package/dist/constants/index.d.ts.map +1 -0
  39. package/dist/constants/index.js +68 -0
  40. package/dist/constants/index.js.map +1 -0
  41. package/dist/errors/index.d.ts +69 -0
  42. package/dist/errors/index.d.ts.map +1 -0
  43. package/dist/errors/index.js +132 -0
  44. package/dist/errors/index.js.map +1 -0
  45. package/dist/index.d.ts +220 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +729 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/indexes/BPlusTree.d.ts +181 -0
  50. package/dist/indexes/BPlusTree.d.ts.map +1 -0
  51. package/dist/indexes/BPlusTree.js +528 -0
  52. package/dist/indexes/BPlusTree.js.map +1 -0
  53. package/dist/indexes/IndexManager.d.ts +236 -0
  54. package/dist/indexes/IndexManager.d.ts.map +1 -0
  55. package/dist/indexes/IndexManager.js +502 -0
  56. package/dist/indexes/IndexManager.js.map +1 -0
  57. package/dist/indexes/PrimaryIndex.d.ts +240 -0
  58. package/dist/indexes/PrimaryIndex.d.ts.map +1 -0
  59. package/dist/indexes/PrimaryIndex.js +354 -0
  60. package/dist/indexes/PrimaryIndex.js.map +1 -0
  61. package/dist/indexes/SecondaryIndex.d.ts +204 -0
  62. package/dist/indexes/SecondaryIndex.d.ts.map +1 -0
  63. package/dist/indexes/SecondaryIndex.js +480 -0
  64. package/dist/indexes/SecondaryIndex.js.map +1 -0
  65. package/dist/indexes/errors.d.ts +66 -0
  66. package/dist/indexes/errors.d.ts.map +1 -0
  67. package/dist/indexes/errors.js +117 -0
  68. package/dist/indexes/errors.js.map +1 -0
  69. package/dist/indexes/index.d.ts +52 -0
  70. package/dist/indexes/index.d.ts.map +1 -0
  71. package/dist/indexes/index.js +131 -0
  72. package/dist/indexes/index.js.map +1 -0
  73. package/dist/indexes/types.d.ts +246 -0
  74. package/dist/indexes/types.d.ts.map +1 -0
  75. package/dist/indexes/types.js +30 -0
  76. package/dist/indexes/types.js.map +1 -0
  77. package/dist/performance/BatchWALWriter.d.ts +185 -0
  78. package/dist/performance/BatchWALWriter.d.ts.map +1 -0
  79. package/dist/performance/BatchWALWriter.js +490 -0
  80. package/dist/performance/BatchWALWriter.js.map +1 -0
  81. package/dist/performance/ColumnarStorage.d.ts +138 -0
  82. package/dist/performance/ColumnarStorage.d.ts.map +1 -0
  83. package/dist/performance/ColumnarStorage.js +875 -0
  84. package/dist/performance/ColumnarStorage.js.map +1 -0
  85. package/dist/performance/LazyQuery.d.ts +307 -0
  86. package/dist/performance/LazyQuery.d.ts.map +1 -0
  87. package/dist/performance/LazyQuery.js +588 -0
  88. package/dist/performance/LazyQuery.js.map +1 -0
  89. package/dist/performance/OptimizedBuffer.d.ts +375 -0
  90. package/dist/performance/OptimizedBuffer.d.ts.map +1 -0
  91. package/dist/performance/OptimizedBuffer.js +730 -0
  92. package/dist/performance/OptimizedBuffer.js.map +1 -0
  93. package/dist/performance/RWLock.d.ts +260 -0
  94. package/dist/performance/RWLock.d.ts.map +1 -0
  95. package/dist/performance/RWLock.js +570 -0
  96. package/dist/performance/RWLock.js.map +1 -0
  97. package/dist/performance/index.d.ts +41 -0
  98. package/dist/performance/index.d.ts.map +1 -0
  99. package/dist/performance/index.js +162 -0
  100. package/dist/performance/index.js.map +1 -0
  101. package/dist/performance/types.d.ts +247 -0
  102. package/dist/performance/types.d.ts.map +1 -0
  103. package/dist/performance/types.js +26 -0
  104. package/dist/performance/types.js.map +1 -0
  105. package/dist/storage/Checkpoint.d.ts +128 -0
  106. package/dist/storage/Checkpoint.d.ts.map +1 -0
  107. package/dist/storage/Checkpoint.js +251 -0
  108. package/dist/storage/Checkpoint.js.map +1 -0
  109. package/dist/storage/LightFile.d.ts +227 -0
  110. package/dist/storage/LightFile.d.ts.map +1 -0
  111. package/dist/storage/LightFile.js +526 -0
  112. package/dist/storage/LightFile.js.map +1 -0
  113. package/dist/storage/Recovery.d.ts +172 -0
  114. package/dist/storage/Recovery.d.ts.map +1 -0
  115. package/dist/storage/Recovery.js +399 -0
  116. package/dist/storage/Recovery.js.map +1 -0
  117. package/dist/storage/SHMFile.d.ts +243 -0
  118. package/dist/storage/SHMFile.d.ts.map +1 -0
  119. package/dist/storage/SHMFile.js +436 -0
  120. package/dist/storage/SHMFile.js.map +1 -0
  121. package/dist/storage/StorageEngine.d.ts +146 -0
  122. package/dist/storage/StorageEngine.d.ts.map +1 -0
  123. package/dist/storage/StorageEngine.js +353 -0
  124. package/dist/storage/StorageEngine.js.map +1 -0
  125. package/dist/storage/WALFile.d.ts +248 -0
  126. package/dist/storage/WALFile.d.ts.map +1 -0
  127. package/dist/storage/WALFile.js +597 -0
  128. package/dist/storage/WALFile.js.map +1 -0
  129. package/dist/storage/index.d.ts +10 -0
  130. package/dist/storage/index.d.ts.map +1 -0
  131. package/dist/storage/index.js +153 -0
  132. package/dist/storage/index.js.map +1 -0
  133. package/dist/types/index.d.ts +220 -0
  134. package/dist/types/index.d.ts.map +1 -0
  135. package/dist/types/index.js +7 -0
  136. package/dist/types/index.js.map +1 -0
  137. package/dist/utils/binary.d.ts +271 -0
  138. package/dist/utils/binary.d.ts.map +1 -0
  139. package/dist/utils/binary.js +454 -0
  140. package/dist/utils/binary.js.map +1 -0
  141. package/dist/utils/file.d.ts +166 -0
  142. package/dist/utils/file.d.ts.map +1 -0
  143. package/dist/utils/file.js +346 -0
  144. package/dist/utils/file.js.map +1 -0
  145. package/dist/utils/index.d.ts +6 -0
  146. package/dist/utils/index.d.ts.map +1 -0
  147. package/dist/utils/index.js +39 -0
  148. package/dist/utils/index.js.map +1 -0
  149. package/package.json +37 -0
  150. 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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"}