@typeberry/lib 0.8.4-9587022 → 0.8.4
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/package.json +1 -1
- package/packages/jam/database/states.d.ts +7 -0
- package/packages/jam/database/states.d.ts.map +1 -1
- package/packages/jam/database-lmdb/hybrid-states.d.ts +3 -1
- package/packages/jam/database-lmdb/hybrid-states.d.ts.map +1 -1
- package/packages/jam/database-lmdb/hybrid-states.js +5 -2
- package/packages/jam/database-lmdb/root.d.ts +14 -1
- package/packages/jam/database-lmdb/root.d.ts.map +1 -1
- package/packages/jam/database-lmdb/root.js +25 -5
- package/packages/jam/database-lmdb/states.d.ts +1 -0
- package/packages/jam/database-lmdb/states.d.ts.map +1 -1
- package/packages/jam/database-lmdb/states.js +3 -0
- package/packages/jam/database-lmdb/states.test.js +4 -4
- package/packages/jam/node/main-fuzz.d.ts.map +1 -1
- package/packages/jam/node/main-fuzz.js +5 -3
- package/packages/jam/node/main-importer.d.ts +1 -1
- package/packages/jam/node/main-importer.d.ts.map +1 -1
- package/packages/jam/node/main-importer.js +7 -2
- package/packages/workers/api-node/config.d.ts +3 -1
- package/packages/workers/api-node/config.d.ts.map +1 -1
- package/packages/workers/api-node/config.js +13 -7
- package/packages/workers/importer/importer.d.ts +1 -1
- package/packages/workers/importer/importer.d.ts.map +1 -1
- package/packages/workers/importer/importer.js +2 -2
- package/packages/workers/importer/{events-logger.d.ts → stats.d.ts} +7 -2
- package/packages/workers/importer/stats.d.ts.map +1 -0
- package/packages/workers/importer/{events-logger.js → stats.js} +21 -2
- package/packages/workers/importer/events-logger.d.ts.map +0 -1
package/package.json
CHANGED
|
@@ -35,6 +35,13 @@ export interface StatesDb<T extends State = State> {
|
|
|
35
35
|
getState(header: HeaderHash): T | null;
|
|
36
36
|
/** Mark state as no longer needed. Backend may remove it asynchronously. */
|
|
37
37
|
markUnused(header: HeaderHash): void;
|
|
38
|
+
/**
|
|
39
|
+
* Apparent on-disk size of the database in bytes, used for monitoring.
|
|
40
|
+
*
|
|
41
|
+
* Returns `null` when the size is unknown. Backends that are not persisted
|
|
42
|
+
* (e.g. in-memory) may omit the method entirely.
|
|
43
|
+
*/
|
|
44
|
+
diskSizeInBytes?(): number | null;
|
|
38
45
|
/** Close the database and free resources. */
|
|
39
46
|
close(): Promise<void>;
|
|
40
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,KAAK,EAAe,MAAM,kBAAkB,CAAC;AAE/F,OAAO,EAAe,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,0DAA0D;AAC1D,oBAAY,gBAAgB;IAC1B,oDAAoD;IACpD,QAAQ,IAAI;IACZ,iDAAiD;IACjD,MAAM,IAAI;CACX;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,KAAK;IACrC,qEAAqE;IACrE,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACpG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC/C,4CAA4C;IAC5C,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE/C;;;;OAIG;IACH,iBAAiB,CACf,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;IAEvC,4EAA4E;IAC5E,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAErC,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,QAAQ,CAAC,aAAa,CAAC;IAQxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPzC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmE;IACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS;IAI1B,OAAO;IAID,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAgBlC,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAKhE,6CAA6C;IACvC,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAM7G,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAStD,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI9B,KAAK;CACZ"}
|
|
1
|
+
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,KAAK,EAAe,MAAM,kBAAkB,CAAC;AAE/F,OAAO,EAAe,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,0DAA0D;AAC1D,oBAAY,gBAAgB;IAC1B,oDAAoD;IACpD,QAAQ,IAAI;IACZ,iDAAiD;IACjD,MAAM,IAAI;CACX;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,KAAK;IACrC,qEAAqE;IACrE,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACpG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK;IAC/C,4CAA4C;IAC5C,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAE/C;;;;OAIG;IACH,iBAAiB,CACf,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEzC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;IAEvC,4EAA4E;IAC5E,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAErC;;;;;OAKG;IACH,eAAe,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElC,6CAA6C;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,cAAe,YAAW,QAAQ,CAAC,aAAa,CAAC;IAQxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPzC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmE;IACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS;IAI1B,OAAO;IAID,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAgBlC,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAKhE,6CAA6C;IACvC,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAM7G,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI;IAStD,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI9B,KAAK;CACZ"}
|
|
@@ -20,12 +20,13 @@ export declare class HybridSerializedStates implements StatesDb<SerializedState<
|
|
|
20
20
|
private readonly inMemStates;
|
|
21
21
|
private readonly lmdbValues;
|
|
22
22
|
private readonly valuesDb;
|
|
23
|
-
static new({ spec, blake2b, dbPath, readOnly, ephemeral, }: {
|
|
23
|
+
static new({ spec, blake2b, dbPath, readOnly, ephemeral, compression, }: {
|
|
24
24
|
spec: ChainSpec;
|
|
25
25
|
blake2b: Blake2b;
|
|
26
26
|
dbPath: string;
|
|
27
27
|
readOnly?: boolean;
|
|
28
28
|
ephemeral?: boolean;
|
|
29
|
+
compression?: boolean;
|
|
29
30
|
}): HybridSerializedStates;
|
|
30
31
|
private constructor();
|
|
31
32
|
insertInitialState(headerHash: HeaderHash, entries: StateEntries): Promise<Result<OK, StateUpdateError>>;
|
|
@@ -33,6 +34,7 @@ export declare class HybridSerializedStates implements StatesDb<SerializedState<
|
|
|
33
34
|
getStateRoot(state: SerializedState<LeafDb>): Promise<StateRootHash>;
|
|
34
35
|
getState(header: HeaderHash): SerializedState<LeafDb> | null;
|
|
35
36
|
markUnused(header: HeaderHash): void;
|
|
37
|
+
diskSizeInBytes(): number | null;
|
|
36
38
|
close(): Promise<void>;
|
|
37
39
|
/** Write new large values to LMDB in one transaction. */
|
|
38
40
|
private writeValues;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid-states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-lmdb/hybrid-states.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,KAAK,YAAY,EACjB,MAAM,EACN,KAAK,QAAQ,EACb,gBAAgB,EAGjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EAGlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG9C;;;;;;;GAOG;AACH,qBAAa,sBAAuB,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"hybrid-states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-lmdb/hybrid-states.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,KAAK,YAAY,EACjB,MAAM,EACN,KAAK,QAAQ,EACb,gBAAgB,EAGjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EAGlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG9C;;;;;;;GAOG;AACH,qBAAa,sBAAuB,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IA0BxG,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IA3BvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyE;IACrG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAEnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC,MAAM,CAAC,GAAG,CAAC,EACT,IAAI,EACJ,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAW,GACZ,EAAE;QACD,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB;IAKD,OAAO;IASD,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAcxG,iBAAiB,CACrB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAkBlC,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1E,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;IAS5D,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAMpC,eAAe,IAAI,MAAM,GAAG,IAAI;IAI1B,KAAK;IAKX,yDAAyD;YAC3C,WAAW;IAgBzB,8BAA8B;IAC9B,OAAO,CAAC,SAAS;CAOlB"}
|
|
@@ -20,8 +20,8 @@ export class HybridSerializedStates {
|
|
|
20
20
|
lmdbValues;
|
|
21
21
|
// A single shared values accessor reused by every `LeafDb` we hand out.
|
|
22
22
|
valuesDb;
|
|
23
|
-
static new({ spec, blake2b, dbPath, readOnly, ephemeral, }) {
|
|
24
|
-
const root = LmdbRoot.new(dbPath, readOnly, ephemeral);
|
|
23
|
+
static new({ spec, blake2b, dbPath, readOnly, ephemeral, compression, }) {
|
|
24
|
+
const root = LmdbRoot.new(dbPath, { readOnly, ephemeral, compression });
|
|
25
25
|
return new HybridSerializedStates(spec, blake2b, root);
|
|
26
26
|
}
|
|
27
27
|
constructor(spec, blake2b, root) {
|
|
@@ -73,6 +73,9 @@ export class HybridSerializedStates {
|
|
|
73
73
|
// but since they are stored on disk we should be safe.
|
|
74
74
|
this.inMemStates.delete(header);
|
|
75
75
|
}
|
|
76
|
+
diskSizeInBytes() {
|
|
77
|
+
return this.root.sizeInBytes();
|
|
78
|
+
}
|
|
76
79
|
async close() {
|
|
77
80
|
await this.lmdbValues.close();
|
|
78
81
|
await this.root.close();
|
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
import * as lmdb from "lmdb";
|
|
2
2
|
export type SubDb = lmdb.Database<Uint8Array, lmdb.Key>;
|
|
3
|
+
export type LmdbRootOptions = {
|
|
4
|
+
readOnly?: boolean;
|
|
5
|
+
ephemeral?: boolean;
|
|
6
|
+
compression?: boolean;
|
|
7
|
+
};
|
|
3
8
|
/** A thin abstraction over lmdb database interface. */
|
|
4
9
|
export declare class LmdbRoot {
|
|
5
10
|
readonly db: lmdb.RootDatabase<Uint8Array, lmdb.Key>;
|
|
6
|
-
|
|
11
|
+
/** Path of the underlying LMDB data file, used to report on-disk usage. */
|
|
12
|
+
private readonly dataFilePath;
|
|
13
|
+
static new(dbPath: string, options: LmdbRootOptions): LmdbRoot;
|
|
7
14
|
private constructor();
|
|
8
15
|
/** Open a sub-database under the same path. */
|
|
9
16
|
subDb(name: string): SubDb;
|
|
17
|
+
/**
|
|
18
|
+
* Apparent on-disk size of the LMDB data file, in bytes.
|
|
19
|
+
*
|
|
20
|
+
* Returns `null` if the file cannot be `stat`-ed (e.g. not yet created).
|
|
21
|
+
*/
|
|
22
|
+
sizeInBytes(): number | null;
|
|
10
23
|
/** Close the database and all sub-databases. */
|
|
11
24
|
close(): Promise<void>;
|
|
12
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-lmdb/root.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-lmdb/root.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,uDAAuD;AACvD,qBAAa,QAAQ;IACnB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;IAInD,OAAO;IAwBP,+CAA+C;IAC/C,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAI1B;;;;OAIG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;IAQ5B,gDAAgD;IAC1C,KAAK;CAGZ"}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
1
2
|
import * as lmdb from "lmdb";
|
|
2
3
|
/** A thin abstraction over lmdb database interface. */
|
|
3
4
|
export class LmdbRoot {
|
|
4
5
|
db;
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
/** Path of the underlying LMDB data file, used to report on-disk usage. */
|
|
7
|
+
dataFilePath;
|
|
8
|
+
static new(dbPath, options) {
|
|
9
|
+
return new LmdbRoot(dbPath, options);
|
|
7
10
|
}
|
|
8
|
-
constructor(dbPath, readOnly
|
|
11
|
+
constructor(dbPath, { readOnly, ephemeral, compression }) {
|
|
12
|
+
// `lmdb.open` treats an extension-less path as a directory and stores the
|
|
13
|
+
// environment in `<dbPath>/data.mdb` (next to `lock.mdb`).
|
|
14
|
+
this.dataFilePath = `${dbPath}/data.mdb`;
|
|
15
|
+
const isEphemeral = ephemeral ?? false;
|
|
9
16
|
this.db = lmdb.open(dbPath, {
|
|
10
17
|
// experimental options
|
|
11
18
|
noMemInit: true,
|
|
@@ -15,8 +22,8 @@ export class LmdbRoot {
|
|
|
15
22
|
// durability is pointless, so we skip fsync and skip compressing the large
|
|
16
23
|
// per-block leaf blobs. Both are pure overhead there and dominate the cost.
|
|
17
24
|
// This trades disk space (uncompressed) and crash-durability for speed.
|
|
18
|
-
compression: !
|
|
19
|
-
noSync:
|
|
25
|
+
compression: compression ?? !isEphemeral,
|
|
26
|
+
noSync: isEphemeral,
|
|
20
27
|
keyEncoding: "binary",
|
|
21
28
|
encoding: "binary",
|
|
22
29
|
readOnly,
|
|
@@ -26,6 +33,19 @@ export class LmdbRoot {
|
|
|
26
33
|
subDb(name) {
|
|
27
34
|
return this.db.openDB({ name });
|
|
28
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Apparent on-disk size of the LMDB data file, in bytes.
|
|
38
|
+
*
|
|
39
|
+
* Returns `null` if the file cannot be `stat`-ed (e.g. not yet created).
|
|
40
|
+
*/
|
|
41
|
+
sizeInBytes() {
|
|
42
|
+
try {
|
|
43
|
+
return fs.statSync(this.dataFilePath).size;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
29
49
|
/** Close the database and all sub-databases. */
|
|
30
50
|
async close() {
|
|
31
51
|
await this.db.close();
|
|
@@ -69,6 +69,7 @@ export declare class LmdbStates implements StatesDb<SerializedState<LeafDb>>, In
|
|
|
69
69
|
getStateRoot(state: SerializedState<LeafDb>): Promise<StateRootHash>;
|
|
70
70
|
getState(root: HeaderHash): SerializedState<LeafDb> | null;
|
|
71
71
|
markUnused(header: HeaderHash): void;
|
|
72
|
+
diskSizeInBytes(): number | null;
|
|
72
73
|
close(): Promise<void>;
|
|
73
74
|
}
|
|
74
75
|
//# sourceMappingURL=states.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-lmdb/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,gBAAgB,EAAe,MAAM,qBAAqB,CAAC;AAC9G,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAgD,MAAM,gCAAgC,CAAC;AAG/G,OAAO,EAAE,EAAE,EAAE,MAAM,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAS,MAAM,WAAW,CAAC;AAGjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,qBAAa,UAAW,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IAS5F,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAE/B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;IAI5D,OAAO;IASD,kBAAkB,CACtB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAQ1B,eAAe;IA0BvB,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAWlC,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1E,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;IAsB1D,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/database-lmdb/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,EAAE,KAAK,QAAQ,EAAE,gBAAgB,EAAe,MAAM,qBAAqB,CAAC;AAC9G,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAgD,MAAM,gCAAgC,CAAC;AAG/G,OAAO,EAAE,EAAE,EAAE,MAAM,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAS,MAAM,WAAW,CAAC;AAGjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,qBAAa,UAAW,YAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC;IAS5F,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAE/B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;IAI5D,OAAO;IASD,kBAAkB,CACtB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAQ1B,eAAe;IA0BvB,iBAAiB,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAWlC,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAI1E,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI;IAsB1D,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIpC,eAAe,IAAI,MAAM,GAAG,IAAI;IAI1B,KAAK;CAGZ"}
|
|
@@ -131,6 +131,9 @@ export class LmdbStates {
|
|
|
131
131
|
markUnused(header) {
|
|
132
132
|
this.states.removeSync(header.raw);
|
|
133
133
|
}
|
|
134
|
+
diskSizeInBytes() {
|
|
135
|
+
return this.root.sizeInBytes();
|
|
136
|
+
}
|
|
134
137
|
async close() {
|
|
135
138
|
await Promise.all([this.states.close(), this.values.close()]);
|
|
136
139
|
}
|
|
@@ -37,7 +37,7 @@ describe("LMDB States database", () => {
|
|
|
37
37
|
const headerHash = Bytes.zero(HASH_SIZE).asOpaque();
|
|
38
38
|
const spec = tinyChainSpec;
|
|
39
39
|
it("should import state and read state", async () => {
|
|
40
|
-
const root = LmdbRoot.new(tmpDir);
|
|
40
|
+
const root = LmdbRoot.new(tmpDir, {});
|
|
41
41
|
const states = LmdbStates.new(spec, blake2b, root);
|
|
42
42
|
try {
|
|
43
43
|
const emptyState = InMemoryState.empty(spec);
|
|
@@ -58,7 +58,7 @@ describe("LMDB States database", () => {
|
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
it("should update the state", async () => {
|
|
61
|
-
const root = LmdbRoot.new(tmpDir);
|
|
61
|
+
const root = LmdbRoot.new(tmpDir, {});
|
|
62
62
|
const states = LmdbStates.new(spec, blake2b, root);
|
|
63
63
|
try {
|
|
64
64
|
const state = InMemoryState.empty(spec);
|
|
@@ -142,7 +142,7 @@ describe("LMDB States database", () => {
|
|
|
142
142
|
deepEqual(Array.from(set), Array.from(SortedSet.fromArray(leafComparator, Array.from(trie.nodes.leaves()))));
|
|
143
143
|
});
|
|
144
144
|
it("should import more complex state", async () => {
|
|
145
|
-
const root = LmdbRoot.new(tmpDir);
|
|
145
|
+
const root = LmdbRoot.new(tmpDir, {});
|
|
146
146
|
const states = LmdbStates.new(spec, blake2b, root);
|
|
147
147
|
try {
|
|
148
148
|
const initialState = testState();
|
|
@@ -167,7 +167,7 @@ describe("LMDB States database", () => {
|
|
|
167
167
|
}
|
|
168
168
|
});
|
|
169
169
|
it("should update more complex entries", async () => {
|
|
170
|
-
const root = LmdbRoot.new(tmpDir);
|
|
170
|
+
const root = LmdbRoot.new(tmpDir, {});
|
|
171
171
|
const states = LmdbStates.new(spec, blake2b, root);
|
|
172
172
|
try {
|
|
173
173
|
const state = testState();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-fuzz.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-fuzz.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAOrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,SAAS,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;CAClC,CAAC;AAOF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CASpF;AAED,iFAAiF;AACjF,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAgB,cAAc;;;;EAM7B;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"main-fuzz.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-fuzz.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAOrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,SAAS,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uBAAuB,EAAE,OAAO,CAAC;CAClC,CAAC;AAOF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CASpF;AAED,iFAAiF;AACjF,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAgB,cAAc;;;;EAM7B;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,uBA2GxF"}
|
|
@@ -101,9 +101,11 @@ export async function mainFuzz(fuzzConfig, withRelPath) {
|
|
|
101
101
|
// like the in-memory backend; only the large values live on disk.
|
|
102
102
|
dummyFinalityDepth: 20,
|
|
103
103
|
pruneBlocks: true,
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
|
|
104
|
+
// Long full-spec sessions accumulate a large, never-pruned values db.
|
|
105
|
+
// Syncing lets the OS reclaim dirty mmap pages, and compression (full
|
|
106
|
+
// spec only, where values are big) bounds its on-disk/page-cache size.
|
|
107
|
+
// Tiny stays uncompressed since its db is small and speed matters more.
|
|
108
|
+
ephemeral: isPersistent,
|
|
107
109
|
stateBackend: isPersistent ? "hybrid" : "lmdb",
|
|
108
110
|
});
|
|
109
111
|
};
|
|
@@ -5,7 +5,7 @@ export type ImporterOptions = {
|
|
|
5
5
|
dummyFinalityDepth?: number;
|
|
6
6
|
pruneBlocks?: boolean;
|
|
7
7
|
/** Open the LMDB database without fsync/compression. Only safe for throwaway dbs (e.g. fuzzing). */
|
|
8
|
-
|
|
8
|
+
ephemeral?: boolean;
|
|
9
9
|
/** Persistent backend to use when `databaseBasePath` is set. Defaults to full LMDB. */
|
|
10
10
|
stateBackend?: "lmdb" | "hybrid";
|
|
11
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-importer.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-importer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main-importer.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/node/main-importer.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,MAAM,MAAM,eAAe,GAAG;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oGAAoG;IACpG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAClC,CAAC;AAEF,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAClC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAoGlB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Bytes } from "#@typeberry/bytes";
|
|
2
2
|
import { PvmBackend } from "#@typeberry/config";
|
|
3
|
+
import { KnownChainSpec } from "#@typeberry/config-node";
|
|
3
4
|
import { bandersnatch, initWasm } from "#@typeberry/crypto";
|
|
4
5
|
import { Blake2b, HASH_SIZE } from "#@typeberry/hash";
|
|
5
6
|
import { createImporter, ImporterConfig } from "#@typeberry/importer";
|
|
@@ -28,6 +29,9 @@ export async function mainImporter(config, withRelPath, options = {}) {
|
|
|
28
29
|
dummyFinalityDepth: tryAsU16(options.dummyFinalityDepth ?? 0),
|
|
29
30
|
pruneBlocks: options.pruneBlocks ?? false,
|
|
30
31
|
});
|
|
32
|
+
const ephemeral = options.ephemeral ?? false;
|
|
33
|
+
// enable compression when running full test suite
|
|
34
|
+
const compression = ephemeral && config.node.flavor === KnownChainSpec.Full;
|
|
31
35
|
const workerConfig = dbBackend === "in-memory"
|
|
32
36
|
? InMemWorkerConfig.new({
|
|
33
37
|
nodeName,
|
|
@@ -42,7 +46,8 @@ export async function mainImporter(config, withRelPath, options = {}) {
|
|
|
42
46
|
blake2b,
|
|
43
47
|
dbPath,
|
|
44
48
|
workerParams,
|
|
45
|
-
ephemeral
|
|
49
|
+
ephemeral,
|
|
50
|
+
compression,
|
|
46
51
|
})
|
|
47
52
|
: LmdbWorkerConfig.new({
|
|
48
53
|
nodeName,
|
|
@@ -50,7 +55,7 @@ export async function mainImporter(config, withRelPath, options = {}) {
|
|
|
50
55
|
blake2b,
|
|
51
56
|
dbPath,
|
|
52
57
|
workerParams,
|
|
53
|
-
ephemeral
|
|
58
|
+
ephemeral,
|
|
54
59
|
});
|
|
55
60
|
// Initialize the database with genesis state and block if there isn't one.
|
|
56
61
|
logger.info `🛢️ Opening database at ${dbPath}`;
|
|
@@ -91,13 +91,15 @@ export declare class HybridWorkerConfig<T = undefined> implements WorkerConfig<T
|
|
|
91
91
|
readonly blake2b: Blake2b;
|
|
92
92
|
readonly dbPath: string;
|
|
93
93
|
readonly ephemeral: boolean;
|
|
94
|
-
|
|
94
|
+
readonly compression: boolean;
|
|
95
|
+
static new<T>({ nodeName, chainSpec, workerParams, blake2b, dbPath, ephemeral, compression, }: {
|
|
95
96
|
nodeName: string;
|
|
96
97
|
chainSpec: ChainSpec;
|
|
97
98
|
workerParams: T;
|
|
98
99
|
blake2b: Blake2b;
|
|
99
100
|
dbPath: string;
|
|
100
101
|
ephemeral?: boolean;
|
|
102
|
+
compression?: boolean;
|
|
101
103
|
}): HybridWorkerConfig<T>;
|
|
102
104
|
private readonly blocks;
|
|
103
105
|
private readonly states;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/api-node/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,MAAM,EAAW,KAAK,MAAM,EAAW,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,KAAK,QAAQ,EAGb,KAAK,MAAM,EACX,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE9D,+EAA+E;AAC/E,qBAAa,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAE,YAAW,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC;aAyC5E,QAAQ,EAAE,MAAM;aAChB,SAAS,EAAE,SAAS;aACpB,YAAY,EAAE,CAAC;aACf,MAAM,EAAE,MAAM;aACd,OAAO,EAAE,OAAO;aAChB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;aAI9B,SAAS,EAAE,OAAO;IAjDpC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,MAAM,EACN,OAAO,EACP,KAAiB,EACjB,SAAiB,GAClB,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,YAAY,EAAE,CAAC,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAChC,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB;IAID,6DAA6D;WAChD,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB;IAkBpF,OAAO;IAaP,YAAY,CAAC,OAAO,GAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAuB,GAAG,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/api-node/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,9 +32,9 @@ export class LmdbWorkerConfig {
|
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
constructor(nodeName, chainSpec, workerParams, dbPath, blake2b, ports,
|
|
35
|
-
// When set, the underlying LMDB skips fsync
|
|
36
|
-
//
|
|
37
|
-
//
|
|
35
|
+
// When set, the underlying LMDB skips fsync. Only safe for throwaway
|
|
36
|
+
// databases (the fuzz target wipes on reset). Not transferred to worker
|
|
37
|
+
// threads, so the durable main node path always gets the default.
|
|
38
38
|
ephemeral = false) {
|
|
39
39
|
this.nodeName = nodeName;
|
|
40
40
|
this.chainSpec = chainSpec;
|
|
@@ -45,7 +45,10 @@ export class LmdbWorkerConfig {
|
|
|
45
45
|
this.ephemeral = ephemeral;
|
|
46
46
|
}
|
|
47
47
|
openDatabase(options = { readonly: true }) {
|
|
48
|
-
const lmdb = LmdbRoot.new(this.dbPath,
|
|
48
|
+
const lmdb = LmdbRoot.new(this.dbPath, {
|
|
49
|
+
readOnly: options.readonly,
|
|
50
|
+
ephemeral: this.ephemeral,
|
|
51
|
+
});
|
|
49
52
|
return {
|
|
50
53
|
getBlocksDb: () => LmdbBlocks.new(this.chainSpec, lmdb),
|
|
51
54
|
getStatesDb: () => LmdbStates.new(this.chainSpec, this.blake2b, lmdb),
|
|
@@ -125,24 +128,27 @@ export class HybridWorkerConfig {
|
|
|
125
128
|
blake2b;
|
|
126
129
|
dbPath;
|
|
127
130
|
ephemeral;
|
|
128
|
-
|
|
129
|
-
|
|
131
|
+
compression;
|
|
132
|
+
static new({ nodeName, chainSpec, workerParams, blake2b, dbPath, ephemeral = false, compression = true, }) {
|
|
133
|
+
return new HybridWorkerConfig(nodeName, chainSpec, workerParams, blake2b, dbPath, ephemeral, compression);
|
|
130
134
|
}
|
|
131
135
|
blocks;
|
|
132
136
|
states;
|
|
133
|
-
constructor(nodeName, chainSpec, workerParams, blake2b, dbPath, ephemeral) {
|
|
137
|
+
constructor(nodeName, chainSpec, workerParams, blake2b, dbPath, ephemeral, compression = true) {
|
|
134
138
|
this.nodeName = nodeName;
|
|
135
139
|
this.chainSpec = chainSpec;
|
|
136
140
|
this.workerParams = workerParams;
|
|
137
141
|
this.blake2b = blake2b;
|
|
138
142
|
this.dbPath = dbPath;
|
|
139
143
|
this.ephemeral = ephemeral;
|
|
144
|
+
this.compression = compression;
|
|
140
145
|
this.blocks = InMemoryBlocks.new();
|
|
141
146
|
this.states = HybridSerializedStates.new({
|
|
142
147
|
spec: this.chainSpec,
|
|
143
148
|
blake2b: this.blake2b,
|
|
144
149
|
dbPath: this.dbPath,
|
|
145
150
|
ephemeral: this.ephemeral,
|
|
151
|
+
compression: this.compression,
|
|
146
152
|
readOnly: false,
|
|
147
153
|
});
|
|
148
154
|
}
|
|
@@ -8,8 +8,8 @@ import type { TransitionHasher } from "#@typeberry/transition";
|
|
|
8
8
|
import { BlockVerifierError } from "#@typeberry/transition/block-verifier.js";
|
|
9
9
|
import { type StfError } from "#@typeberry/transition/chain-stf.js";
|
|
10
10
|
import { Result, type TaggedError } from "#@typeberry/utils";
|
|
11
|
-
import { type ImporterEventsListener } from "./events-logger.js";
|
|
12
11
|
import type { Finalizer } from "./finality.js";
|
|
12
|
+
import { type ImporterEventsListener } from "./stats.js";
|
|
13
13
|
export declare enum ImporterErrorKind {
|
|
14
14
|
Verifier = 0,
|
|
15
15
|
Stf = 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/importer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAiB,MAAM,kBAAkB,CAAC;AACvH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAiB,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,EAA0B,KAAK,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC3F,OAAO,EAA6B,MAAM,EAAkB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/importer.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { WithHash } from "#@typeberry/hash";
|
|
|
3
3
|
import { BlockVerifier, BlockVerifierError } from "#@typeberry/transition/block-verifier.js";
|
|
4
4
|
import { DbHeaderChain, OnChain } from "#@typeberry/transition/chain-stf.js";
|
|
5
5
|
import { measure, Result, resultToString } from "#@typeberry/utils";
|
|
6
|
-
import { ImporterStats } from "./events-logger.js";
|
|
7
6
|
import * as metrics from "./metrics.js";
|
|
7
|
+
import { ImporterStats } from "./stats.js";
|
|
8
8
|
export var ImporterErrorKind;
|
|
9
9
|
(function (ImporterErrorKind) {
|
|
10
10
|
ImporterErrorKind[ImporterErrorKind["Verifier"] = 0] = "Verifier";
|
|
@@ -52,7 +52,7 @@ export class Importer {
|
|
|
52
52
|
this.blocks = args.blocks;
|
|
53
53
|
this.states = args.states;
|
|
54
54
|
this.options = args.options ?? {};
|
|
55
|
-
this.events = args.events ?? ImporterStats.new(args.logger);
|
|
55
|
+
this.events = args.events ?? ImporterStats.new(args.logger, () => this.states.diskSizeInBytes?.() ?? null);
|
|
56
56
|
this.metrics = metrics.createMetrics();
|
|
57
57
|
this.verifier = BlockVerifier.new(args.hasher, args.blocks);
|
|
58
58
|
this.stf = OnChain.assemble({
|
|
@@ -2,6 +2,8 @@ import type { HeaderHash, TimeSlot } from "#@typeberry/block";
|
|
|
2
2
|
import type { LeafDb } from "#@typeberry/database";
|
|
3
3
|
import type { Logger } from "#@typeberry/logger";
|
|
4
4
|
import type { SerializedState } from "#@typeberry/state-merkleization";
|
|
5
|
+
/** Reports the current on-disk database size in bytes, or `null` when unknown. */
|
|
6
|
+
export type DbSizeProvider = () => number | null;
|
|
5
7
|
/** Events happening during block imports. */
|
|
6
8
|
export interface ImporterEventsListener {
|
|
7
9
|
/**
|
|
@@ -16,18 +18,21 @@ export interface ImporterEventsListener {
|
|
|
16
18
|
}
|
|
17
19
|
export declare class ImporterStats implements ImporterEventsListener {
|
|
18
20
|
private readonly logger;
|
|
21
|
+
/** Reports the current on-disk database size in bytes, or `null` if unknown. */
|
|
22
|
+
private readonly dbSizeInBytes;
|
|
19
23
|
/** How often we are going to print the stats (i.e. every `maxBlocks` blocks) */
|
|
20
24
|
private readonly maxBlocks;
|
|
21
25
|
/** Alternatively print stats when we reach `${maxTimeMs}` of total block execution. */
|
|
22
26
|
private readonly maxTimeMs;
|
|
23
27
|
private readonly memory;
|
|
28
|
+
private showDiskStats;
|
|
24
29
|
private totalTimePrev;
|
|
25
30
|
private totalTime;
|
|
26
31
|
private totalBlocksPrev;
|
|
27
32
|
private totalBlocks;
|
|
28
|
-
static new(logger: Logger): ImporterStats;
|
|
33
|
+
static new(logger: Logger, dbSizeInBytes?: DbSizeProvider): ImporterStats;
|
|
29
34
|
private constructor();
|
|
30
35
|
onStart(currentBestHeaderHash: HeaderHash, currentBestState: SerializedState<LeafDb>): void;
|
|
31
36
|
onBlockImportingStarted(timeSlot: TimeSlot): (isOk: boolean) => number;
|
|
32
37
|
}
|
|
33
|
-
//# sourceMappingURL=
|
|
38
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGtE,kFAAkF;AAClF,MAAM,MAAM,cAAc,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAWjD,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;IAEvE,qCAAqC;IACrC,OAAO,CAAC,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAC7F;AAED,qBAAa,aAAc,YAAW,sBAAsB;IAaxD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAlB5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAK;IAExB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,GAAE,cAA2B;IAIrE,OAAO;IAUP,OAAO,CAAC,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC;IAIpF,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,IAGhC,MAAM,OAAO;CAiCxB"}
|
|
@@ -1,22 +1,35 @@
|
|
|
1
1
|
import { memoryTracker, now } from "#@typeberry/utils";
|
|
2
|
+
/** Format a database size for the stats line, e.g. ` db=12.34GB`. Empty when unknown. */
|
|
3
|
+
function formatDbSize(bytes) {
|
|
4
|
+
if (bytes === null) {
|
|
5
|
+
return "";
|
|
6
|
+
}
|
|
7
|
+
const mb = bytes / (1024 * 1024);
|
|
8
|
+
return mb >= 1024 ? ` db=${(mb / 1024).toFixed(2)}GB` : ` db=${mb.toFixed(1)}MB`;
|
|
9
|
+
}
|
|
2
10
|
export class ImporterStats {
|
|
3
11
|
logger;
|
|
12
|
+
dbSizeInBytes;
|
|
4
13
|
maxBlocks;
|
|
5
14
|
maxTimeMs;
|
|
6
15
|
memory = memoryTracker();
|
|
16
|
+
showDiskStats = true;
|
|
7
17
|
totalTimePrev = 0;
|
|
8
18
|
totalTime = 0;
|
|
9
19
|
totalBlocksPrev = 0;
|
|
10
20
|
totalBlocks = 0;
|
|
11
|
-
static new(logger) {
|
|
12
|
-
return new ImporterStats(logger);
|
|
21
|
+
static new(logger, dbSizeInBytes = () => null) {
|
|
22
|
+
return new ImporterStats(logger, dbSizeInBytes);
|
|
13
23
|
}
|
|
14
24
|
constructor(logger,
|
|
25
|
+
/** Reports the current on-disk database size in bytes, or `null` if unknown. */
|
|
26
|
+
dbSizeInBytes = () => null,
|
|
15
27
|
/** How often we are going to print the stats (i.e. every `maxBlocks` blocks) */
|
|
16
28
|
maxBlocks = 100,
|
|
17
29
|
/** Alternatively print stats when we reach `${maxTimeMs}` of total block execution. */
|
|
18
30
|
maxTimeMs = 5000) {
|
|
19
31
|
this.logger = logger;
|
|
32
|
+
this.dbSizeInBytes = dbSizeInBytes;
|
|
20
33
|
this.maxBlocks = maxBlocks;
|
|
21
34
|
this.maxTimeMs = maxTimeMs;
|
|
22
35
|
}
|
|
@@ -32,6 +45,12 @@ export class ImporterStats {
|
|
|
32
45
|
this.totalTime += duration;
|
|
33
46
|
this.totalBlocks += 1;
|
|
34
47
|
if (this.totalBlocks >= this.maxBlocks || this.totalTime >= this.maxTimeMs) {
|
|
48
|
+
// disk data (every second output)
|
|
49
|
+
if (this.showDiskStats) {
|
|
50
|
+
this.logger.info `💾 disk at #${timeSlot}: ${formatDbSize(this.dbSizeInBytes())}`;
|
|
51
|
+
}
|
|
52
|
+
this.showDiskStats = !this.showDiskStats;
|
|
53
|
+
// memory
|
|
35
54
|
this.logger.info `📊 mem at #${timeSlot}: ${this.memory()}`;
|
|
36
55
|
// compute block statistics (rolling window of last two rounds)
|
|
37
56
|
const importedBlocks = this.totalBlocks + this.totalBlocksPrev;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events-logger.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/events-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGtE,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC;IAEvE,qCAAqC;IACrC,OAAO,CAAC,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAC7F;AAED,qBAAa,aAAc,YAAW,sBAAsB;IAYxD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAf5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAK;IAExB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM;IAIzB,OAAO;IAQP,OAAO,CAAC,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC;IAIpF,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,IAGhC,MAAM,OAAO;CA0BxB"}
|