@yydb/light-db 0.0.0 → 0.0.11

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 (230) hide show
  1. package/dist/api/database.d.ts +48 -0
  2. package/dist/api/database.d.ts.map +1 -0
  3. package/dist/api/database.js +120 -0
  4. package/dist/api/database.js.map +1 -0
  5. package/dist/api/index.d.ts +7 -22
  6. package/dist/api/index.d.ts.map +1 -1
  7. package/dist/api/index.js +5 -52
  8. package/dist/api/index.js.map +1 -1
  9. package/dist/api/schema.d.ts +33 -0
  10. package/dist/api/schema.d.ts.map +1 -0
  11. package/dist/api/schema.js +80 -0
  12. package/dist/api/schema.js.map +1 -0
  13. package/dist/api/transaction.d.ts +26 -0
  14. package/dist/api/transaction.d.ts.map +1 -0
  15. package/dist/api/transaction.js +52 -0
  16. package/dist/api/transaction.js.map +1 -0
  17. package/dist/api/types.d.ts +55 -148
  18. package/dist/api/types.d.ts.map +1 -1
  19. package/dist/api/types.js +6 -5
  20. package/dist/api/types.js.map +1 -1
  21. package/dist/codec/binary.d.ts +196 -0
  22. package/dist/codec/binary.d.ts.map +1 -0
  23. package/dist/codec/binary.js +342 -0
  24. package/dist/codec/binary.js.map +1 -0
  25. package/dist/codec/checksum.d.ts +21 -0
  26. package/dist/codec/checksum.d.ts.map +1 -0
  27. package/dist/codec/checksum.js +46 -0
  28. package/dist/codec/checksum.js.map +1 -0
  29. package/dist/codec/index.d.ts +12 -0
  30. package/dist/codec/index.d.ts.map +1 -0
  31. package/dist/codec/index.js +10 -0
  32. package/dist/codec/index.js.map +1 -0
  33. package/dist/codec/page.d.ts +114 -0
  34. package/dist/codec/page.d.ts.map +1 -0
  35. package/dist/codec/page.js +225 -0
  36. package/dist/codec/page.js.map +1 -0
  37. package/dist/codec/record.d.ts +62 -0
  38. package/dist/codec/record.d.ts.map +1 -0
  39. package/dist/codec/record.js +82 -0
  40. package/dist/codec/record.js.map +1 -0
  41. package/dist/core/broadcast.d.ts +39 -0
  42. package/dist/core/broadcast.d.ts.map +1 -0
  43. package/dist/core/broadcast.js +54 -0
  44. package/dist/core/broadcast.js.map +1 -0
  45. package/dist/core/checkpoint.d.ts +23 -0
  46. package/dist/core/checkpoint.d.ts.map +1 -0
  47. package/dist/core/checkpoint.js +49 -0
  48. package/dist/core/checkpoint.js.map +1 -0
  49. package/dist/core/engine.d.ts +142 -0
  50. package/dist/core/engine.d.ts.map +1 -0
  51. package/dist/core/engine.js +304 -0
  52. package/dist/core/engine.js.map +1 -0
  53. package/dist/core/index.d.ts +17 -0
  54. package/dist/core/index.d.ts.map +1 -0
  55. package/dist/core/index.js +13 -0
  56. package/dist/core/index.js.map +1 -0
  57. package/dist/core/lease.d.ts +32 -0
  58. package/dist/core/lease.d.ts.map +1 -0
  59. package/dist/core/lease.js +81 -0
  60. package/dist/core/lease.js.map +1 -0
  61. package/dist/core/records.d.ts +49 -0
  62. package/dist/core/records.d.ts.map +1 -0
  63. package/dist/core/records.js +70 -0
  64. package/dist/core/records.js.map +1 -0
  65. package/dist/core/recovery.d.ts +43 -0
  66. package/dist/core/recovery.d.ts.map +1 -0
  67. package/dist/core/recovery.js +99 -0
  68. package/dist/core/recovery.js.map +1 -0
  69. package/dist/core/wal.d.ts +50 -0
  70. package/dist/core/wal.d.ts.map +1 -0
  71. package/dist/core/wal.js +114 -0
  72. package/dist/core/wal.js.map +1 -0
  73. package/dist/errors/index.d.ts +44 -66
  74. package/dist/errors/index.d.ts.map +1 -1
  75. package/dist/errors/index.js +43 -128
  76. package/dist/errors/index.js.map +1 -1
  77. package/dist/index.d.ts +14 -215
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +14 -724
  80. package/dist/index.js.map +1 -1
  81. package/dist/storage/StorageAdapter.d.ts +97 -0
  82. package/dist/storage/StorageAdapter.d.ts.map +1 -0
  83. package/dist/storage/StorageAdapter.js +9 -0
  84. package/dist/storage/StorageAdapter.js.map +1 -0
  85. package/dist/storage/index.d.ts +9 -8
  86. package/dist/storage/index.d.ts.map +1 -1
  87. package/dist/storage/index.js +8 -151
  88. package/dist/storage/index.js.map +1 -1
  89. package/dist/storage/indexeddb/IndexedDbStorageAdapter.d.ts +140 -0
  90. package/dist/storage/indexeddb/IndexedDbStorageAdapter.d.ts.map +1 -0
  91. package/dist/storage/indexeddb/IndexedDbStorageAdapter.js +403 -0
  92. package/dist/storage/indexeddb/IndexedDbStorageAdapter.js.map +1 -0
  93. package/dist/storage/memory/MemoryStorageAdapter.d.ts +76 -0
  94. package/dist/storage/memory/MemoryStorageAdapter.d.ts.map +1 -0
  95. package/dist/storage/memory/MemoryStorageAdapter.js +212 -0
  96. package/dist/storage/memory/MemoryStorageAdapter.js.map +1 -0
  97. package/dist/storage/opfs/OpfsStorageAdapter.d.ts +141 -0
  98. package/dist/storage/opfs/OpfsStorageAdapter.d.ts.map +1 -0
  99. package/dist/storage/opfs/OpfsStorageAdapter.js +400 -0
  100. package/dist/storage/opfs/OpfsStorageAdapter.js.map +1 -0
  101. package/package.json +48 -36
  102. package/readme.md +80 -94
  103. package/dist/api/LightDB.d.ts +0 -194
  104. package/dist/api/LightDB.d.ts.map +0 -1
  105. package/dist/api/LightDB.js +0 -299
  106. package/dist/api/LightDB.js.map +0 -1
  107. package/dist/api/Transaction.d.ts +0 -100
  108. package/dist/api/Transaction.d.ts.map +0 -1
  109. package/dist/api/Transaction.js +0 -263
  110. package/dist/api/Transaction.js.map +0 -1
  111. package/dist/collection/Collection.d.ts +0 -235
  112. package/dist/collection/Collection.d.ts.map +0 -1
  113. package/dist/collection/Collection.js +0 -671
  114. package/dist/collection/Collection.js.map +0 -1
  115. package/dist/collection/QueryBuilder.d.ts +0 -225
  116. package/dist/collection/QueryBuilder.d.ts.map +0 -1
  117. package/dist/collection/QueryBuilder.js +0 -475
  118. package/dist/collection/QueryBuilder.js.map +0 -1
  119. package/dist/collection/QueryParser.d.ts +0 -117
  120. package/dist/collection/QueryParser.d.ts.map +0 -1
  121. package/dist/collection/QueryParser.js +0 -438
  122. package/dist/collection/QueryParser.js.map +0 -1
  123. package/dist/collection/index.d.ts +0 -42
  124. package/dist/collection/index.d.ts.map +0 -1
  125. package/dist/collection/index.js +0 -41
  126. package/dist/collection/index.js.map +0 -1
  127. package/dist/collection/types.d.ts +0 -365
  128. package/dist/collection/types.d.ts.map +0 -1
  129. package/dist/collection/types.js +0 -7
  130. package/dist/collection/types.js.map +0 -1
  131. package/dist/constants/index.d.ts +0 -51
  132. package/dist/constants/index.d.ts.map +0 -1
  133. package/dist/constants/index.js +0 -68
  134. package/dist/constants/index.js.map +0 -1
  135. package/dist/indexes/BPlusTree.d.ts +0 -181
  136. package/dist/indexes/BPlusTree.d.ts.map +0 -1
  137. package/dist/indexes/BPlusTree.js +0 -528
  138. package/dist/indexes/BPlusTree.js.map +0 -1
  139. package/dist/indexes/IndexManager.d.ts +0 -236
  140. package/dist/indexes/IndexManager.d.ts.map +0 -1
  141. package/dist/indexes/IndexManager.js +0 -502
  142. package/dist/indexes/IndexManager.js.map +0 -1
  143. package/dist/indexes/PrimaryIndex.d.ts +0 -240
  144. package/dist/indexes/PrimaryIndex.d.ts.map +0 -1
  145. package/dist/indexes/PrimaryIndex.js +0 -354
  146. package/dist/indexes/PrimaryIndex.js.map +0 -1
  147. package/dist/indexes/SecondaryIndex.d.ts +0 -204
  148. package/dist/indexes/SecondaryIndex.d.ts.map +0 -1
  149. package/dist/indexes/SecondaryIndex.js +0 -480
  150. package/dist/indexes/SecondaryIndex.js.map +0 -1
  151. package/dist/indexes/errors.d.ts +0 -66
  152. package/dist/indexes/errors.d.ts.map +0 -1
  153. package/dist/indexes/errors.js +0 -117
  154. package/dist/indexes/errors.js.map +0 -1
  155. package/dist/indexes/index.d.ts +0 -52
  156. package/dist/indexes/index.d.ts.map +0 -1
  157. package/dist/indexes/index.js +0 -131
  158. package/dist/indexes/index.js.map +0 -1
  159. package/dist/indexes/types.d.ts +0 -246
  160. package/dist/indexes/types.d.ts.map +0 -1
  161. package/dist/indexes/types.js +0 -30
  162. package/dist/indexes/types.js.map +0 -1
  163. package/dist/performance/BatchWALWriter.d.ts +0 -185
  164. package/dist/performance/BatchWALWriter.d.ts.map +0 -1
  165. package/dist/performance/BatchWALWriter.js +0 -490
  166. package/dist/performance/BatchWALWriter.js.map +0 -1
  167. package/dist/performance/ColumnarStorage.d.ts +0 -138
  168. package/dist/performance/ColumnarStorage.d.ts.map +0 -1
  169. package/dist/performance/ColumnarStorage.js +0 -875
  170. package/dist/performance/ColumnarStorage.js.map +0 -1
  171. package/dist/performance/LazyQuery.d.ts +0 -307
  172. package/dist/performance/LazyQuery.d.ts.map +0 -1
  173. package/dist/performance/LazyQuery.js +0 -588
  174. package/dist/performance/LazyQuery.js.map +0 -1
  175. package/dist/performance/OptimizedBuffer.d.ts +0 -375
  176. package/dist/performance/OptimizedBuffer.d.ts.map +0 -1
  177. package/dist/performance/OptimizedBuffer.js +0 -730
  178. package/dist/performance/OptimizedBuffer.js.map +0 -1
  179. package/dist/performance/RWLock.d.ts +0 -260
  180. package/dist/performance/RWLock.d.ts.map +0 -1
  181. package/dist/performance/RWLock.js +0 -570
  182. package/dist/performance/RWLock.js.map +0 -1
  183. package/dist/performance/index.d.ts +0 -41
  184. package/dist/performance/index.d.ts.map +0 -1
  185. package/dist/performance/index.js +0 -162
  186. package/dist/performance/index.js.map +0 -1
  187. package/dist/performance/types.d.ts +0 -247
  188. package/dist/performance/types.d.ts.map +0 -1
  189. package/dist/performance/types.js +0 -26
  190. package/dist/performance/types.js.map +0 -1
  191. package/dist/storage/Checkpoint.d.ts +0 -128
  192. package/dist/storage/Checkpoint.d.ts.map +0 -1
  193. package/dist/storage/Checkpoint.js +0 -251
  194. package/dist/storage/Checkpoint.js.map +0 -1
  195. package/dist/storage/LightFile.d.ts +0 -227
  196. package/dist/storage/LightFile.d.ts.map +0 -1
  197. package/dist/storage/LightFile.js +0 -526
  198. package/dist/storage/LightFile.js.map +0 -1
  199. package/dist/storage/Recovery.d.ts +0 -172
  200. package/dist/storage/Recovery.d.ts.map +0 -1
  201. package/dist/storage/Recovery.js +0 -399
  202. package/dist/storage/Recovery.js.map +0 -1
  203. package/dist/storage/SHMFile.d.ts +0 -243
  204. package/dist/storage/SHMFile.d.ts.map +0 -1
  205. package/dist/storage/SHMFile.js +0 -436
  206. package/dist/storage/SHMFile.js.map +0 -1
  207. package/dist/storage/StorageEngine.d.ts +0 -146
  208. package/dist/storage/StorageEngine.d.ts.map +0 -1
  209. package/dist/storage/StorageEngine.js +0 -353
  210. package/dist/storage/StorageEngine.js.map +0 -1
  211. package/dist/storage/WALFile.d.ts +0 -248
  212. package/dist/storage/WALFile.d.ts.map +0 -1
  213. package/dist/storage/WALFile.js +0 -597
  214. package/dist/storage/WALFile.js.map +0 -1
  215. package/dist/types/index.d.ts +0 -220
  216. package/dist/types/index.d.ts.map +0 -1
  217. package/dist/types/index.js +0 -7
  218. package/dist/types/index.js.map +0 -1
  219. package/dist/utils/binary.d.ts +0 -271
  220. package/dist/utils/binary.d.ts.map +0 -1
  221. package/dist/utils/binary.js +0 -454
  222. package/dist/utils/binary.js.map +0 -1
  223. package/dist/utils/file.d.ts +0 -166
  224. package/dist/utils/file.d.ts.map +0 -1
  225. package/dist/utils/file.js +0 -346
  226. package/dist/utils/file.js.map +0 -1
  227. package/dist/utils/index.d.ts +0 -6
  228. package/dist/utils/index.d.ts.map +0 -1
  229. package/dist/utils/index.js +0 -39
  230. package/dist/utils/index.js.map +0 -1
@@ -1,172 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"Recovery.d.ts","sourceRoot":"","sources":["../../src/storage/Recovery.ts"],"names":[],"mappings":"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"}
@@ -1,399 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"Recovery.js","sourceRoot":"","sources":["../../src/storage/Recovery.ts"],"names":[],"mappings":"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"}