@typeberry/lib 0.7.1 → 0.7.2-f0f2df3
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/core/utils/debug.d.ts +11 -0
- package/packages/core/utils/debug.d.ts.map +1 -1
- package/packages/core/utils/debug.js +40 -0
- package/packages/core/utils/debug.test.js +22 -1
- package/packages/jam/config-node/node-config.js +1 -1
- package/packages/workers/importer/importer.d.ts +1 -0
- package/packages/workers/importer/importer.d.ts.map +1 -1
- package/packages/workers/importer/importer.js +5 -1
package/package.json
CHANGED
|
@@ -41,6 +41,17 @@ export declare function assertEmpty<T extends Record<string, never>>(value: T):
|
|
|
41
41
|
export declare function inspect<T>(val: T): string;
|
|
42
42
|
/** Utility function to measure time taken for some operation [ms]. */
|
|
43
43
|
export declare function measure(id: string): () => string;
|
|
44
|
+
/**
|
|
45
|
+
* Format current process memory usage as a human readable string.
|
|
46
|
+
*
|
|
47
|
+
* Returns an empty string in the browser where `process.memoryUsage` is unavailable.
|
|
48
|
+
*
|
|
49
|
+
* `arrayBuffers` should allow tracking WASM memory, since every instance backs its
|
|
50
|
+
* memory with `ArrayBuffer`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function memoryUsage(): string;
|
|
53
|
+
/** Create a stateful memory usage reporter. */
|
|
54
|
+
export declare function memoryTracker(): () => string;
|
|
44
55
|
/** A class that adds `toString` method that prints all properties of an object. */
|
|
45
56
|
export declare abstract class WithDebug {
|
|
46
57
|
toString(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/debug.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,YAExB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG,cAA6F,CAAC;AAE9G;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,OAAO,EAClB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,SAAS,IAAI,IAAI,CAO3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,QAKpE;AAED,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAEzC;AAkED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,gBAGjC;AAED,mFAAmF;AACnF,8BAAsB,SAAS;IAC7B,QAAQ;CAGT;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;;EAMpC"}
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../../../packages/core/utils/debug.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,YAExB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG,cAA6F,CAAC;AAE9G;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,OAAO,EAClB,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,SAAS,IAAI,IAAI,CAO3B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,QAKpE;AAED,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAEzC;AAkED,sEAAsE;AACtE,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,gBAGjC;AAcD;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,MAAM,MAAM,CAc5C;AAED,mFAAmF;AACnF,8BAAsB,SAAS;IAC7B,QAAQ;CAGT;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;;EAMpC"}
|
|
@@ -113,6 +113,46 @@ export function measure(id) {
|
|
|
113
113
|
const start = now();
|
|
114
114
|
return () => `${id} took ${(now() - start).toFixed(2)}ms`;
|
|
115
115
|
}
|
|
116
|
+
const BYTES_IN_MB = 1024 * 1024;
|
|
117
|
+
const toMb = (bytes) => (bytes / BYTES_IN_MB).toFixed(1);
|
|
118
|
+
const signedMb = (bytes) => `${bytes >= 0 ? "+" : "-"}${toMb(bytes)}`;
|
|
119
|
+
/** Raw process memory usage, or `null` in environments without `process` (e.g. browser). */
|
|
120
|
+
function rawMemoryUsage() {
|
|
121
|
+
if (isBrowser() || typeof process.memoryUsage !== "function") {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return process.memoryUsage();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Format current process memory usage as a human readable string.
|
|
128
|
+
*
|
|
129
|
+
* Returns an empty string in the browser where `process.memoryUsage` is unavailable.
|
|
130
|
+
*
|
|
131
|
+
* `arrayBuffers` should allow tracking WASM memory, since every instance backs its
|
|
132
|
+
* memory with `ArrayBuffer`.
|
|
133
|
+
*/
|
|
134
|
+
export function memoryUsage() {
|
|
135
|
+
const m = rawMemoryUsage();
|
|
136
|
+
if (m === null) {
|
|
137
|
+
return "";
|
|
138
|
+
}
|
|
139
|
+
return `rss=${toMb(m.rss)}MB heap=${toMb(m.heapUsed)}/${toMb(m.heapTotal)}MB external=${toMb(m.external)}MB arrayBuffers=${toMb(m.arrayBuffers)}MB`;
|
|
140
|
+
}
|
|
141
|
+
/** Create a stateful memory usage reporter. */
|
|
142
|
+
export function memoryTracker() {
|
|
143
|
+
let prev = null;
|
|
144
|
+
return () => {
|
|
145
|
+
const m = rawMemoryUsage();
|
|
146
|
+
if (m === null) {
|
|
147
|
+
return "";
|
|
148
|
+
}
|
|
149
|
+
const delta = prev === null
|
|
150
|
+
? ""
|
|
151
|
+
: ` (Δrss=${signedMb(m.rss - prev.rss)}MB ΔarrayBuffers=${signedMb(m.arrayBuffers - prev.arrayBuffers)}MB)`;
|
|
152
|
+
prev = m;
|
|
153
|
+
return `${memoryUsage()}${delta}`;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
116
156
|
/** A class that adds `toString` method that prints all properties of an object. */
|
|
117
157
|
export class WithDebug {
|
|
118
158
|
toString() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert";
|
|
2
2
|
import { describe, it } from "node:test";
|
|
3
|
-
import { check, inspect, lazyInspect } from "./debug.js";
|
|
3
|
+
import { check, inspect, lazyInspect, memoryTracker, memoryUsage } from "./debug.js";
|
|
4
4
|
describe("utils::check", () => {
|
|
5
5
|
it("should do nothing if condition is met", () => {
|
|
6
6
|
check `${true} I shall not fail!`;
|
|
@@ -23,3 +23,24 @@ describe("utils::lazyInspect", () => {
|
|
|
23
23
|
assert.strictEqual(lazyInspectedMap, expected);
|
|
24
24
|
});
|
|
25
25
|
});
|
|
26
|
+
describe("utils::memoryUsage", () => {
|
|
27
|
+
it("should report all memory fields", () => {
|
|
28
|
+
const usage = memoryUsage();
|
|
29
|
+
for (const field of ["rss=", "heap=", "external=", "arrayBuffers="]) {
|
|
30
|
+
assert.ok(usage.includes(field), `expected "${field}" in "${usage}"`);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("utils::memoryTracker", () => {
|
|
35
|
+
it("should not include a delta on the first call", () => {
|
|
36
|
+
const tracker = memoryTracker();
|
|
37
|
+
assert.ok(!tracker().includes("Δrss"));
|
|
38
|
+
});
|
|
39
|
+
it("should include a delta on subsequent calls", () => {
|
|
40
|
+
const tracker = memoryTracker();
|
|
41
|
+
tracker();
|
|
42
|
+
const second = tracker();
|
|
43
|
+
assert.ok(second.includes("Δrss="), `expected delta in "${second}"`);
|
|
44
|
+
assert.ok(second.includes("ΔarrayBuffers="), `expected delta in "${second}"`);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -15,7 +15,7 @@ export const DEFAULT_CONFIG = "default";
|
|
|
15
15
|
export const NODE_DEFAULTS = {
|
|
16
16
|
name: isBrowser() ? "browser" : os.hostname(),
|
|
17
17
|
config: [DEFAULT_CONFIG],
|
|
18
|
-
pvm: PvmBackend.
|
|
18
|
+
pvm: PvmBackend.BuiltIn,
|
|
19
19
|
};
|
|
20
20
|
/** Chain spec chooser. */
|
|
21
21
|
export var KnownChainSpec;
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"importer.d.ts","sourceRoot":"","sources":["../../../../../packages/workers/importer/importer.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { tryAsTimeSlot } from "#@typeberry/block";
|
|
|
2
2
|
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
|
-
import { measure, now, Result, resultToString } from "#@typeberry/utils";
|
|
5
|
+
import { measure, memoryTracker, now, Result, resultToString, } from "#@typeberry/utils";
|
|
6
6
|
import * as metrics from "./metrics.js";
|
|
7
7
|
export var ImporterErrorKind;
|
|
8
8
|
(function (ImporterErrorKind) {
|
|
@@ -19,6 +19,7 @@ export class Importer {
|
|
|
19
19
|
// Hash of the block that we have the posterior state for in `state`.
|
|
20
20
|
currentHash;
|
|
21
21
|
metrics;
|
|
22
|
+
memory = memoryTracker();
|
|
22
23
|
hasher;
|
|
23
24
|
logger;
|
|
24
25
|
blocks;
|
|
@@ -81,6 +82,9 @@ export class Importer {
|
|
|
81
82
|
const startTime = now();
|
|
82
83
|
const maybeBestHeader = await this.importBlockInternal(block);
|
|
83
84
|
const duration = now() - startTime;
|
|
85
|
+
if (timeSlot % 100 === 0) {
|
|
86
|
+
this.logger.info `📊 mem #${timeSlot}: ${this.memory()}`;
|
|
87
|
+
}
|
|
84
88
|
if (maybeBestHeader.isOk) {
|
|
85
89
|
const bestHeader = maybeBestHeader.ok;
|
|
86
90
|
this.logger.info `🧊 Best block: #${timeSlot} (${bestHeader.hash})`;
|