querysub 0.373.0 → 0.375.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -4
- package/src/-f-node-discovery/NodeDiscovery.ts +2 -2
- package/src/0-path-value-core/PathValueCommitter.ts +1 -1
- package/src/0-path-value-core/PathValueController.ts +2 -2
- package/src/0-path-value-core/archiveLocks/ArchiveLocks2.ts +12 -12
- package/src/0-path-value-core/auditLogs.ts +1 -1
- package/src/0-path-value-core/pathValueCore.ts +2 -2
- package/src/3-path-functions/PathFunctionRunner.ts +1 -1
- package/src/3-path-functions/PathFunctionRunnerMain.ts +1 -1
- package/src/4-dom/qreact.tsx +2 -2
- package/src/4-querysub/QuerysubController.ts +1 -1
- package/src/5-diagnostics/diskValueAudit.ts +1 -1
- package/src/deployManager/components/MachineDetailPage.tsx +2 -5
- package/src/deployManager/components/ServiceDetailPage.tsx +2 -5
- package/src/deployManager/machineApplyMainCode.ts +7 -0
- package/src/diagnostics/NodeViewer.tsx +4 -5
- package/src/diagnostics/logs/IndexedLogs/BufferIndexHelpers.ts +1 -1
- package/src/diagnostics/logs/IndexedLogs/IndexedLogs.ts +7 -7
- package/src/diagnostics/logs/IndexedLogs/LogViewer3.tsx +221 -220
- package/src/diagnostics/logs/IndexedLogs/LogViewerParams.ts +21 -0
- package/src/diagnostics/logs/IndexedLogs/bufferMatcher.ts +3 -3
- package/src/diagnostics/logs/diskLogger.ts +1 -39
- package/src/diagnostics/logs/diskShimConsoleLogs.ts +2 -0
- package/src/diagnostics/logs/errorNotifications2/errorNotifications2.ts +3 -0
- package/src/diagnostics/logs/injectFileLocationToConsole.ts +3 -0
- package/src/diagnostics/logs/lifeCycleAnalysis/lifeCycles.tsx +32 -22
- package/src/diagnostics/managementPages.tsx +0 -18
- package/src/diagnostics/watchdog.ts +1 -1
- package/src/user-implementation/userData.ts +3 -3
- package/test.ts +0 -5
- package/bin/error-email.js +0 -8
- package/bin/error-im.js +0 -8
- package/src/diagnostics/logs/FastArchiveAppendable.ts +0 -843
- package/src/diagnostics/logs/FastArchiveController.ts +0 -573
- package/src/diagnostics/logs/FastArchiveViewer.tsx +0 -1090
- package/src/diagnostics/logs/LogViewer2.tsx +0 -552
- package/src/diagnostics/logs/errorNotifications/ErrorDigestPage.tsx +0 -409
- package/src/diagnostics/logs/errorNotifications/ErrorNotificationController.ts +0 -756
- package/src/diagnostics/logs/errorNotifications/ErrorSuppressionUI.tsx +0 -280
- package/src/diagnostics/logs/errorNotifications/ErrorWarning.tsx +0 -254
- package/src/diagnostics/logs/errorNotifications/errorDigestEmail.tsx +0 -233
- package/src/diagnostics/logs/errorNotifications/errorDigestEntry.tsx +0 -14
- package/src/diagnostics/logs/errorNotifications/errorDigests.tsx +0 -292
- package/src/diagnostics/logs/errorNotifications/errorWatchEntry.tsx +0 -209
- package/src/diagnostics/logs/importLogsEntry.ts +0 -38
- package/src/diagnostics/logs/lifeCycleAnalysis/LifeCyclePages.tsx +0 -150
- package/src/diagnostics/logs/logViewerExtractField.ts +0 -36
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "querysub",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.375.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"note1": "note on node-forge fork, see https://github.com/digitalbazaar/forge/issues/744 for details",
|
|
@@ -34,9 +34,7 @@
|
|
|
34
34
|
"join": "./bin/join.js",
|
|
35
35
|
"join-public": "./bin/join-public.js",
|
|
36
36
|
"movelogs": "./bin/movelogs.js",
|
|
37
|
-
"addsuperuser": "./bin/addsuperuser.js"
|
|
38
|
-
"error-email": "./bin/error-email.js",
|
|
39
|
-
"error-im": "./bin/error-im.js"
|
|
37
|
+
"addsuperuser": "./bin/addsuperuser.js"
|
|
40
38
|
},
|
|
41
39
|
"dependencies": {
|
|
42
40
|
"@types/fs-ext": "^2.0.3",
|
|
@@ -185,7 +185,7 @@ function addNodeIdBase(nodeId: string) {
|
|
|
185
185
|
function setNodeIds(nodeIds: string[]) {
|
|
186
186
|
nodeIds = nodeIds.filter(x => x !== SPECIAL_NODE_ID_FOR_UNMOUNTED_NODE);
|
|
187
187
|
|
|
188
|
-
|
|
188
|
+
console.info("setNodeIds", { nodeIds });
|
|
189
189
|
// Also try all localhost ports, if we are developing and not in public mode
|
|
190
190
|
if (isNode() && !isPublic() && isDevDebugbreak()) {
|
|
191
191
|
let ports = new Set(nodeIds.map(nodeId => decodeNodeId(nodeId)?.port).filter(isDefined));
|
|
@@ -350,7 +350,7 @@ async function runHeartbeatAuditLoop() {
|
|
|
350
350
|
}
|
|
351
351
|
} else {
|
|
352
352
|
deadCount.delete(nodeId);
|
|
353
|
-
|
|
353
|
+
console.info("Read node heartbeat", { nodeId, lastTime });
|
|
354
354
|
}
|
|
355
355
|
}
|
|
356
356
|
if (pendingDeadCount) {
|
|
@@ -177,7 +177,7 @@ class PathValueCommitter {
|
|
|
177
177
|
markArrayAsSplitable(values);
|
|
178
178
|
const { Querysub } = await import("../4-querysub/Querysub");
|
|
179
179
|
let serializedValues = await pathValueSerializer.serialize(values, { compress: Querysub.COMPRESS_NETWORK });
|
|
180
|
-
|
|
180
|
+
console.info("Send PathValues to server", { valueCount: values.length, targetId: otherAuthority, });
|
|
181
181
|
let forwardPromise = PathValueController.nodes[otherAuthority].forwardWrites(
|
|
182
182
|
serializedValues,
|
|
183
183
|
undefined,
|
|
@@ -86,9 +86,9 @@ class PathValueControllerBase {
|
|
|
86
86
|
auditLog("RECEIVE VALUE", { path: value.path, time: value.time.time, sourceNodeId });
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
-
|
|
89
|
+
console.info("Received PathValues via forwardWrites", { valueCount: values.length, callerId, });
|
|
90
90
|
for (let value of values) {
|
|
91
|
-
|
|
91
|
+
console.info("Received PathValue for path", { path: value.path, time: value.time.time, callerId });
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
if (isCoreQuiet) {
|
|
@@ -309,7 +309,7 @@ class TransactionLocker {
|
|
|
309
309
|
}
|
|
310
310
|
public async createConfirm(key: string) {
|
|
311
311
|
let path = this.getConfirmKey(key);
|
|
312
|
-
|
|
312
|
+
console.info("Creating confirmation for ${key}");
|
|
313
313
|
await this.storage.setValue(path, Buffer.from(""));
|
|
314
314
|
return path;
|
|
315
315
|
}
|
|
@@ -362,7 +362,7 @@ class TransactionLocker {
|
|
|
362
362
|
delete: ellipsize(deletes.map(a => debugFileInfo(a.key)).join(","), 50),
|
|
363
363
|
});
|
|
364
364
|
|
|
365
|
-
|
|
365
|
+
console.info("Writing transaction", {
|
|
366
366
|
name,
|
|
367
367
|
ops: transaction.ops.length,
|
|
368
368
|
});
|
|
@@ -488,7 +488,7 @@ class TransactionLocker {
|
|
|
488
488
|
}
|
|
489
489
|
}
|
|
490
490
|
|
|
491
|
-
|
|
491
|
+
console.info("Read archive state", {
|
|
492
492
|
rawFilesCount: files.length,
|
|
493
493
|
confirmedCount: currentDataFiles.size,
|
|
494
494
|
rawFiles: files.map(a => a.file),
|
|
@@ -507,7 +507,7 @@ class TransactionLocker {
|
|
|
507
507
|
let result = await tryToRead();
|
|
508
508
|
if (result) {
|
|
509
509
|
let timeToRead = Date.now() - startTime;
|
|
510
|
-
|
|
510
|
+
console.info(`Read data state in ${formatTime(timeToRead)}`);
|
|
511
511
|
return result;
|
|
512
512
|
}
|
|
513
513
|
}
|
|
@@ -546,7 +546,7 @@ class TransactionLocker {
|
|
|
546
546
|
let rawLookup = new Set(Array.from(rawDataFiles).map(a => a.file));
|
|
547
547
|
// If any creates are not confirmed, it must not have been applied
|
|
548
548
|
if (transaction.ops.some(a => a.type === "create" && rawLookup.has(a.key) && !confirmedKeys.has(a.key))) {
|
|
549
|
-
|
|
549
|
+
console.info(`Transaction not applied (has pending confirmations of creates)`, {
|
|
550
550
|
keys: transaction.ops
|
|
551
551
|
.filter(a => a.type === "create" && rawLookup.has(a.key) && !confirmedKeys.has(a.key))
|
|
552
552
|
.map(a => a.key)
|
|
@@ -555,7 +555,7 @@ class TransactionLocker {
|
|
|
555
555
|
}
|
|
556
556
|
// If any deletes still exist, it must not have been applied
|
|
557
557
|
if (transaction.ops.some(a => a.type === "delete" && confirmedKeys.has(a.key))) {
|
|
558
|
-
|
|
558
|
+
console.info(`Transaction not applied (has pending deletes)`, {
|
|
559
559
|
keys: transaction.ops
|
|
560
560
|
.filter(a => a.type === "delete" && confirmedKeys.has(a.key))
|
|
561
561
|
.map(a => a.key)
|
|
@@ -568,7 +568,7 @@ class TransactionLocker {
|
|
|
568
568
|
let createCount = transaction.ops.filter(a => a.type === "create").length;
|
|
569
569
|
let deleteCount = transaction.ops.filter(a => a.type === "delete").length;
|
|
570
570
|
let lockedFiles = transaction.lockedFilesMustEqual?.length;
|
|
571
|
-
|
|
571
|
+
console.info(`Applying transaction with ${createCount} file creates and ${deleteCount} file deletes. ${lockedFiles !== undefined && `Lock state depends on ${lockedFiles} files` || ""}`, {
|
|
572
572
|
transactions: transaction.ops.map(x => JSON.stringify(x)),
|
|
573
573
|
});
|
|
574
574
|
logNodeStats(`archives|TΔ Apply`, formatNumber, 1);
|
|
@@ -594,7 +594,7 @@ class TransactionLocker {
|
|
|
594
594
|
};
|
|
595
595
|
await Promise.all(list(CONCURRENT_WRITE_COUNT).map(runThread));
|
|
596
596
|
|
|
597
|
-
|
|
597
|
+
console.info(`Applied transaction with ${createCount} file creates and file ${deleteCount} deletes. ${lockedFiles !== undefined && `Lock state depends on ${lockedFiles} files` || ""}`, {
|
|
598
598
|
transactions: transaction.ops.map(x => JSON.stringify(x)),
|
|
599
599
|
});
|
|
600
600
|
}
|
|
@@ -660,7 +660,7 @@ class TransactionLocker {
|
|
|
660
660
|
let threshold = activeT.createTime + this.storage.propagationTime;
|
|
661
661
|
if (Date.now() < threshold) {
|
|
662
662
|
let waitTime = threshold - Date.now();
|
|
663
|
-
|
|
663
|
+
console.info(`Waiting ${formatTime(waitTime)} for transaction ${activeT.seqNum} to settle.`);
|
|
664
664
|
await new Promise(resolve => setTimeout(resolve, waitTime));
|
|
665
665
|
return this.getFilesBase();
|
|
666
666
|
}
|
|
@@ -768,7 +768,7 @@ class TransactionLocker {
|
|
|
768
768
|
let dels = transaction.ops.filter(a => a.type === "delete").length;
|
|
769
769
|
let creates = transaction.ops.filter(a => a.type === "create").length;
|
|
770
770
|
let createBytes = transaction.ops.map(a => a.type === "create" && a.value?.length || 0).reduce((a, b) => a + b, 0);
|
|
771
|
-
|
|
771
|
+
console.info(`Starting transaction with ${creates} file creates and ${dels} file deletes, ${formatNumber(createBytes)}B`, {
|
|
772
772
|
createFilesNames: transaction.ops.filter(a => a.type === "create").map(a => a.key),
|
|
773
773
|
deleteFilesNames: transaction.ops.filter(a => a.type === "delete").map(a => a.key),
|
|
774
774
|
});
|
|
@@ -797,7 +797,7 @@ class TransactionLocker {
|
|
|
797
797
|
let beforeData = await this.getFilesBase();
|
|
798
798
|
if (!this.isTransactionValid(transaction, beforeData.dataFiles, beforeData.rawDataFiles)) {
|
|
799
799
|
logNodeStats(`archives|TΔ Rejected`, formatNumber, 1);
|
|
800
|
-
|
|
800
|
+
console.info(`Finished transaction with rejection, ${transaction.ops.length} ops`);
|
|
801
801
|
return "rejected";
|
|
802
802
|
}
|
|
803
803
|
|
|
@@ -806,7 +806,7 @@ class TransactionLocker {
|
|
|
806
806
|
let afterData = await this.getFilesBase();
|
|
807
807
|
if (this.wasTransactionApplied(transaction, afterData.dataFiles, afterData.rawDataFiles)) {
|
|
808
808
|
logNodeStats(`archives|TΔ Accepted`, formatNumber, 1);
|
|
809
|
-
|
|
809
|
+
console.info(`Finished transaction with ${transaction.ops.length} ops`);
|
|
810
810
|
return "accepted";
|
|
811
811
|
}
|
|
812
812
|
}
|
|
@@ -58,7 +58,7 @@ function debugLogBase(type: string, values: { [key: string]: unknown }) {
|
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
if (isDiskAudit()) {
|
|
61
|
-
|
|
61
|
+
console.info(type, values, { "diskAudit": true });
|
|
62
62
|
}
|
|
63
63
|
let newEntry: DebugLog = { type, time: Date.now(), values };
|
|
64
64
|
logHistory.push(newEntry);
|
|
@@ -1261,7 +1261,7 @@ class PathWatcher {
|
|
|
1261
1261
|
auditLog("new non-local WATCH PARENT", { path, watcher: config.callback });
|
|
1262
1262
|
}
|
|
1263
1263
|
}
|
|
1264
|
-
|
|
1264
|
+
console.info(`New PathValue watches`, {
|
|
1265
1265
|
newPathsWatched: newPathsWatched.size,
|
|
1266
1266
|
newParentsWatched: newParentsWatched.size,
|
|
1267
1267
|
});
|
|
@@ -1394,7 +1394,7 @@ class PathWatcher {
|
|
|
1394
1394
|
}
|
|
1395
1395
|
|
|
1396
1396
|
if (fullyUnwatched.paths.length > 0 || fullyUnwatched.parentPaths.length > 0) {
|
|
1397
|
-
|
|
1397
|
+
console.info(`Unwatched PathValue watches`, {
|
|
1398
1398
|
unwatchedPaths: fullyUnwatched.paths.length,
|
|
1399
1399
|
unwatchedParents: fullyUnwatched.parentPaths.length,
|
|
1400
1400
|
});
|
|
@@ -689,7 +689,7 @@ export class PathFunctionRunner {
|
|
|
689
689
|
let syncTime = wallTime - evalTime;
|
|
690
690
|
|
|
691
691
|
|
|
692
|
-
|
|
692
|
+
console.info("Finished FunctionRunner function", {
|
|
693
693
|
...callPath, argsEncoded: "", functionSpec,
|
|
694
694
|
wallTime, syncTime, evalTime,
|
|
695
695
|
loops: runCount,
|
|
@@ -41,7 +41,7 @@ async function main() {
|
|
|
41
41
|
await Querysub.hostService("PathFunctionRunnerMain");
|
|
42
42
|
|
|
43
43
|
if (!isPublic()) {
|
|
44
|
-
IndexedLogs.runLogMoveLoop();
|
|
44
|
+
void IndexedLogs.runLogMoveLoop();
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// Use a fairly high stick time (the default is 10s), because having wait to sync data is very slow,
|
package/src/4-dom/qreact.tsx
CHANGED
|
@@ -2119,7 +2119,7 @@ function updateDOMNodeFields(domNode: DOMNode, vNode: VirtualDOM, prevVNode: Vir
|
|
|
2119
2119
|
if (name === "blur") {
|
|
2120
2120
|
let target = args[0].currentTarget as HTMLElement;
|
|
2121
2121
|
if (!target.getAttribute("data-blur-on-unmount") && !target.isConnected) {
|
|
2122
|
-
|
|
2122
|
+
console.info("Ignoring blur for disconnected element. You can use data-blur-on-unmount to re-enable blurs on this element.", target);
|
|
2123
2123
|
return;
|
|
2124
2124
|
}
|
|
2125
2125
|
}
|
|
@@ -2428,7 +2428,7 @@ function blurFixOnMouseDownHack(event: MouseEvent) {
|
|
|
2428
2428
|
|
|
2429
2429
|
// Looks like we are going to blur, so blur now
|
|
2430
2430
|
if (selected instanceof HTMLElement && !selected.hasAttribute("data-no-early-blur")) {
|
|
2431
|
-
|
|
2431
|
+
console.info(`Simulating early blur to prevent blur from firing after mousedown. This solves a problem where mousedown changes the UI, and then the blur fires on the wrong element. You can use data-no-early-blur to opt-out of this feature`, selected);
|
|
2432
2432
|
selected.blur();
|
|
2433
2433
|
}
|
|
2434
2434
|
}
|
|
@@ -480,7 +480,7 @@ export class QuerysubControllerBase {
|
|
|
480
480
|
// make the UI look cleaner (instead of showing stale values, it shows nothing)?
|
|
481
481
|
let undefinedValues: PathValue[] = newPathsNotAllowed.map(path => ({ path, value: undefined, canGCValue: true, isTransparent: true, time: epochTime, locks: [], lockCount: 0, valid: true, event: false }));
|
|
482
482
|
|
|
483
|
-
|
|
483
|
+
console.info("Disallowing PathValue watches due to disallowed permissions", { count: newPathsNotAllowed.length, callerId });
|
|
484
484
|
|
|
485
485
|
ignoreErrors(pathValueSerializer.serialize(undefinedValues, { compress: Querysub.COMPRESS_NETWORK }).then(buffers =>
|
|
486
486
|
PathValueController.nodes[callerId].forwardWrites(
|
|
@@ -188,7 +188,7 @@ async function checkAuthority(authority: AuthorityPath, threshold: number) {
|
|
|
188
188
|
console.error(`Value mismatch between disk and memory for ${formatNumber(changedValues.size)} values. Ex: ${firstValue.path}`);
|
|
189
189
|
}
|
|
190
190
|
if (removedValues.size > 0) {
|
|
191
|
-
|
|
191
|
+
console.info(green(`Removing ${formatNumber(removedValues.size)} paths from memory which have been GCed on the disk.`));
|
|
192
192
|
}
|
|
193
193
|
if (changedValues.size > 0 || removedValues.size > 0) {
|
|
194
194
|
let allValues = new Set([...changedValues, ...removedValues]);
|
|
@@ -7,10 +7,10 @@ import { formatNumber, formatVeryNiceDateTime } from "socket-function/src/format
|
|
|
7
7
|
import { sort } from "socket-function/src/misc";
|
|
8
8
|
import { ATag, Anchor } from "../../library-components/ATag";
|
|
9
9
|
import { ShowMore } from "../../library-components/ShowMore";
|
|
10
|
-
import { filterParam } from "../../diagnostics/logs/FastArchiveViewer";
|
|
11
10
|
import { managementPageURL } from "../../diagnostics/managementPages";
|
|
12
11
|
import { t } from "../../2-proxy/schema2";
|
|
13
12
|
import { Querysub } from "../../4-querysub/QuerysubController";
|
|
13
|
+
import { getLogViewerParams } from "../../diagnostics/logs/IndexedLogs/LogViewerParams";
|
|
14
14
|
|
|
15
15
|
export class MachineDetailPage extends qreact.Component {
|
|
16
16
|
render() {
|
|
@@ -105,10 +105,7 @@ export class MachineDetailPage extends qreact.Component {
|
|
|
105
105
|
<div>
|
|
106
106
|
Apply Node ID: {machine.applyNodeId}
|
|
107
107
|
</div>
|
|
108
|
-
<ATag values={
|
|
109
|
-
managementPageURL.getOverride("LogViewer2"),
|
|
110
|
-
filterParam.getOverride(`__machineId = ${machineInfo.machineId}`),
|
|
111
|
-
]}>
|
|
108
|
+
<ATag values={getLogViewerParams({ __machineId: machineInfo.machineId })}>
|
|
112
109
|
Machine Logs
|
|
113
110
|
</ATag>
|
|
114
111
|
</div>
|
|
@@ -20,8 +20,8 @@ import { PrimitiveDisplay } from "../../diagnostics/logs/ObjectDisplay";
|
|
|
20
20
|
import { parseAnsiColors, rgbToHsl } from "../../diagnostics/logs/ansiFormat";
|
|
21
21
|
import { RenderGitRefInfo, UpdateServiceButtons, bigEmoji, buttonStyle } from "./deployButtons";
|
|
22
22
|
import { TypedConfigEditor } from "../../library-components/TypedConfigEditor";
|
|
23
|
-
import { filterParam } from "../../diagnostics/logs/FastArchiveViewer";
|
|
24
23
|
import { managementPageURL } from "../../diagnostics/managementPages";
|
|
24
|
+
import { getLogViewerParams } from "../../diagnostics/logs/IndexedLogs/LogViewerParams";
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
@@ -401,10 +401,7 @@ export class ServiceDetailPage extends qreact.Component {
|
|
|
401
401
|
{isWatching ? "Stop Watching Output" : "Watch Screen Output"}
|
|
402
402
|
</div>
|
|
403
403
|
|
|
404
|
-
<ATag values={
|
|
405
|
-
managementPageURL.getOverride("LogViewer2"),
|
|
406
|
-
filterParam.getOverride(`__machineId = ${machineId}`),
|
|
407
|
-
]}>
|
|
404
|
+
<ATag values={getLogViewerParams({ __machineId: machineId })}>
|
|
408
405
|
Machine Logs
|
|
409
406
|
</ATag>
|
|
410
407
|
</div>
|
|
@@ -866,6 +866,13 @@ export async function machineApplyMain() {
|
|
|
866
866
|
if (await quickIsOutdated()) {
|
|
867
867
|
console.log(magenta("Likely outdated, resyncing now"));
|
|
868
868
|
await resyncServices();
|
|
869
|
+
} else {
|
|
870
|
+
let config = await machineInfos.get(getOwnMachineId());
|
|
871
|
+
if (config) {
|
|
872
|
+
config.heartbeat = Date.now();
|
|
873
|
+
console.log(magenta(`Updating heartbeat for ${getOwnMachineId()} to ${config.heartbeat}`));
|
|
874
|
+
await machineInfos.set(getOwnMachineId(), config);
|
|
875
|
+
}
|
|
869
876
|
}
|
|
870
877
|
});
|
|
871
878
|
|
|
@@ -36,8 +36,8 @@ import { SocketRegistered } from "socket-function/SocketFunctionTypes";
|
|
|
36
36
|
import { ATag } from "../library-components/ATag";
|
|
37
37
|
import { getSyncedController } from "../library-components/SyncedController";
|
|
38
38
|
import child_process from "child_process";
|
|
39
|
-
import { filterParam } from "./logs/FastArchiveViewer";
|
|
40
39
|
import { getHTTPSKeyCert } from "../-e-certs/certAuthority";
|
|
40
|
+
import { getLogViewerParams } from "./logs/IndexedLogs/LogViewerParams";
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
type NodeData = {
|
|
@@ -296,10 +296,9 @@ export class NodeViewer extends qreact.Component {
|
|
|
296
296
|
if (str.startsWith("http")) return formatValue(obj);
|
|
297
297
|
|
|
298
298
|
return (
|
|
299
|
-
<ATag values={
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
]}>
|
|
299
|
+
<ATag values={getLogViewerParams({
|
|
300
|
+
__nodeId: str,
|
|
301
|
+
})}>
|
|
303
302
|
Logs
|
|
304
303
|
</ATag>
|
|
305
304
|
);
|
|
@@ -272,10 +272,10 @@ export class IndexedLogs<T> {
|
|
|
272
272
|
startTime: number;
|
|
273
273
|
endTime: number;
|
|
274
274
|
only?: "local" | "public";
|
|
275
|
-
|
|
275
|
+
forceReadProduction?: boolean;
|
|
276
276
|
}): Promise<TimeFilePathWithSize[]> {
|
|
277
277
|
let finalPaths: TimeFilePathWithSize[] = [];
|
|
278
|
-
if (config.
|
|
278
|
+
if (config.forceReadProduction && !isPublic()) {
|
|
279
279
|
let machineNodes = await this.getMachineNodes();
|
|
280
280
|
if (machineNodes.length === 0) throw new Error(`Cannot find any public nodes to read from`);
|
|
281
281
|
return await IndexedLogShimController.nodes[machineNodes[0]].getPaths({
|
|
@@ -352,7 +352,7 @@ export class IndexedLogs<T> {
|
|
|
352
352
|
onResults?: (results: IndexedLogResults) => Promise<boolean>;
|
|
353
353
|
}): Promise<IndexedLogResults> {
|
|
354
354
|
|
|
355
|
-
if (config.params.
|
|
355
|
+
if (config.params.forceReadProduction && !isPublic()) {
|
|
356
356
|
let machineNodes = await this.getMachineNodes();
|
|
357
357
|
if (machineNodes.length === 0) throw new Error(`Cannot find any public nodes to read from`);
|
|
358
358
|
return await this.clientFind({
|
|
@@ -649,7 +649,7 @@ export class IndexedLogs<T> {
|
|
|
649
649
|
startTime: number;
|
|
650
650
|
endTime: number;
|
|
651
651
|
only?: "local" | "public";
|
|
652
|
-
|
|
652
|
+
forceReadProduction?: boolean;
|
|
653
653
|
|
|
654
654
|
}): Promise<TimeFilePathWithSize[]> {
|
|
655
655
|
let controller = IndexedLogShimController.nodes[SocketFunction.getBrowserNodeId()];
|
|
@@ -658,7 +658,7 @@ export class IndexedLogs<T> {
|
|
|
658
658
|
startTime: config.startTime,
|
|
659
659
|
endTime: config.endTime,
|
|
660
660
|
only: config.only,
|
|
661
|
-
|
|
661
|
+
forceReadProduction: config.forceReadProduction,
|
|
662
662
|
});
|
|
663
663
|
}
|
|
664
664
|
public onFindResult(config: {
|
|
@@ -778,7 +778,7 @@ class IndexedLogShim {
|
|
|
778
778
|
startTime: number;
|
|
779
779
|
endTime: number;
|
|
780
780
|
only?: "local" | "public";
|
|
781
|
-
|
|
781
|
+
forceReadProduction?: boolean;
|
|
782
782
|
}): Promise<TimeFilePathWithSize[]> {
|
|
783
783
|
let indexedLogs = loggerByName.get(config.indexedLogsName);
|
|
784
784
|
if (!indexedLogs) throw new Error(`Indexed logs ${config.indexedLogsName} not found`);
|
|
@@ -786,7 +786,7 @@ class IndexedLogShim {
|
|
|
786
786
|
startTime: config.startTime,
|
|
787
787
|
endTime: config.endTime,
|
|
788
788
|
only: config.only,
|
|
789
|
-
|
|
789
|
+
forceReadProduction: config.forceReadProduction,
|
|
790
790
|
});
|
|
791
791
|
}
|
|
792
792
|
|