datafolder 1.0.9 → 1.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.
- package/{internal.md → Internal.md} +8 -1
- package/README.md +6 -2
- package/SKILL.md +191 -0
- package/SSD.md +60 -0
- package/index.js +1 -0
- package/package.json +2 -2
- package/sample.js +4 -4
- package/scripts/airbnb.js +1 -0
- package/scripts/airbnb2.js +1 -0
- package/scripts/convertBinFiles.js +1 -0
- package/scripts/express.js +2 -1
- package/scripts/fastify.js +1 -0
- package/scripts/flights.js +1 -0
- package/scripts/flights2.js +1 -0
- package/scripts/flights_queries.js +1 -0
- package/src/QyAcl.d.ts +3 -3
- package/src/QyAcl.js +7 -7
- package/src/QyAclSaver_Worker.d.ts +1 -0
- package/src/QyAclSaver_Worker.js +1 -0
- package/src/QyAclWriter.d.ts +2 -1
- package/src/QyAclWriter.js +7 -6
- package/src/QyBatch.d.ts +29 -22
- package/src/QyBatch.js +85 -72
- package/src/QyBinWriter.d.ts +9 -4
- package/src/QyBinWriter.js +83 -70
- package/src/QyCD.d.ts +19 -19
- package/src/QyCD.js +2 -2
- package/src/QyCache.d.ts +22 -23
- package/src/QyCache.js +47 -36
- package/src/QyCompressor_Worker.js +2 -2
- package/src/QyDB.d.ts +6 -9
- package/src/QyDB.js +1 -1
- package/src/QyFile.d.ts +2 -0
- package/src/QyFile.js +42 -40
- package/src/QyFileContentUtils.d.ts +1 -4
- package/src/QyFileLogger.d.ts +4 -0
- package/src/QyFileLogger.js +30 -26
- package/src/QyIndex.d.ts +2 -2
- package/src/QyIndex.js +84 -80
- package/src/QyIndexPropTree.d.ts +4 -0
- package/src/QyIndexPropTree.js +19 -10
- package/src/QyIntersectNode.d.ts +1 -0
- package/src/QyIntersectNode.js +1 -0
- package/src/QyJsonSaver.d.ts +2 -2
- package/src/QyJsonSaver.js +4 -4
- package/src/QyKVData.d.ts +18 -1
- package/src/QyKVData.js +73 -53
- package/src/QyKVDataCleaner_Worker.d.ts +7 -1
- package/src/QyKVDataCleaner_Worker.js +54 -40
- package/src/QyKVDataLoader.d.ts +10 -2
- package/src/QyKVDataLoader.js +27 -21
- package/src/QyKVDataSaver_Worker.d.ts +10 -0
- package/src/QyKVDataSaver_Worker.js +23 -9
- package/src/QyLogFileSaver_Worker.d.ts +1 -0
- package/src/QyLogFileSaver_Worker.js +7 -6
- package/src/QyLogger.d.ts +21 -10
- package/src/QyLogger.js +111 -67
- package/src/QyMessageWorker.d.ts +1 -1
- package/src/QyMessageWorker.js +5 -5
- package/src/QyMessager.d.ts +5 -1
- package/src/QyMessager.js +6 -1
- package/src/QyMessager_Run.js +4 -3
- package/src/QyMod.js +9 -8
- package/src/QyOpRunner.d.ts +5 -1
- package/src/QyOpRunner.js +7 -7
- package/src/QyQueue.d.ts +5 -1
- package/src/QyQueue.js +6 -7
- package/src/QySaver.d.ts +3 -0
- package/src/QySaver.js +26 -15
- package/src/QySnapshotCompactor_Worker.d.ts +7 -0
- package/src/QySnapshotCompactor_Worker.js +37 -26
- package/src/QySnapshotSaver_Worker.d.ts +8 -1
- package/src/QySnapshotSaver_Worker.js +21 -14
- package/src/QySnapshots.d.ts +19 -7
- package/src/QySnapshots.js +204 -181
- package/src/QyTrigger.d.ts +5 -1
- package/src/QyTrigger.js +44 -34
- package/src/QyUnionNode.d.ts +10 -1
- package/src/QyUnionNode.js +34 -36
- package/src/QyUtils.d.ts +2 -2
- package/src/QyUtils.js +116 -111
- package/src/simulate.js +34 -31
- package/src/simulate2.js +49 -46
- package/src/soc_pokec.js +17 -11
- package/static/codemirror.bundle/editor.bundle.js +2 -0
package/src/QyKVData.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "node:path";
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
open as
|
|
6
|
+
open as f
|
|
7
7
|
} from "node:fs/promises";
|
|
8
8
|
|
|
9
9
|
import {
|
|
@@ -24,11 +24,32 @@ import {
|
|
|
24
24
|
|
|
25
25
|
import {
|
|
26
26
|
arrayLast as y,
|
|
27
|
-
readBufferAsync as
|
|
27
|
+
readBufferAsync as C,
|
|
28
28
|
sleep as c
|
|
29
29
|
} from "./QyUtils.js";
|
|
30
30
|
|
|
31
|
+
import {
|
|
32
|
+
logger as g
|
|
33
|
+
} from "./QyLogger.js";
|
|
34
|
+
|
|
31
35
|
class a {
|
|
36
|
+
kvFolder;
|
|
37
|
+
snapshotFolder;
|
|
38
|
+
qyCache;
|
|
39
|
+
options;
|
|
40
|
+
qyKVDataSaver;
|
|
41
|
+
qySnapshotCompactor;
|
|
42
|
+
qyKVDataCleaner;
|
|
43
|
+
compactState = 1;
|
|
44
|
+
compactMaxChangeId = 0;
|
|
45
|
+
snapshotSavedChangeId = 0;
|
|
46
|
+
maxChangeId = 0;
|
|
47
|
+
emptySnapshotNumVerList = [];
|
|
48
|
+
isStopping = !1;
|
|
49
|
+
qySnapshots;
|
|
50
|
+
aclKeyValueMap;
|
|
51
|
+
compactInterval;
|
|
52
|
+
unloadInterval;
|
|
32
53
|
constructor(a, t, o) {
|
|
33
54
|
t = {
|
|
34
55
|
...s("QyKVData"),
|
|
@@ -42,11 +63,7 @@ class a {
|
|
|
42
63
|
snapshotFolder: e,
|
|
43
64
|
qyKVDataSaver: new p(this, a, t),
|
|
44
65
|
qySnapshotCompactor: new i(this, a, t),
|
|
45
|
-
qyKVDataCleaner: new r(this, a, t)
|
|
46
|
-
compactState: 1,
|
|
47
|
-
compactMaxChangeId: 0,
|
|
48
|
-
snapshotSavedChangeId: 0,
|
|
49
|
-
emptySnapshotNumList: []
|
|
66
|
+
qyKVDataCleaner: new r(this, a, t)
|
|
50
67
|
});
|
|
51
68
|
}
|
|
52
69
|
start(a, t, o, e) {
|
|
@@ -89,32 +106,32 @@ class a {
|
|
|
89
106
|
} = a;
|
|
90
107
|
console.time("bgLoadPosMaps");
|
|
91
108
|
for (t of Object.keys(o.numToSnapshotMap).sort((a, t) => t - a)) {
|
|
92
|
-
if (await async function s(p, i, r, h, c, l) {
|
|
109
|
+
if (await async function s(p, i, r = void 0, h = void 0, c = void 0, l = void 0) {
|
|
93
110
|
if (p.isStopping) return void (l && l.close());
|
|
94
111
|
let d = p.qySnapshots;
|
|
95
112
|
let m = d.numToSnapshotMap;
|
|
96
|
-
let
|
|
97
|
-
if (!
|
|
113
|
+
let S = m[i];
|
|
114
|
+
if (!S) return void (l && l.close());
|
|
98
115
|
let {
|
|
99
|
-
info:
|
|
100
|
-
prefixPM:
|
|
101
|
-
} =
|
|
102
|
-
r = r || Object.keys(
|
|
116
|
+
info: u,
|
|
117
|
+
prefixPM: v
|
|
118
|
+
} = S;
|
|
119
|
+
r = r || Object.keys(v).sort().reverse();
|
|
103
120
|
if (0 == r.length) return void (l && l.close());
|
|
104
|
-
if (null == h || h !=
|
|
105
|
-
s(p, i, r,
|
|
121
|
+
if (null == h || h != u.pMVersion) return l && l.close(), c = d.getPMFilePath(S),
|
|
122
|
+
s(p, i, r, u.pMVersion, c, await f(c));
|
|
106
123
|
for (;0 < r.length; ) {
|
|
107
|
-
let e = y(r), n =
|
|
124
|
+
let e = y(r), n = v[e];
|
|
108
125
|
if (n) {
|
|
109
|
-
let [ a, t ] = n, o = await
|
|
126
|
+
let [ a, t ] = n, o = await C(c, l, a, t);
|
|
110
127
|
if (p.isStopping || !m[i]) return void l.close();
|
|
111
|
-
if (h !=
|
|
112
|
-
e in
|
|
128
|
+
if (h != u.pMVersion) return l.close(), s(p, i, r);
|
|
129
|
+
e in v && d.loadPartialPosMapBuffer(S, e, o);
|
|
113
130
|
}
|
|
114
131
|
r.pop();
|
|
115
132
|
}
|
|
116
133
|
l.close();
|
|
117
|
-
|
|
134
|
+
g.info("bgLoadPosMap:" + i);
|
|
118
135
|
}(a, t), a.isStopping) break;
|
|
119
136
|
if (await c(0), a.isStopping) break;
|
|
120
137
|
}
|
|
@@ -160,20 +177,20 @@ class a {
|
|
|
160
177
|
if (!(a in o)) return t.removeKey(a);
|
|
161
178
|
o[a] = void 0;
|
|
162
179
|
}
|
|
163
|
-
onSnapshotSavedChangeId(a, t) {
|
|
180
|
+
onSnapshotSavedChangeId(a, t = void 0) {
|
|
164
181
|
this.snapshotSavedChangeId = a;
|
|
165
182
|
var {
|
|
166
183
|
compactState: o,
|
|
167
184
|
compactMaxChangeId: e,
|
|
168
185
|
qyKVDataSaver: n
|
|
169
186
|
} = this;
|
|
170
|
-
if (3 == o && e <= a && (
|
|
187
|
+
if (3 == o && e <= a && (L(this), this.compactState = 1), t) {
|
|
171
188
|
var s, o = t, p = this.qySnapshots, i = p.keyToSnapshotMap;
|
|
172
189
|
for (s in o.posMap) {
|
|
173
190
|
var r = i[s];
|
|
174
191
|
r && p.removeKeyFromSnapshot(r, s);
|
|
175
192
|
}
|
|
176
|
-
p.addMaxSnapshot(o),
|
|
193
|
+
p.addMaxSnapshot(o), g.info("addPMOnlySnapshot: " + p.snapshotMaxChangeId),
|
|
177
194
|
n.releaseSnapshot(t.snapshotNum);
|
|
178
195
|
}
|
|
179
196
|
}
|
|
@@ -182,7 +199,7 @@ class a {
|
|
|
182
199
|
var l = this, {
|
|
183
200
|
pMUpdates: a,
|
|
184
201
|
vLUpdates: d,
|
|
185
|
-
|
|
202
|
+
combinationUpdate: m
|
|
186
203
|
} = a = a;
|
|
187
204
|
if (a) {
|
|
188
205
|
var t = a, o = l.qySnapshots.numToSnapshotMap;
|
|
@@ -191,8 +208,9 @@ class a {
|
|
|
191
208
|
prefixPM: p,
|
|
192
209
|
info: i
|
|
193
210
|
} = s;
|
|
194
|
-
for (e in
|
|
195
|
-
|
|
211
|
+
for (e in ++i.pMVersion, i.verList[0] = i.pMVersion + i.vLVersion,
|
|
212
|
+
p) p[e] = n[e];
|
|
213
|
+
(a => {
|
|
196
214
|
var {
|
|
197
215
|
info: t,
|
|
198
216
|
compactOutedCount: o
|
|
@@ -203,18 +221,19 @@ class a {
|
|
|
203
221
|
}
|
|
204
222
|
if (d) {
|
|
205
223
|
var r = d, h = (a = l).qySnapshots.numToSnapshotMap;
|
|
206
|
-
for (
|
|
207
|
-
var c,
|
|
208
|
-
posMap:
|
|
209
|
-
prefixPM:
|
|
210
|
-
} = r[
|
|
224
|
+
for (f in r) {
|
|
225
|
+
var c, S, {
|
|
226
|
+
posMap: u,
|
|
227
|
+
prefixPM: v
|
|
228
|
+
} = r[f], f = h[f], {
|
|
211
229
|
posMap: y,
|
|
212
|
-
prefixPM:
|
|
213
|
-
info:
|
|
214
|
-
} =
|
|
215
|
-
for (c in
|
|
216
|
-
|
|
217
|
-
|
|
230
|
+
prefixPM: C,
|
|
231
|
+
info: g
|
|
232
|
+
} = f;
|
|
233
|
+
for (c in ++g.pMVersion, ++g.vLVersion, g.verList[0] = g.pMVersion + g.vLVersion,
|
|
234
|
+
y) y[c] = u[c];
|
|
235
|
+
for (S in C) C[S] = v[S];
|
|
236
|
+
q(f);
|
|
218
237
|
}
|
|
219
238
|
}
|
|
220
239
|
if (m) {
|
|
@@ -224,32 +243,33 @@ class a {
|
|
|
224
243
|
keyToSnapshotMap: s
|
|
225
244
|
} = e, {
|
|
226
245
|
snapshotNum: a,
|
|
227
|
-
|
|
246
|
+
combinedSnapshotNumVerList: t,
|
|
228
247
|
posMap: p
|
|
229
248
|
} = d, i = n[a], {
|
|
230
249
|
posMap: r,
|
|
231
250
|
info: o
|
|
232
251
|
} = i;
|
|
233
|
-
for (M in
|
|
234
|
-
|
|
252
|
+
for (M in ++o.pMVersion, ++o.vLVersion, o.verList[0] = o.pMVersion + o.vLVersion,
|
|
253
|
+
r) r[M] = p[M];
|
|
254
|
+
q(i);
|
|
235
255
|
let h = o.totalCount, c = i.outdatedCount;
|
|
236
|
-
for (let o of t) {
|
|
237
|
-
var
|
|
256
|
+
for (let [ o ] of t) {
|
|
257
|
+
var V, I = n[o];
|
|
238
258
|
let {
|
|
239
259
|
posMap: a,
|
|
240
260
|
info: t
|
|
241
|
-
} =
|
|
242
|
-
for (
|
|
243
|
-
|
|
261
|
+
} = I;
|
|
262
|
+
for (V in a) r[V] = p[V], s[V] = i;
|
|
263
|
+
q(I), h += t.totalCount, c += I.outdatedCount, e.delSnapshot(I);
|
|
244
264
|
}
|
|
245
|
-
|
|
265
|
+
o.totalCount = h, i.outdatedCount = c;
|
|
246
266
|
}
|
|
247
|
-
this.snapshotSavedChangeId >= this.compactMaxChangeId ? (
|
|
267
|
+
this.snapshotSavedChangeId >= this.compactMaxChangeId ? (L(this), this.compactState = 1) : this.compactState = 3;
|
|
248
268
|
}
|
|
249
269
|
}
|
|
250
270
|
}
|
|
251
271
|
|
|
252
|
-
function
|
|
272
|
+
function q(a) {
|
|
253
273
|
var {
|
|
254
274
|
info: t,
|
|
255
275
|
compactOutedCount: o
|
|
@@ -265,7 +285,7 @@ function l(a) {
|
|
|
265
285
|
qySnapshots: o,
|
|
266
286
|
qySnapshotCompactor: e
|
|
267
287
|
} = a, {
|
|
268
|
-
|
|
288
|
+
emptySnapshotNumVerList: o,
|
|
269
289
|
pMCompactSnapshotList: n,
|
|
270
290
|
vLCompactSnapshotList: s,
|
|
271
291
|
combiningSnapshotList: p
|
|
@@ -278,7 +298,7 @@ function l(a) {
|
|
|
278
298
|
for (var i of [ n, s, p ]) for (var r of i) r.compactOutedCount = r.outdatedCount;
|
|
279
299
|
e.compactSnapshots(n, s, p);
|
|
280
300
|
}
|
|
281
|
-
0 < o.length && (a.
|
|
301
|
+
0 < o.length && (a.emptySnapshotNumVerList.push(...o), a.snapshotSavedChangeId >= t ? h(a) : 1 == a.compactState && Object.assign(a, {
|
|
282
302
|
compactState: 3,
|
|
283
303
|
compactMaxChangeId: t
|
|
284
304
|
}));
|
|
@@ -295,12 +315,12 @@ function d(a, t) {
|
|
|
295
315
|
function h(a) {
|
|
296
316
|
var {
|
|
297
317
|
qyKVDataCleaner: a,
|
|
298
|
-
|
|
318
|
+
emptySnapshotNumVerList: t
|
|
299
319
|
} = a;
|
|
300
320
|
0 < t.length && (a.removeSnapshotsFiles(t), t.length = 0);
|
|
301
321
|
}
|
|
302
322
|
|
|
303
|
-
function
|
|
323
|
+
function L(a) {
|
|
304
324
|
a.qySnapshotCompactor.saveSnapshotInfos(), h(a);
|
|
305
325
|
}
|
|
306
326
|
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { QyMessageWorker } from "./QyMessageWorker.ts";
|
|
2
2
|
export default class QyKVDataCleaner_Worker extends QyMessageWorker {
|
|
3
|
+
kvFolder: any;
|
|
4
|
+
snapshotFolder: any;
|
|
5
|
+
snapshotInfoFolder: any;
|
|
6
|
+
aclFolder: any;
|
|
7
|
+
historyAclFolder: any;
|
|
8
|
+
historySnapshotFolder: any;
|
|
3
9
|
constructor({ kvFolder, options }: {
|
|
4
10
|
kvFolder: any;
|
|
5
11
|
options: any;
|
|
@@ -9,5 +15,5 @@ export default class QyKVDataCleaner_Worker extends QyMessageWorker {
|
|
|
9
15
|
_op_cleanAclFiles(maxSnapshotNum: any): Promise<void>;
|
|
10
16
|
_op_cleanPMFiles(pMChangeList: any): Promise<void>;
|
|
11
17
|
_op_cleanVLFiles(snapshotNum: any, vLVersion: any): Promise<void>;
|
|
12
|
-
_op_removeSnapshotsFiles(
|
|
18
|
+
_op_removeSnapshotsFiles(snapshotNumVersionList: any): Promise<void>;
|
|
13
19
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
|
-
join as
|
|
2
|
+
join as m
|
|
3
3
|
} from "node:path";
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
rm as
|
|
6
|
+
rm as c,
|
|
7
7
|
rename as r,
|
|
8
|
-
readdir as
|
|
8
|
+
readdir as h
|
|
9
9
|
} from "node:fs/promises";
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
|
-
getDefaultOptions as
|
|
12
|
+
getDefaultOptions as a
|
|
13
13
|
} from "./QyDefaultOptions.js";
|
|
14
14
|
|
|
15
15
|
import {
|
|
@@ -17,8 +17,8 @@ import {
|
|
|
17
17
|
} from "./QyMessageWorker.js";
|
|
18
18
|
|
|
19
19
|
import {
|
|
20
|
-
folderOrFileExists as
|
|
21
|
-
ensureDir as
|
|
20
|
+
folderOrFileExists as d,
|
|
21
|
+
ensureDir as F
|
|
22
22
|
} from "./QyUtils.js";
|
|
23
23
|
|
|
24
24
|
import {
|
|
@@ -26,85 +26,99 @@ import {
|
|
|
26
26
|
Zip_File_Extension as i
|
|
27
27
|
} from "./QyCompressor.js";
|
|
28
28
|
|
|
29
|
+
import {
|
|
30
|
+
logger as f
|
|
31
|
+
} from "./QyLogger.js";
|
|
32
|
+
|
|
33
|
+
import {
|
|
34
|
+
getInfoFileName as l
|
|
35
|
+
} from "./QySnapshots.js";
|
|
36
|
+
|
|
29
37
|
export default class extends e {
|
|
38
|
+
kvFolder;
|
|
39
|
+
snapshotFolder;
|
|
40
|
+
snapshotInfoFolder;
|
|
41
|
+
aclFolder;
|
|
42
|
+
historyAclFolder;
|
|
43
|
+
historySnapshotFolder;
|
|
30
44
|
constructor({
|
|
31
45
|
kvFolder: e,
|
|
32
46
|
options: s
|
|
33
47
|
}) {
|
|
34
48
|
super(s = {
|
|
35
|
-
...
|
|
49
|
+
...a("QyKVDataCleaner_Worker"),
|
|
36
50
|
...s
|
|
37
51
|
}, [], [ "cleanAclFiles", "cleanPMFiles", "cleanVLFiles", "removeSnapshotsFiles" ]);
|
|
38
|
-
var s =
|
|
52
|
+
var s = m(e, "history"), o = m(e, "snapshot");
|
|
39
53
|
Object.assign(this, {
|
|
40
54
|
kvFolder: e,
|
|
41
|
-
snapshotFolder:
|
|
42
|
-
snapshotInfoFolder:
|
|
43
|
-
aclFolder:
|
|
44
|
-
historyAclFolder:
|
|
45
|
-
historySnapshotFolder:
|
|
55
|
+
snapshotFolder: o,
|
|
56
|
+
snapshotInfoFolder: m(o, "info"),
|
|
57
|
+
aclFolder: m(e, "acl"),
|
|
58
|
+
historyAclFolder: m(s, "acl"),
|
|
59
|
+
historySnapshotFolder: m(s, "snapshot")
|
|
46
60
|
});
|
|
47
61
|
}
|
|
48
62
|
_op_start() {}
|
|
49
63
|
_op_stop() {}
|
|
50
64
|
async _op_cleanAclFiles(e) {
|
|
51
|
-
var s = this,
|
|
52
|
-
if (await
|
|
53
|
-
var
|
|
54
|
-
for (
|
|
65
|
+
var s = this, o = e, e = s.aclFolder;
|
|
66
|
+
if (await d(e)) {
|
|
67
|
+
var a, r = [];
|
|
68
|
+
for (a of (await h(e)).filter(e => /^[1-9]/.test(e))) parseInt(a) <= o && r.push((async (e, s) => {
|
|
55
69
|
var {
|
|
56
|
-
aclFolder:
|
|
57
|
-
historyAclFolder:
|
|
70
|
+
aclFolder: o,
|
|
71
|
+
historyAclFolder: a
|
|
58
72
|
} = e;
|
|
59
|
-
return await
|
|
60
|
-
})(s,
|
|
73
|
+
return await F(a), y(e, s, o, a);
|
|
74
|
+
})(s, a));
|
|
61
75
|
0 < r.length && await Promise.allSettled(r);
|
|
62
76
|
}
|
|
63
77
|
}
|
|
64
78
|
async _op_cleanPMFiles(e) {
|
|
65
79
|
await Promise.allSettled(e.map(([ e, s ]) => {
|
|
66
|
-
return
|
|
67
|
-
var
|
|
80
|
+
return o = this, a = e, r = s, Promise.all([ "pM", "prefixPM" ].map(e => n(o, a, r, e)));
|
|
81
|
+
var o, a, r;
|
|
68
82
|
}));
|
|
69
83
|
}
|
|
70
84
|
async _op_cleanVLFiles(e, s) {
|
|
71
|
-
await
|
|
85
|
+
await n(this, e, s, "vL");
|
|
72
86
|
}
|
|
73
87
|
async _op_removeSnapshotsFiles(e) {
|
|
74
88
|
let {
|
|
75
|
-
snapshotFolder:
|
|
76
|
-
snapshotInfoFolder:
|
|
89
|
+
snapshotFolder: o,
|
|
90
|
+
snapshotInfoFolder: a
|
|
77
91
|
} = this;
|
|
78
|
-
await Promise.all(e.map(async s => {
|
|
79
|
-
await m(
|
|
80
|
-
await m(
|
|
92
|
+
await Promise.all(e.map(async ([ s, e ]) => {
|
|
93
|
+
await c(m(a, l(s, e))), await Promise.all([ "pM", "prefixPM", "vL" ].map(e => n(this, s, 1 / 0, e))),
|
|
94
|
+
await c(m(o, "" + s), {
|
|
81
95
|
recursive: !0
|
|
82
96
|
});
|
|
83
97
|
}));
|
|
84
98
|
}
|
|
85
99
|
}
|
|
86
100
|
|
|
87
|
-
function
|
|
88
|
-
|
|
89
|
-
return e.options.compressRedundantFile ? t(
|
|
101
|
+
function y(e, s, o, a) {
|
|
102
|
+
o = m(o, s), a = m(a, s);
|
|
103
|
+
return e.options.compressRedundantFile ? t(o, a + i, {
|
|
90
104
|
override: !0,
|
|
91
105
|
removeSrcAfterSuccess: !0
|
|
92
|
-
}) : (
|
|
106
|
+
}) : (f.info(`rename ${o} to ` + a), r(o, a));
|
|
93
107
|
}
|
|
94
108
|
|
|
95
|
-
async function
|
|
109
|
+
async function n(s, o, a, r) {
|
|
96
110
|
var {
|
|
97
111
|
snapshotFolder: e,
|
|
98
112
|
historySnapshotFolder: t
|
|
99
|
-
} = s, i =
|
|
100
|
-
if (await
|
|
113
|
+
} = s, i = m(e, "" + o);
|
|
114
|
+
if (await d(i)) {
|
|
101
115
|
let e;
|
|
102
116
|
var l, n = [];
|
|
103
|
-
for (l of await
|
|
117
|
+
for (l of await h(i)) {
|
|
104
118
|
var p = new RegExp("^([0-9]+)_" + r).exec(l);
|
|
105
|
-
p && (p = parseInt(p[1])) <
|
|
106
|
-
await
|
|
107
|
-
n.push(
|
|
119
|
+
p && (p = parseInt(p[1])) < a && (1 == p ? (e || (e = m(t, "" + o),
|
|
120
|
+
await F(e)), n.push(y(s, l, i, e))) : (p = m(i, l), f.info("Removing " + p),
|
|
121
|
+
n.push(c(p))));
|
|
108
122
|
}
|
|
109
123
|
0 < n.length && await Promise.allSettled(n);
|
|
110
124
|
}
|
package/src/QyKVDataLoader.d.ts
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
export declare class QyKVDataLoader {
|
|
2
|
+
options: any;
|
|
3
|
+
kvFolder: any;
|
|
4
|
+
aclFolder: any;
|
|
5
|
+
snapshotFolder: any;
|
|
6
|
+
qySnapshots: any;
|
|
7
|
+
loadedMaxAclNum: number;
|
|
8
|
+
aclKeyValueMap: any;
|
|
9
|
+
maxChangeId: number;
|
|
2
10
|
constructor(kvFolder: any, options: any);
|
|
3
11
|
load(): Promise<{
|
|
4
|
-
maxChangeId:
|
|
5
|
-
loadedMaxAclNum:
|
|
12
|
+
maxChangeId: number;
|
|
13
|
+
loadedMaxAclNum: number;
|
|
6
14
|
qySnapshots: any;
|
|
7
15
|
aclKeyValueMap: any;
|
|
8
16
|
}>;
|
package/src/QyKVDataLoader.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
-
readFile as
|
|
2
|
+
readFile as u,
|
|
3
3
|
readdir as x
|
|
4
4
|
} from "node:fs/promises";
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
|
-
join as
|
|
7
|
+
join as t
|
|
8
8
|
} from "node:path";
|
|
9
9
|
|
|
10
10
|
import {
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
} from "./QyUtils.js";
|
|
13
13
|
|
|
14
14
|
import {
|
|
15
|
-
readAclBuffer as
|
|
15
|
+
readAclBuffer as F
|
|
16
16
|
} from "./QyAcl.js";
|
|
17
17
|
|
|
18
18
|
import {
|
|
@@ -24,20 +24,26 @@ import {
|
|
|
24
24
|
} from "./QyDefaultOptions.js";
|
|
25
25
|
|
|
26
26
|
class a {
|
|
27
|
+
options;
|
|
28
|
+
kvFolder;
|
|
29
|
+
aclFolder;
|
|
30
|
+
snapshotFolder;
|
|
31
|
+
qySnapshots;
|
|
32
|
+
loadedMaxAclNum = 0;
|
|
33
|
+
aclKeyValueMap = {};
|
|
34
|
+
maxChangeId = 0;
|
|
27
35
|
constructor(a, s) {
|
|
28
36
|
s = {
|
|
29
37
|
...l("QyKVDataLoader"),
|
|
30
38
|
...s
|
|
31
39
|
};
|
|
32
|
-
var
|
|
40
|
+
var o = t(a, "snapshot");
|
|
33
41
|
Object.assign(this, {
|
|
34
42
|
kvFolder: a,
|
|
35
43
|
options: s,
|
|
36
|
-
aclFolder:
|
|
37
|
-
snapshotFolder:
|
|
38
|
-
|
|
39
|
-
aclKeyValueMap: {},
|
|
40
|
-
qySnapshots: new e(t, s)
|
|
44
|
+
aclFolder: t(a, "acl"),
|
|
45
|
+
snapshotFolder: o,
|
|
46
|
+
qySnapshots: new e(o, s)
|
|
41
47
|
});
|
|
42
48
|
}
|
|
43
49
|
async load() {
|
|
@@ -45,19 +51,19 @@ class a {
|
|
|
45
51
|
if (a = a.aclFolder, await g(a)) return (await x(a)).filter(a => /^[1-9]/.test(a)).map(a => parseInt(a));
|
|
46
52
|
})(this), a.loadSnapshotInfos() ]);
|
|
47
53
|
let {
|
|
48
|
-
maxSnapshotNum:
|
|
49
|
-
snapshotMaxChangeId:
|
|
54
|
+
maxSnapshotNum: o,
|
|
55
|
+
snapshotMaxChangeId: t
|
|
50
56
|
} = a;
|
|
51
|
-
if (this.maxChangeId =
|
|
52
|
-
var e = this, l = s.filter(a => a >
|
|
57
|
+
if (this.maxChangeId = t, s) {
|
|
58
|
+
var e = this, l = s.filter(a => a > o), {
|
|
53
59
|
aclKeyValueMap: r,
|
|
54
|
-
qySnapshots:
|
|
60
|
+
qySnapshots: n,
|
|
55
61
|
options: s
|
|
56
|
-
} = (l.sort((a, s) => a - s), e),
|
|
62
|
+
} = (l.sort((a, s) => a - s), e), i = s.autoRepairAclFile, p = await Promise.all(l.map(async a => u(I(e, a))));
|
|
57
63
|
for (let a = 0; a < l.length; ++a) {
|
|
58
|
-
var d = l[a], m =
|
|
64
|
+
var d = l[a], m = I(e, d), m = await F(m, p[a], i, e.maxChangeId);
|
|
59
65
|
if (0 < m.length) {
|
|
60
|
-
for (var [ h, c ] of m)
|
|
66
|
+
for (var [ h, c ] of m) n.applyCmdObj(c, r), e.maxChangeId = h;
|
|
61
67
|
e.loadedMaxAclNum = d;
|
|
62
68
|
}
|
|
63
69
|
}
|
|
@@ -66,19 +72,19 @@ class a {
|
|
|
66
72
|
var {
|
|
67
73
|
maxChangeId: s,
|
|
68
74
|
loadedMaxAclNum: f,
|
|
69
|
-
aclKeyValueMap:
|
|
75
|
+
aclKeyValueMap: y
|
|
70
76
|
} = this;
|
|
71
77
|
return {
|
|
72
78
|
maxChangeId: s,
|
|
73
79
|
loadedMaxAclNum: f,
|
|
74
80
|
qySnapshots: a,
|
|
75
|
-
aclKeyValueMap:
|
|
81
|
+
aclKeyValueMap: y
|
|
76
82
|
};
|
|
77
83
|
}
|
|
78
84
|
}
|
|
79
85
|
|
|
80
|
-
function
|
|
81
|
-
return
|
|
86
|
+
function I(a, s) {
|
|
87
|
+
return t(a.aclFolder, s + "_acl.txt");
|
|
82
88
|
}
|
|
83
89
|
|
|
84
90
|
export {
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { QyMessageWorker } from "./QyMessageWorker.ts";
|
|
2
2
|
export default class QyKVDataSaver_Worker extends QyMessageWorker {
|
|
3
|
+
kvFolder: any;
|
|
4
|
+
aclFolder: any;
|
|
5
|
+
qyAclSaver: any;
|
|
6
|
+
qySnapshotSaver: any;
|
|
7
|
+
isStopping: any;
|
|
8
|
+
currentAclNum: any;
|
|
9
|
+
maxChangeId: any;
|
|
10
|
+
snapshotMaxChangeId: any;
|
|
11
|
+
isSavingSnapshot: any;
|
|
12
|
+
saveSnapshotResolve: any;
|
|
3
13
|
constructor({ kvFolder, options }: {
|
|
4
14
|
kvFolder: any;
|
|
5
15
|
options: any;
|
|
@@ -19,10 +19,24 @@ import {
|
|
|
19
19
|
} from "./QySnapshotSaver.js";
|
|
20
20
|
|
|
21
21
|
import {
|
|
22
|
-
delCmdKey as
|
|
22
|
+
delCmdKey as m
|
|
23
23
|
} from "./QyAcl.js";
|
|
24
24
|
|
|
25
|
+
import {
|
|
26
|
+
logger as r
|
|
27
|
+
} from "./QyLogger.js";
|
|
28
|
+
|
|
25
29
|
export default class extends a {
|
|
30
|
+
kvFolder;
|
|
31
|
+
aclFolder;
|
|
32
|
+
qyAclSaver;
|
|
33
|
+
qySnapshotSaver;
|
|
34
|
+
isStopping;
|
|
35
|
+
currentAclNum;
|
|
36
|
+
maxChangeId;
|
|
37
|
+
snapshotMaxChangeId;
|
|
38
|
+
isSavingSnapshot;
|
|
39
|
+
saveSnapshotResolve;
|
|
26
40
|
constructor({
|
|
27
41
|
kvFolder: a,
|
|
28
42
|
options: s
|
|
@@ -46,7 +60,7 @@ export default class extends a {
|
|
|
46
60
|
maxChangeId: a,
|
|
47
61
|
snapshotMaxChangeId: a,
|
|
48
62
|
currentAclNum: (t || s) + 1
|
|
49
|
-
}), o && o.start(
|
|
63
|
+
}), o && o.start(d(this)), n.start(a, t, e);
|
|
50
64
|
}
|
|
51
65
|
async _op_stop() {
|
|
52
66
|
var {
|
|
@@ -58,13 +72,13 @@ export default class extends a {
|
|
|
58
72
|
snapshotMaxChangeId: n
|
|
59
73
|
} = this;
|
|
60
74
|
return this.isStopping = !0, a && await a.stop(), s.saveSnapshotAtStop && n < o && (this.isSavingSnapshot && await new Promise(a => this.saveSnapshotResolve = a),
|
|
61
|
-
|
|
75
|
+
r.log(`Saving snapshot ${e} at stop.`), t.saveSnapshot(e)), t.stop();
|
|
62
76
|
}
|
|
63
77
|
callSave(a, s, t) {
|
|
64
|
-
return
|
|
78
|
+
return h(this, a, s, t, !0);
|
|
65
79
|
}
|
|
66
80
|
castSave(a, s, t) {
|
|
67
|
-
return
|
|
81
|
+
return h(this, a, s, t);
|
|
68
82
|
}
|
|
69
83
|
releaseSnapshot(a) {
|
|
70
84
|
this.qySnapshotSaver.releaseSnapshot(a);
|
|
@@ -74,7 +88,7 @@ export default class extends a {
|
|
|
74
88
|
}
|
|
75
89
|
}
|
|
76
90
|
|
|
77
|
-
function
|
|
91
|
+
function h(a, s, t, e, o = !1) {
|
|
78
92
|
var {
|
|
79
93
|
qyAclSaver: n,
|
|
80
94
|
qySnapshotSaver: r,
|
|
@@ -88,15 +102,15 @@ function r(a, s, t, e, o) {
|
|
|
88
102
|
var l = t, c = e;
|
|
89
103
|
if (c) {
|
|
90
104
|
var g = c.length;
|
|
91
|
-
for (let a = 0; a < g; a += 2)
|
|
105
|
+
for (let a = 0; a < g; a += 2) m(l, c[a]);
|
|
92
106
|
}
|
|
93
107
|
return r.castSave(s, t, e), a.maxChangeId = s, !S && s - i >= h.snapshotMaxChangeCount && (++a.currentAclNum,
|
|
94
|
-
n && n.switch(
|
|
108
|
+
n && n.switch(d(a)), r.saveSnapshot(p), Object.assign(a, {
|
|
95
109
|
snapshotMaxChangeId: s,
|
|
96
110
|
isSavingSnapshot: !0
|
|
97
111
|
})), v;
|
|
98
112
|
}
|
|
99
113
|
|
|
100
|
-
function
|
|
114
|
+
function d(a) {
|
|
101
115
|
return t(a.aclFolder, a.currentAclNum + "_acl.txt");
|
|
102
116
|
}
|