@fluidframework/container-runtime 2.0.0-dev-rc.5.0.0.271262 → 2.0.0-dev-rc.5.0.0.272251
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/api-extractor/api-extractor-lint-bundle.json +5 -0
- package/api-extractor/api-extractor-lint-legacy.cjs.json +5 -0
- package/api-extractor/api-extractor-lint-legacy.esm.json +5 -0
- package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
- package/api-extractor/api-extractor-lint-public.esm.json +5 -0
- package/api-report/container-runtime.alpha.api.md +1 -1
- package/container-runtime.test-files.tar +0 -0
- package/dist/batchTracker.js +1 -5
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.js +14 -39
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +12 -2
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +95 -110
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.js +14 -32
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.js +0 -4
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +2 -1
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +51 -142
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +1 -9
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +2 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +102 -143
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.js +28 -29
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.js +0 -1
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerProxies.js +28 -33
- package/dist/deltaManagerProxies.js.map +1 -1
- package/dist/deltaScheduler.js +9 -13
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.js +1 -2
- package/dist/error.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +4 -2
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +25 -43
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +7 -4
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +14 -19
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +5 -17
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +1 -12
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/opLifecycle/batchManager.js +3 -5
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/opCompressor.js +0 -1
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +4 -6
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +1 -3
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.js +0 -6
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.js +10 -15
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +0 -3
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.js +14 -20
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.js +4 -15
- package/dist/scheduleManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js +0 -1
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.js +1 -17
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/orderedClientElection.js +11 -19
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +2 -4
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.js +38 -56
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.js +8 -17
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.js +7 -18
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +25 -30
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +3 -12
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +0 -2
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +6 -20
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summaryCollection.js +11 -23
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryGenerator.js +5 -12
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.js +48 -58
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/throttler.js +1 -4
- package/dist/throttler.js.map +1 -1
- package/lib/batchTracker.js +1 -5
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.js +14 -39
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +12 -2
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +95 -110
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.js +14 -32
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.js +0 -4
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +2 -1
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +52 -143
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +1 -9
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +2 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +102 -143
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.js +28 -29
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.js +0 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerProxies.js +28 -33
- package/lib/deltaManagerProxies.js.map +1 -1
- package/lib/deltaScheduler.js +9 -13
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.js +1 -2
- package/lib/error.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +4 -2
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +25 -43
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +7 -4
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +14 -19
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +5 -17
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +1 -12
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/opLifecycle/batchManager.js +3 -5
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/opCompressor.js +0 -1
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +4 -6
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +1 -3
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.js +0 -6
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.js +10 -15
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +0 -3
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.js +14 -20
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.js +4 -15
- package/lib/scheduleManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js +0 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.js +1 -17
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/orderedClientElection.js +11 -19
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +2 -4
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.js +38 -56
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.js +8 -17
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.js +7 -18
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +25 -30
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +3 -12
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +0 -2
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +6 -20
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summaryCollection.js +11 -23
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryGenerator.js +5 -12
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.js +48 -58
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/throttler.js +1 -4
- package/lib/throttler.js.map +1 -1
- package/package.json +27 -18
- package/src/channelCollection.ts +133 -123
- package/src/containerRuntime.ts +31 -4
- package/src/dataStoreContext.ts +3 -2
- package/src/gc/garbageCollection.ts +24 -7
- package/src/gc/gcDefinitions.ts +16 -4
- package/src/gc/gcTelemetry.ts +1 -7
- package/src/packageVersion.ts +1 -1
- package/tsdoc.json +4 -0
|
@@ -11,7 +11,6 @@ import { summarizerClientType } from "./summary/index.js";
|
|
|
11
11
|
* of the DeltaManager.
|
|
12
12
|
*/
|
|
13
13
|
export class BaseDeltaManagerProxy extends TypedEventEmitter {
|
|
14
|
-
deltaManager;
|
|
15
14
|
get IDeltaSender() {
|
|
16
15
|
return this;
|
|
17
16
|
}
|
|
@@ -63,6 +62,27 @@ export class BaseDeltaManagerProxy extends TypedEventEmitter {
|
|
|
63
62
|
constructor(deltaManager) {
|
|
64
63
|
super();
|
|
65
64
|
this.deltaManager = deltaManager;
|
|
65
|
+
this.onPrepareSend = (messageBuffer) => {
|
|
66
|
+
this.emit("prepareSend", messageBuffer);
|
|
67
|
+
};
|
|
68
|
+
this.onSubmitOp = (message) => {
|
|
69
|
+
this.emit("submitOp", message);
|
|
70
|
+
};
|
|
71
|
+
this.onOp = (message, processingTime) => {
|
|
72
|
+
this.emit("op", message, processingTime);
|
|
73
|
+
};
|
|
74
|
+
this.onPong = (latency) => {
|
|
75
|
+
this.emit("pong", latency);
|
|
76
|
+
};
|
|
77
|
+
this.onConnect = (details, opsBehind) => {
|
|
78
|
+
this.emit("connect", details, opsBehind);
|
|
79
|
+
};
|
|
80
|
+
this.onDisconnect = (reason, error) => {
|
|
81
|
+
this.emit("disconnect", reason, error);
|
|
82
|
+
};
|
|
83
|
+
this.onReadonly = (readonly, readonlyConnectionReason) => {
|
|
84
|
+
this.emit("readonly", readonly, readonlyConnectionReason);
|
|
85
|
+
};
|
|
66
86
|
// We are expecting this class to have many listeners, so we suppress noisy "MaxListenersExceededWarning" logging.
|
|
67
87
|
super.setMaxListeners(0);
|
|
68
88
|
this.deltaManager.on("prepareSend", this.onPrepareSend);
|
|
@@ -88,27 +108,6 @@ export class BaseDeltaManagerProxy extends TypedEventEmitter {
|
|
|
88
108
|
flush() {
|
|
89
109
|
return this.deltaManager.flush();
|
|
90
110
|
}
|
|
91
|
-
onPrepareSend = (messageBuffer) => {
|
|
92
|
-
this.emit("prepareSend", messageBuffer);
|
|
93
|
-
};
|
|
94
|
-
onSubmitOp = (message) => {
|
|
95
|
-
this.emit("submitOp", message);
|
|
96
|
-
};
|
|
97
|
-
onOp = (message, processingTime) => {
|
|
98
|
-
this.emit("op", message, processingTime);
|
|
99
|
-
};
|
|
100
|
-
onPong = (latency) => {
|
|
101
|
-
this.emit("pong", latency);
|
|
102
|
-
};
|
|
103
|
-
onConnect = (details, opsBehind) => {
|
|
104
|
-
this.emit("connect", details, opsBehind);
|
|
105
|
-
};
|
|
106
|
-
onDisconnect = (reason, error) => {
|
|
107
|
-
this.emit("disconnect", reason, error);
|
|
108
|
-
};
|
|
109
|
-
onReadonly = (readonly, readonlyConnectionReason) => {
|
|
110
|
-
this.emit("readonly", readonly, readonlyConnectionReason);
|
|
111
|
-
};
|
|
112
111
|
}
|
|
113
112
|
/**
|
|
114
113
|
* Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:
|
|
@@ -116,7 +115,6 @@ export class BaseDeltaManagerProxy extends TypedEventEmitter {
|
|
|
116
115
|
* - Summarizer client should not be active to layers below the container runtime to restrict local changes.
|
|
117
116
|
*/
|
|
118
117
|
export class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {
|
|
119
|
-
deltaManager;
|
|
120
118
|
get active() {
|
|
121
119
|
// Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer
|
|
122
120
|
// except for the SummarizeOp which is generated by the runtime.
|
|
@@ -135,7 +133,6 @@ export class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {
|
|
|
135
133
|
}
|
|
136
134
|
return this.deltaManager.readOnlyInfo;
|
|
137
135
|
}
|
|
138
|
-
isSummarizerClient;
|
|
139
136
|
constructor(deltaManager) {
|
|
140
137
|
super(deltaManager);
|
|
141
138
|
this.deltaManager = deltaManager;
|
|
@@ -143,8 +140,6 @@ export class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {
|
|
|
143
140
|
}
|
|
144
141
|
}
|
|
145
142
|
export class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {
|
|
146
|
-
deltaManager;
|
|
147
|
-
pendingStateManager;
|
|
148
143
|
get minimumSequenceNumber() {
|
|
149
144
|
const minPendingSeqNum = this.pendingStateManager.minimumPendingMessageSequenceNumber;
|
|
150
145
|
// There is a chance that minPendingSeqNum is greater than minimum sequence number.
|
|
@@ -166,17 +161,17 @@ export class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {
|
|
|
166
161
|
minimumSequenceNumber: this.minimumSequenceNumber,
|
|
167
162
|
};
|
|
168
163
|
}
|
|
169
|
-
onOp = (message, processingTime) => {
|
|
170
|
-
const messageIntercept = {
|
|
171
|
-
...message,
|
|
172
|
-
minimumSequenceNumber: this.minimumSequenceNumber,
|
|
173
|
-
};
|
|
174
|
-
this.emit("op", messageIntercept, processingTime);
|
|
175
|
-
};
|
|
176
164
|
constructor(deltaManager, pendingStateManager) {
|
|
177
165
|
super(deltaManager);
|
|
178
166
|
this.deltaManager = deltaManager;
|
|
179
167
|
this.pendingStateManager = pendingStateManager;
|
|
168
|
+
this.onOp = (message, processingTime) => {
|
|
169
|
+
const messageIntercept = {
|
|
170
|
+
...message,
|
|
171
|
+
minimumSequenceNumber: this.minimumSequenceNumber,
|
|
172
|
+
};
|
|
173
|
+
this.emit("op", messageIntercept, processingTime);
|
|
174
|
+
};
|
|
180
175
|
}
|
|
181
176
|
}
|
|
182
177
|
//# sourceMappingURL=deltaManagerProxies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deltaManagerProxies.js","sourceRoot":"","sources":["../src/deltaManagerProxies.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type {\n\tIConnectionDetails,\n\tIDeltaManager,\n\tIDeltaManagerEvents,\n\tIDeltaQueue,\n\tIDeltaSender,\n\tReadOnlyInfo,\n} from \"@fluidframework/container-definitions/internal\";\nimport type { IErrorBase } from \"@fluidframework/core-interfaces\";\nimport { IClientDetails } from \"@fluidframework/driver-definitions\";\nimport type { IAnyDriverError } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tIClientConfiguration,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n} from \"@fluidframework/driver-definitions/internal\";\n\nimport type { PendingStateManager } from \"./pendingStateManager.js\";\nimport { summarizerClientType } from \"./summary/index.js\";\n\n/**\n * Base class for DeltaManager proxy that proxy's access to the real DeltaManager.\n *\n * This class allows us to build proxy functionality without actually having to implement all the methods\n * of the DeltaManager.\n */\nexport abstract class BaseDeltaManagerProxy\n\textends TypedEventEmitter<IDeltaManagerEvents>\n\timplements IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>\n{\n\tpublic get IDeltaSender(): IDeltaSender {\n\t\treturn this;\n\t}\n\n\tpublic get inbound(): IDeltaQueue<ISequencedDocumentMessage> {\n\t\treturn this.deltaManager.inbound;\n\t}\n\n\tpublic get outbound(): IDeltaQueue<IDocumentMessage[]> {\n\t\treturn this.deltaManager.outbound;\n\t}\n\n\tpublic get inboundSignal(): IDeltaQueue<ISignalMessage> {\n\t\treturn this.deltaManager.inboundSignal;\n\t}\n\n\tpublic get minimumSequenceNumber(): number {\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastSequenceNumber(): number {\n\t\treturn this.deltaManager.lastSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\treturn this.deltaManager.lastMessage;\n\t}\n\n\tpublic get lastKnownSeqNumber() {\n\t\treturn this.deltaManager.lastKnownSeqNumber;\n\t}\n\n\tpublic get initialSequenceNumber(): number {\n\t\treturn this.deltaManager.initialSequenceNumber;\n\t}\n\n\tpublic get hasCheckpointSequenceNumber() {\n\t\treturn this.deltaManager.hasCheckpointSequenceNumber;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.deltaManager.clientDetails;\n\t}\n\n\tpublic get version(): string {\n\t\treturn this.deltaManager.version;\n\t}\n\n\tpublic get maxMessageSize(): number {\n\t\treturn this.deltaManager.maxMessageSize;\n\t}\n\n\tpublic get serviceConfiguration(): IClientConfiguration | undefined {\n\t\treturn this.deltaManager.serviceConfiguration;\n\t}\n\n\tpublic get active(): boolean {\n\t\treturn this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper();\n\n\t\t// We are expecting this class to have many listeners, so we suppress noisy \"MaxListenersExceededWarning\" logging.\n\t\tsuper.setMaxListeners(0);\n\n\t\tthis.deltaManager.on(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.on(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.on(\"op\", this.onOp);\n\t\tthis.deltaManager.on(\"pong\", this.onPong);\n\t\tthis.deltaManager.on(\"connect\", this.onConnect);\n\t\tthis.deltaManager.on(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.on(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.deltaManager.off(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.off(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.off(\"op\", this.onOp);\n\t\tthis.deltaManager.off(\"pong\", this.onPong);\n\t\tthis.deltaManager.off(\"connect\", this.onConnect);\n\t\tthis.deltaManager.off(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.off(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic submitSignal(content: string, targetClientId?: string): void {\n\t\treturn this.deltaManager.submitSignal(content, targetClientId);\n\t}\n\n\tpublic flush(): void {\n\t\treturn this.deltaManager.flush();\n\t}\n\n\tprivate readonly onPrepareSend = (messageBuffer: any[]): void => {\n\t\tthis.emit(\"prepareSend\", messageBuffer);\n\t};\n\tprivate readonly onSubmitOp = (message: IDocumentMessage): void => {\n\t\tthis.emit(\"submitOp\", message);\n\t};\n\tprotected readonly onOp = (\n\t\tmessage: ISequencedDocumentMessage,\n\t\tprocessingTime: number,\n\t): void => {\n\t\tthis.emit(\"op\", message, processingTime);\n\t};\n\tprivate readonly onPong = (latency: number): void => {\n\t\tthis.emit(\"pong\", latency);\n\t};\n\tprivate readonly onConnect = (details: IConnectionDetails, opsBehind?: number): void => {\n\t\tthis.emit(\"connect\", details, opsBehind);\n\t};\n\tprivate readonly onDisconnect = (reason: string, error?: IAnyDriverError): void => {\n\t\tthis.emit(\"disconnect\", reason, error);\n\t};\n\tprivate readonly onReadonly = (\n\t\treadonly: boolean,\n\t\treadonlyConnectionReason?: { reason: string; error?: IErrorBase },\n\t): void => {\n\t\tthis.emit(\"readonly\", readonly, readonlyConnectionReason);\n\t};\n}\n\n/**\n * Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:\n * - Summarizer client should be read-only to layers below the container runtime to restrict local changes.\n * - Summarizer client should not be active to layers below the container runtime to restrict local changes.\n */\nexport class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {\n\tpublic get active(): boolean {\n\t\t// Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer\n\t\t// except for the SummarizeOp which is generated by the runtime.\n\t\treturn !this.isSummarizerClient && this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\t// Summarizer clients should be read-only as far as the runtime and layers below are concerned. There shouldn't\n\t\t// be any local changes (writes) in the summarizer except for the summarize op which is generated by the runtime.\n\t\tif (this.isSummarizerClient) {\n\t\t\treturn {\n\t\t\t\treadonly: true,\n\t\t\t\tforced: false,\n\t\t\t\tpermissions: undefined,\n\t\t\t\tstorageOnly: false,\n\t\t\t};\n\t\t}\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tprivate readonly isSummarizerClient: boolean;\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper(deltaManager);\n\t\tthis.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;\n\t}\n}\n\nexport class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {\n\tpublic get minimumSequenceNumber(): number {\n\t\tconst minPendingSeqNum = this.pendingStateManager.minimumPendingMessageSequenceNumber;\n\t\t// There is a chance that minPendingSeqNum is greater than minimum sequence number.\n\t\t// minPendingSeqNum is based on the pending ops, so it's based on ref seq number.\n\t\t// Imagine an op has just be sent while there's another client that has been lagging behind,\n\t\t// it will likely have a ref seq number greater than the minimum seq number.\n\t\tif (\n\t\t\tminPendingSeqNum !== undefined &&\n\t\t\tminPendingSeqNum < this.deltaManager.minimumSequenceNumber\n\t\t) {\n\t\t\treturn minPendingSeqNum;\n\t\t}\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\tif (this.deltaManager.lastMessage === undefined) {\n\t\t\treturn this.deltaManager.lastMessage;\n\t\t}\n\t\treturn {\n\t\t\t...this.deltaManager.lastMessage,\n\t\t\tminimumSequenceNumber: this.minimumSequenceNumber,\n\t\t};\n\t}\n\n\tprotected readonly onOp = (\n\t\tmessage: ISequencedDocumentMessage,\n\t\tprocessingTime: number,\n\t): void => {\n\t\tconst messageIntercept = {\n\t\t\t...message,\n\t\t\tminimumSequenceNumber: this.minimumSequenceNumber,\n\t\t};\n\t\tthis.emit(\"op\", messageIntercept, processingTime);\n\t};\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly pendingStateManager: Pick<\n\t\t\tPendingStateManager,\n\t\t\t\"minimumPendingMessageSequenceNumber\"\n\t\t>,\n\t) {\n\t\tsuper(deltaManager);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"deltaManagerProxies.js","sourceRoot":"","sources":["../src/deltaManagerProxies.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type {\n\tIConnectionDetails,\n\tIDeltaManager,\n\tIDeltaManagerEvents,\n\tIDeltaQueue,\n\tIDeltaSender,\n\tReadOnlyInfo,\n} from \"@fluidframework/container-definitions/internal\";\nimport type { IErrorBase } from \"@fluidframework/core-interfaces\";\nimport { IClientDetails } from \"@fluidframework/driver-definitions\";\nimport type { IAnyDriverError } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tIClientConfiguration,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n} from \"@fluidframework/driver-definitions/internal\";\n\nimport type { PendingStateManager } from \"./pendingStateManager.js\";\nimport { summarizerClientType } from \"./summary/index.js\";\n\n/**\n * Base class for DeltaManager proxy that proxy's access to the real DeltaManager.\n *\n * This class allows us to build proxy functionality without actually having to implement all the methods\n * of the DeltaManager.\n */\nexport abstract class BaseDeltaManagerProxy\n\textends TypedEventEmitter<IDeltaManagerEvents>\n\timplements IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>\n{\n\tpublic get IDeltaSender(): IDeltaSender {\n\t\treturn this;\n\t}\n\n\tpublic get inbound(): IDeltaQueue<ISequencedDocumentMessage> {\n\t\treturn this.deltaManager.inbound;\n\t}\n\n\tpublic get outbound(): IDeltaQueue<IDocumentMessage[]> {\n\t\treturn this.deltaManager.outbound;\n\t}\n\n\tpublic get inboundSignal(): IDeltaQueue<ISignalMessage> {\n\t\treturn this.deltaManager.inboundSignal;\n\t}\n\n\tpublic get minimumSequenceNumber(): number {\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastSequenceNumber(): number {\n\t\treturn this.deltaManager.lastSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\treturn this.deltaManager.lastMessage;\n\t}\n\n\tpublic get lastKnownSeqNumber() {\n\t\treturn this.deltaManager.lastKnownSeqNumber;\n\t}\n\n\tpublic get initialSequenceNumber(): number {\n\t\treturn this.deltaManager.initialSequenceNumber;\n\t}\n\n\tpublic get hasCheckpointSequenceNumber() {\n\t\treturn this.deltaManager.hasCheckpointSequenceNumber;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.deltaManager.clientDetails;\n\t}\n\n\tpublic get version(): string {\n\t\treturn this.deltaManager.version;\n\t}\n\n\tpublic get maxMessageSize(): number {\n\t\treturn this.deltaManager.maxMessageSize;\n\t}\n\n\tpublic get serviceConfiguration(): IClientConfiguration | undefined {\n\t\treturn this.deltaManager.serviceConfiguration;\n\t}\n\n\tpublic get active(): boolean {\n\t\treturn this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper();\n\n\t\t// We are expecting this class to have many listeners, so we suppress noisy \"MaxListenersExceededWarning\" logging.\n\t\tsuper.setMaxListeners(0);\n\n\t\tthis.deltaManager.on(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.on(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.on(\"op\", this.onOp);\n\t\tthis.deltaManager.on(\"pong\", this.onPong);\n\t\tthis.deltaManager.on(\"connect\", this.onConnect);\n\t\tthis.deltaManager.on(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.on(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.deltaManager.off(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.off(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.off(\"op\", this.onOp);\n\t\tthis.deltaManager.off(\"pong\", this.onPong);\n\t\tthis.deltaManager.off(\"connect\", this.onConnect);\n\t\tthis.deltaManager.off(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.off(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic submitSignal(content: string, targetClientId?: string): void {\n\t\treturn this.deltaManager.submitSignal(content, targetClientId);\n\t}\n\n\tpublic flush(): void {\n\t\treturn this.deltaManager.flush();\n\t}\n\n\tprivate readonly onPrepareSend = (messageBuffer: any[]): void => {\n\t\tthis.emit(\"prepareSend\", messageBuffer);\n\t};\n\tprivate readonly onSubmitOp = (message: IDocumentMessage): void => {\n\t\tthis.emit(\"submitOp\", message);\n\t};\n\tprotected readonly onOp = (\n\t\tmessage: ISequencedDocumentMessage,\n\t\tprocessingTime: number,\n\t): void => {\n\t\tthis.emit(\"op\", message, processingTime);\n\t};\n\tprivate readonly onPong = (latency: number): void => {\n\t\tthis.emit(\"pong\", latency);\n\t};\n\tprivate readonly onConnect = (details: IConnectionDetails, opsBehind?: number): void => {\n\t\tthis.emit(\"connect\", details, opsBehind);\n\t};\n\tprivate readonly onDisconnect = (reason: string, error?: IAnyDriverError): void => {\n\t\tthis.emit(\"disconnect\", reason, error);\n\t};\n\tprivate readonly onReadonly = (\n\t\treadonly: boolean,\n\t\treadonlyConnectionReason?: { reason: string; error?: IErrorBase },\n\t): void => {\n\t\tthis.emit(\"readonly\", readonly, readonlyConnectionReason);\n\t};\n}\n\n/**\n * Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:\n * - Summarizer client should be read-only to layers below the container runtime to restrict local changes.\n * - Summarizer client should not be active to layers below the container runtime to restrict local changes.\n */\nexport class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {\n\tpublic get active(): boolean {\n\t\t// Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer\n\t\t// except for the SummarizeOp which is generated by the runtime.\n\t\treturn !this.isSummarizerClient && this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\t// Summarizer clients should be read-only as far as the runtime and layers below are concerned. There shouldn't\n\t\t// be any local changes (writes) in the summarizer except for the summarize op which is generated by the runtime.\n\t\tif (this.isSummarizerClient) {\n\t\t\treturn {\n\t\t\t\treadonly: true,\n\t\t\t\tforced: false,\n\t\t\t\tpermissions: undefined,\n\t\t\t\tstorageOnly: false,\n\t\t\t};\n\t\t}\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tprivate readonly isSummarizerClient: boolean;\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper(deltaManager);\n\t\tthis.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;\n\t}\n}\n\nexport class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {\n\tpublic get minimumSequenceNumber(): number {\n\t\tconst minPendingSeqNum = this.pendingStateManager.minimumPendingMessageSequenceNumber;\n\t\t// There is a chance that minPendingSeqNum is greater than minimum sequence number.\n\t\t// minPendingSeqNum is based on the pending ops, so it's based on ref seq number.\n\t\t// Imagine an op has just be sent while there's another client that has been lagging behind,\n\t\t// it will likely have a ref seq number greater than the minimum seq number.\n\t\tif (\n\t\t\tminPendingSeqNum !== undefined &&\n\t\t\tminPendingSeqNum < this.deltaManager.minimumSequenceNumber\n\t\t) {\n\t\t\treturn minPendingSeqNum;\n\t\t}\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\tif (this.deltaManager.lastMessage === undefined) {\n\t\t\treturn this.deltaManager.lastMessage;\n\t\t}\n\t\treturn {\n\t\t\t...this.deltaManager.lastMessage,\n\t\t\tminimumSequenceNumber: this.minimumSequenceNumber,\n\t\t};\n\t}\n\n\tprotected readonly onOp = (\n\t\tmessage: ISequencedDocumentMessage,\n\t\tprocessingTime: number,\n\t): void => {\n\t\tconst messageIntercept = {\n\t\t\t...message,\n\t\t\tminimumSequenceNumber: this.minimumSequenceNumber,\n\t\t};\n\t\tthis.emit(\"op\", messageIntercept, processingTime);\n\t};\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly pendingStateManager: Pick<\n\t\t\tPendingStateManager,\n\t\t\t\"minimumPendingMessageSequenceNumber\"\n\t\t>,\n\t) {\n\t\tsuper(deltaManager);\n\t}\n}\n"]}
|
package/lib/deltaScheduler.js
CHANGED
|
@@ -18,21 +18,15 @@ import { formatTick } from "@fluidframework/telemetry-utils/internal";
|
|
|
18
18
|
* processed, the time and number of turns it took to process the ops.
|
|
19
19
|
*/
|
|
20
20
|
export class DeltaScheduler {
|
|
21
|
-
logger;
|
|
22
|
-
deltaManager;
|
|
23
|
-
// The time for processing ops in a single turn.
|
|
24
|
-
static processingTime = 50;
|
|
25
|
-
// The increase in time for processing ops after each turn.
|
|
26
|
-
processingTimeIncrement = 10;
|
|
27
|
-
processingStartTime;
|
|
28
|
-
currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;
|
|
29
|
-
// This keeps track of the number of times inbound queue has been scheduled. After a particular
|
|
30
|
-
// count, we log telemetry for the number of ops processed, the time and number of turns it took
|
|
31
|
-
// to process the ops.
|
|
32
|
-
schedulingCount = 0;
|
|
33
|
-
schedulingLog;
|
|
34
21
|
constructor(deltaManager, logger) {
|
|
35
22
|
this.logger = logger;
|
|
23
|
+
// The increase in time for processing ops after each turn.
|
|
24
|
+
this.processingTimeIncrement = 10;
|
|
25
|
+
this.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;
|
|
26
|
+
// This keeps track of the number of times inbound queue has been scheduled. After a particular
|
|
27
|
+
// count, we log telemetry for the number of ops processed, the time and number of turns it took
|
|
28
|
+
// to process the ops.
|
|
29
|
+
this.schedulingCount = 0;
|
|
36
30
|
this.deltaManager = deltaManager;
|
|
37
31
|
this.deltaManager.inbound.on("idle", () => {
|
|
38
32
|
this.inboundQueueIdle();
|
|
@@ -138,4 +132,6 @@ export class DeltaScheduler {
|
|
|
138
132
|
return this.deltaManager.inbound.length > 0;
|
|
139
133
|
}
|
|
140
134
|
}
|
|
135
|
+
// The time for processing ops in a single turn.
|
|
136
|
+
DeltaScheduler.processingTime = 50;
|
|
141
137
|
//# sourceMappingURL=deltaScheduler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deltaScheduler.js","sourceRoot":"","sources":["../src/deltaScheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions/internal\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ITelemetryLoggerExt, formatTick } from \"@fluidframework/telemetry-utils/internal\";\n\n/**\n * DeltaScheduler is responsible for the scheduling of inbound delta queue in cases where there\n * is more than one op a particular run of the queue. It does not schedule if there is just one\n * op or just one batch in the run. It does the following two things:\n *\n * 1. If the ops have been processed for more than a specific amount of time, it pauses the queue\n * and calls setTimeout to schedule a resume of the queue. This ensures that we don't block\n * the JS thread for a long time processing ops synchronously (for example, when catching up\n * ops right after boot or catching up ops / delayed realizing data stores by summarizer).\n *\n * 2. If we scheduled a particular run of the queue, it logs telemetry for the number of ops\n * processed, the time and number of turns it took to process the ops.\n */\nexport class DeltaScheduler {\n\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\t// The time for processing ops in a single turn.\n\tpublic static readonly processingTime = 50;\n\n\t// The increase in time for processing ops after each turn.\n\tprivate readonly processingTimeIncrement = 10;\n\n\tprivate processingStartTime: number | undefined;\n\tprivate currentAllowedProcessingTimeForTurn: number = DeltaScheduler.processingTime;\n\n\t// This keeps track of the number of times inbound queue has been scheduled. After a particular\n\t// count, we log telemetry for the number of ops processed, the time and number of turns it took\n\t// to process the ops.\n\tprivate schedulingCount: number = 0;\n\n\tprivate schedulingLog:\n\t\t| {\n\t\t\t\topsRemainingToProcess: number;\n\t\t\t\ttotalProcessingTime: number;\n\t\t\t\tnumberOfTurns: number;\n\t\t\t\tnumberOfBatchesProcessed: number;\n\t\t\t\tlastSequenceNumber: number;\n\t\t\t\tfirstSequenceNumber: number;\n\t\t\t\tstartTime: number;\n\t\t }\n\t\t| undefined;\n\n\tconstructor(\n\t\tdeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.deltaManager = deltaManager;\n\t\tthis.deltaManager.inbound.on(\"idle\", () => {\n\t\t\tthis.inboundQueueIdle();\n\t\t});\n\t}\n\n\tpublic batchBegin(message: ISequencedDocumentMessage) {\n\t\tif (!this.processingStartTime) {\n\t\t\tthis.processingStartTime = performance.now();\n\t\t}\n\t\tif (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {\n\t\t\t// Every 500th time we are scheduling the inbound queue, we log telemetry for the\n\t\t\t// number of ops processed, the time and number of turns it took to process the ops.\n\t\t\tthis.schedulingLog = {\n\t\t\t\topsRemainingToProcess: 0,\n\t\t\t\tnumberOfTurns: 1,\n\t\t\t\ttotalProcessingTime: 0,\n\t\t\t\tnumberOfBatchesProcessed: 0,\n\t\t\t\tfirstSequenceNumber: message.sequenceNumber,\n\t\t\t\tlastSequenceNumber: message.sequenceNumber,\n\t\t\t\tstartTime: performance.now(),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic batchEnd(message: ISequencedDocumentMessage) {\n\t\tif (this.schedulingLog) {\n\t\t\tthis.schedulingLog.numberOfBatchesProcessed++;\n\t\t\tthis.schedulingLog.lastSequenceNumber = message.sequenceNumber;\n\t\t\tthis.schedulingLog.opsRemainingToProcess = this.deltaManager.inbound.length;\n\t\t}\n\n\t\tif (this.shouldRunScheduler()) {\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst elapsedTime = currentTime - this.processingStartTime!;\n\t\t\tif (elapsedTime > this.currentAllowedProcessingTimeForTurn) {\n\t\t\t\t// We have processed ops for more than the total processing time. So, pause the\n\t\t\t\t// queue, yield the thread and schedule a resume.\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\t\tthis.deltaManager.inbound.pause();\n\n\t\t\t\t// Increase the total processing time. Keep doing this after each turn until all the ops have\n\t\t\t\t// been processed. This way we keep the responsiveness at the beginning while also making sure\n\t\t\t\t// that all the ops process fairly quickly.\n\t\t\t\tthis.currentAllowedProcessingTimeForTurn += this.processingTimeIncrement;\n\n\t\t\t\t// If we are logging the telemetry this time, update the telemetry log object.\n\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\tthis.schedulingLog.numberOfTurns++;\n\t\t\t\t\tthis.schedulingLog.totalProcessingTime += elapsedTime;\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\t\teventName: \"InboundOpsPartialProcessingTime\",\n\t\t\t\t\t\t\tduration: formatTick(elapsedTime),\n\t\t\t\t\t\t\topsProcessed:\n\t\t\t\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\topsRemainingToProcess: this.deltaManager.inbound.length,\n\t\t\t\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\t\t\t\ttimeToResume: formatTick(performance.now() - currentTime),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.deltaManager.inbound.resume();\n\t\t\t\t});\n\n\t\t\t\tthis.processingStartTime = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate inboundQueueIdle() {\n\t\tif (this.schedulingLog) {\n\t\t\t// Add the time taken for processing the final ops to the total processing time in the\n\t\t\t// telemetry log object.\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tthis.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;\n\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"InboundOpsProcessingTime\",\n\t\t\t\topsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,\n\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\topsProcessed:\n\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t1,\n\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\tduration: formatTick(currentTime - this.schedulingLog.startTime),\n\t\t\t\tschedulingCount: this.schedulingCount,\n\t\t\t});\n\n\t\t\tthis.schedulingLog = undefined;\n\t\t}\n\n\t\t// If we scheduled this batch of the inbound queue, increment the counter that tracks the\n\t\t// number of times we have done this.\n\t\tthis.schedulingCount++;\n\n\t\t// Reset the processing times.\n\t\tthis.processingStartTime = undefined;\n\t\tthis.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;\n\t}\n\n\t/**\n\t * This function tells whether we should run the scheduler.\n\t */\n\tprivate shouldRunScheduler(): boolean {\n\t\t// If there are still ops in the queue after the one we are processing now, we should\n\t\t// run the scheduler.\n\t\treturn this.deltaManager.inbound.length > 0;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"deltaScheduler.js","sourceRoot":"","sources":["../src/deltaScheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions/internal\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ITelemetryLoggerExt, formatTick } from \"@fluidframework/telemetry-utils/internal\";\n\n/**\n * DeltaScheduler is responsible for the scheduling of inbound delta queue in cases where there\n * is more than one op a particular run of the queue. It does not schedule if there is just one\n * op or just one batch in the run. It does the following two things:\n *\n * 1. If the ops have been processed for more than a specific amount of time, it pauses the queue\n * and calls setTimeout to schedule a resume of the queue. This ensures that we don't block\n * the JS thread for a long time processing ops synchronously (for example, when catching up\n * ops right after boot or catching up ops / delayed realizing data stores by summarizer).\n *\n * 2. If we scheduled a particular run of the queue, it logs telemetry for the number of ops\n * processed, the time and number of turns it took to process the ops.\n */\nexport class DeltaScheduler {\n\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\t// The time for processing ops in a single turn.\n\tpublic static readonly processingTime = 50;\n\n\t// The increase in time for processing ops after each turn.\n\tprivate readonly processingTimeIncrement = 10;\n\n\tprivate processingStartTime: number | undefined;\n\tprivate currentAllowedProcessingTimeForTurn: number = DeltaScheduler.processingTime;\n\n\t// This keeps track of the number of times inbound queue has been scheduled. After a particular\n\t// count, we log telemetry for the number of ops processed, the time and number of turns it took\n\t// to process the ops.\n\tprivate schedulingCount: number = 0;\n\n\tprivate schedulingLog:\n\t\t| {\n\t\t\t\topsRemainingToProcess: number;\n\t\t\t\ttotalProcessingTime: number;\n\t\t\t\tnumberOfTurns: number;\n\t\t\t\tnumberOfBatchesProcessed: number;\n\t\t\t\tlastSequenceNumber: number;\n\t\t\t\tfirstSequenceNumber: number;\n\t\t\t\tstartTime: number;\n\t\t }\n\t\t| undefined;\n\n\tconstructor(\n\t\tdeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.deltaManager = deltaManager;\n\t\tthis.deltaManager.inbound.on(\"idle\", () => {\n\t\t\tthis.inboundQueueIdle();\n\t\t});\n\t}\n\n\tpublic batchBegin(message: ISequencedDocumentMessage) {\n\t\tif (!this.processingStartTime) {\n\t\t\tthis.processingStartTime = performance.now();\n\t\t}\n\t\tif (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {\n\t\t\t// Every 500th time we are scheduling the inbound queue, we log telemetry for the\n\t\t\t// number of ops processed, the time and number of turns it took to process the ops.\n\t\t\tthis.schedulingLog = {\n\t\t\t\topsRemainingToProcess: 0,\n\t\t\t\tnumberOfTurns: 1,\n\t\t\t\ttotalProcessingTime: 0,\n\t\t\t\tnumberOfBatchesProcessed: 0,\n\t\t\t\tfirstSequenceNumber: message.sequenceNumber,\n\t\t\t\tlastSequenceNumber: message.sequenceNumber,\n\t\t\t\tstartTime: performance.now(),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic batchEnd(message: ISequencedDocumentMessage) {\n\t\tif (this.schedulingLog) {\n\t\t\tthis.schedulingLog.numberOfBatchesProcessed++;\n\t\t\tthis.schedulingLog.lastSequenceNumber = message.sequenceNumber;\n\t\t\tthis.schedulingLog.opsRemainingToProcess = this.deltaManager.inbound.length;\n\t\t}\n\n\t\tif (this.shouldRunScheduler()) {\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst elapsedTime = currentTime - this.processingStartTime!;\n\t\t\tif (elapsedTime > this.currentAllowedProcessingTimeForTurn) {\n\t\t\t\t// We have processed ops for more than the total processing time. So, pause the\n\t\t\t\t// queue, yield the thread and schedule a resume.\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\t\tthis.deltaManager.inbound.pause();\n\n\t\t\t\t// Increase the total processing time. Keep doing this after each turn until all the ops have\n\t\t\t\t// been processed. This way we keep the responsiveness at the beginning while also making sure\n\t\t\t\t// that all the ops process fairly quickly.\n\t\t\t\tthis.currentAllowedProcessingTimeForTurn += this.processingTimeIncrement;\n\n\t\t\t\t// If we are logging the telemetry this time, update the telemetry log object.\n\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\tthis.schedulingLog.numberOfTurns++;\n\t\t\t\t\tthis.schedulingLog.totalProcessingTime += elapsedTime;\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\t\teventName: \"InboundOpsPartialProcessingTime\",\n\t\t\t\t\t\t\tduration: formatTick(elapsedTime),\n\t\t\t\t\t\t\topsProcessed:\n\t\t\t\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\topsRemainingToProcess: this.deltaManager.inbound.length,\n\t\t\t\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\t\t\t\ttimeToResume: formatTick(performance.now() - currentTime),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.deltaManager.inbound.resume();\n\t\t\t\t});\n\n\t\t\t\tthis.processingStartTime = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate inboundQueueIdle() {\n\t\tif (this.schedulingLog) {\n\t\t\t// Add the time taken for processing the final ops to the total processing time in the\n\t\t\t// telemetry log object.\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tthis.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;\n\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"InboundOpsProcessingTime\",\n\t\t\t\topsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,\n\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\topsProcessed:\n\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t1,\n\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\tduration: formatTick(currentTime - this.schedulingLog.startTime),\n\t\t\t\tschedulingCount: this.schedulingCount,\n\t\t\t});\n\n\t\t\tthis.schedulingLog = undefined;\n\t\t}\n\n\t\t// If we scheduled this batch of the inbound queue, increment the counter that tracks the\n\t\t// number of times we have done this.\n\t\tthis.schedulingCount++;\n\n\t\t// Reset the processing times.\n\t\tthis.processingStartTime = undefined;\n\t\tthis.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;\n\t}\n\n\t/**\n\t * This function tells whether we should run the scheduler.\n\t */\n\tprivate shouldRunScheduler(): boolean {\n\t\t// If there are still ops in the queue after the one we are processing now, we should\n\t\t// run the scheduler.\n\t\treturn this.deltaManager.inbound.length > 0;\n\t}\n}\n"]}
|
package/lib/error.js
CHANGED
|
@@ -8,11 +8,10 @@ import { LoggingError } from "@fluidframework/telemetry-utils/internal";
|
|
|
8
8
|
* Error indicating that a client's session has reached its time limit and is closed.
|
|
9
9
|
*/
|
|
10
10
|
export class ClientSessionExpiredError extends LoggingError {
|
|
11
|
-
expiryMs;
|
|
12
|
-
errorType = ContainerErrorTypes.clientSessionExpiredError;
|
|
13
11
|
constructor(message, expiryMs) {
|
|
14
12
|
super(message, { timeoutMs: expiryMs });
|
|
15
13
|
this.expiryMs = expiryMs;
|
|
14
|
+
this.errorType = ContainerErrorTypes.clientSessionExpiredError;
|
|
16
15
|
}
|
|
17
16
|
}
|
|
18
17
|
//# sourceMappingURL=error.js.map
|
package/lib/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AACrF,OAAO,EAAmB,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAEzF;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AACrF,OAAO,EAAmB,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAEzF;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,YAAY;IAG1D,YACC,OAAe,EACN,QAAgB;QAEzB,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAF/B,aAAQ,GAAR,QAAQ,CAAQ;QAJjB,cAAS,GAAG,mBAAmB,CAAC,yBAAyB,CAAC;IAOnE,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ContainerErrorTypes } from \"@fluidframework/container-definitions/internal\";\nimport { IFluidErrorBase, LoggingError } from \"@fluidframework/telemetry-utils/internal\";\n\n/**\n * Error indicating that a client's session has reached its time limit and is closed.\n */\nexport class ClientSessionExpiredError extends LoggingError implements IFluidErrorBase {\n\treadonly errorType = ContainerErrorTypes.clientSessionExpiredError;\n\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly expiryMs: number,\n\t) {\n\t\tsuper(message, { timeoutMs: expiryMs });\n\t}\n}\n"]}
|
|
@@ -175,9 +175,10 @@ export declare class GarbageCollector implements IGarbageCollector {
|
|
|
175
175
|
/**
|
|
176
176
|
* Process a GC message.
|
|
177
177
|
* @param message - The GC message from the container runtime.
|
|
178
|
+
* @param messageTimestampMs - The timestamp of the message.
|
|
178
179
|
* @param local - Whether it was send by this client.
|
|
179
180
|
*/
|
|
180
|
-
processMessage(message: ContainerRuntimeGCMessage, local: boolean): void;
|
|
181
|
+
processMessage(message: ContainerRuntimeGCMessage, messageTimestampMs: number, local: boolean): void;
|
|
181
182
|
/**
|
|
182
183
|
* Delete nodes that are sweep-ready. Call the runtime to delete these nodes and clear the unreferenced state
|
|
183
184
|
* tracking for nodes that are actually deleted by the runtime.
|
|
@@ -210,9 +211,10 @@ export declare class GarbageCollector implements IGarbageCollector {
|
|
|
210
211
|
*
|
|
211
212
|
* @param fromNodePath - The node from which the reference is added.
|
|
212
213
|
* @param toNodePath - The node to which the reference is added.
|
|
214
|
+
* @param timestampMs - The timestamp of the message that added the reference.
|
|
213
215
|
* @param autorecovery - This reference is added artificially, for autorecovery. Used for logging.
|
|
214
216
|
*/
|
|
215
|
-
addedOutboundReference(fromNodePath: string, toNodePath: string, autorecovery?: true): void;
|
|
217
|
+
addedOutboundReference(fromNodePath: string, toNodePath: string, timestampMs: number, autorecovery?: true): void;
|
|
216
218
|
/**
|
|
217
219
|
* Returns whether a node with the given path has been deleted or not. This can be used by the runtime to identify
|
|
218
220
|
* cases where objects are used after they are deleted and throw / log errors accordingly.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,41 +43,9 @@ export class GarbageCollector {
|
|
|
43
43
|
static create(createParams) {
|
|
44
44
|
return new GarbageCollector(createParams);
|
|
45
45
|
}
|
|
46
|
-
mc;
|
|
47
|
-
configs;
|
|
48
46
|
get shouldRunGC() {
|
|
49
47
|
return this.configs.gcEnabled;
|
|
50
48
|
}
|
|
51
|
-
sessionExpiryTimerStarted;
|
|
52
|
-
// Keeps track of the GC state from the last run.
|
|
53
|
-
gcDataFromLastRun;
|
|
54
|
-
// Keeps a list of references (edges in the GC graph) between GC runs. Each entry has a node id and a list of
|
|
55
|
-
// outbound routes from that node.
|
|
56
|
-
newReferencesSinceLastRun = new Map();
|
|
57
|
-
// A list of nodes that have been tombstoned.
|
|
58
|
-
tombstones = [];
|
|
59
|
-
// A list of nodes that have been deleted during sweep phase.
|
|
60
|
-
deletedNodes = new Set();
|
|
61
|
-
// Promise when resolved returns the GC data data in the base snapshot.
|
|
62
|
-
baseSnapshotDataP;
|
|
63
|
-
// Promise when resolved initializes the GC state from the data in the base snapshot.
|
|
64
|
-
initializeGCStateFromBaseSnapshotP;
|
|
65
|
-
// The GC details generated from the base snapshot.
|
|
66
|
-
baseGCDetailsP;
|
|
67
|
-
/**
|
|
68
|
-
* Map of node ids to their unreferenced state tracker
|
|
69
|
-
* NOTE: The set of keys in this map is considered as the set of unreferenced nodes
|
|
70
|
-
* as of the last GC run. So in between runs, nothing should be added or removed.
|
|
71
|
-
*/
|
|
72
|
-
unreferencedNodesState = new UnreferencedStateTrackerMap();
|
|
73
|
-
// The Timer responsible for closing the container when the session has expired
|
|
74
|
-
sessionExpiryTimer;
|
|
75
|
-
// The number of times GC has successfully completed on this instance of GarbageCollector.
|
|
76
|
-
completedRuns = 0;
|
|
77
|
-
runtime;
|
|
78
|
-
isSummarizerClient;
|
|
79
|
-
summaryStateTracker;
|
|
80
|
-
telemetryTracker;
|
|
81
49
|
/** If false, loading or using a Tombstoned object should merely log, not fail */
|
|
82
50
|
get tombstoneEnforcementAllowed() {
|
|
83
51
|
return this.configs.sweepEnabled;
|
|
@@ -90,16 +58,26 @@ export class GarbageCollector {
|
|
|
90
58
|
get throwOnTombstoneUsage() {
|
|
91
59
|
return this.configs.throwOnTombstoneUsage;
|
|
92
60
|
}
|
|
93
|
-
/** For a given node path, returns the node's package path. */
|
|
94
|
-
getNodePackagePath;
|
|
95
|
-
/** Returns the timestamp of the last summary generated for this container. */
|
|
96
|
-
getLastSummaryTimestampMs;
|
|
97
|
-
submitMessage;
|
|
98
61
|
/** Returns the count of data stores whose GC state updated since the last summary. */
|
|
99
62
|
get updatedDSCountSinceLastSummary() {
|
|
100
63
|
return this.summaryStateTracker.updatedDSCountSinceLastSummary;
|
|
101
64
|
}
|
|
102
65
|
constructor(createParams) {
|
|
66
|
+
// Keeps a list of references (edges in the GC graph) between GC runs. Each entry has a node id and a list of
|
|
67
|
+
// outbound routes from that node.
|
|
68
|
+
this.newReferencesSinceLastRun = new Map();
|
|
69
|
+
// A list of nodes that have been tombstoned.
|
|
70
|
+
this.tombstones = [];
|
|
71
|
+
// A list of nodes that have been deleted during sweep phase.
|
|
72
|
+
this.deletedNodes = new Set();
|
|
73
|
+
/**
|
|
74
|
+
* Map of node ids to their unreferenced state tracker
|
|
75
|
+
* NOTE: The set of keys in this map is considered as the set of unreferenced nodes
|
|
76
|
+
* as of the last GC run. So in between runs, nothing should be added or removed.
|
|
77
|
+
*/
|
|
78
|
+
this.unreferencedNodesState = new UnreferencedStateTrackerMap();
|
|
79
|
+
// The number of times GC has successfully completed on this instance of GarbageCollector.
|
|
80
|
+
this.completedRuns = 0;
|
|
103
81
|
this.runtime = createParams.runtime;
|
|
104
82
|
this.isSummarizerClient = createParams.isSummarizerClient;
|
|
105
83
|
this.getNodePackagePath = createParams.getNodePackagePath;
|
|
@@ -659,9 +637,10 @@ export class GarbageCollector {
|
|
|
659
637
|
/**
|
|
660
638
|
* Process a GC message.
|
|
661
639
|
* @param message - The GC message from the container runtime.
|
|
640
|
+
* @param messageTimestampMs - The timestamp of the message.
|
|
662
641
|
* @param local - Whether it was send by this client.
|
|
663
642
|
*/
|
|
664
|
-
processMessage(message, local) {
|
|
643
|
+
processMessage(message, messageTimestampMs, local) {
|
|
665
644
|
const gcMessageType = message.contents.type;
|
|
666
645
|
switch (gcMessageType) {
|
|
667
646
|
case GarbageCollectionMessageType.Sweep: {
|
|
@@ -675,7 +654,7 @@ export class GarbageCollector {
|
|
|
675
654
|
}
|
|
676
655
|
// Mark the node as referenced to ensure it isn't Swept
|
|
677
656
|
const tombstonedNodePath = message.contents.nodePath;
|
|
678
|
-
this.addedOutboundReference("/", tombstonedNodePath, true /* autorecovery */);
|
|
657
|
+
this.addedOutboundReference("/", tombstonedNodePath, messageTimestampMs, true /* autorecovery */);
|
|
679
658
|
// In case the cause of the TombstoneLoaded event is incorrect GC Data (i.e. the object is actually reachable),
|
|
680
659
|
// do fullGC on the next run to get a chance to repair (in the likely case the bug is not deterministic)
|
|
681
660
|
this.summaryStateTracker.autoRecovery.requestFullGCOnNextRun();
|
|
@@ -734,7 +713,9 @@ export class GarbageCollector {
|
|
|
734
713
|
* @param IGCNodeUpdatedProps - Details about the node and how it was updated
|
|
735
714
|
*/
|
|
736
715
|
nodeUpdated({ node, reason, timestampMs, packagePath, request, headerData, }) {
|
|
737
|
-
|
|
716
|
+
// If there is no reference timestamp to work with, no ops have been processed after creation. If so, skip
|
|
717
|
+
// logging as nothing interesting would have happened worth logging.
|
|
718
|
+
if (!this.shouldRunGC || timestampMs === undefined) {
|
|
738
719
|
return;
|
|
739
720
|
}
|
|
740
721
|
// trackedId will be either DataStore or Blob ID (not sub-DataStore ID, since some of those are unrecognized by GC)
|
|
@@ -746,7 +727,7 @@ export class GarbageCollector {
|
|
|
746
727
|
this.telemetryTracker.nodeUsed(trackedId, {
|
|
747
728
|
id: fullPath,
|
|
748
729
|
usageType: reason,
|
|
749
|
-
currentReferenceTimestampMs: timestampMs
|
|
730
|
+
currentReferenceTimestampMs: timestampMs,
|
|
750
731
|
packagePath,
|
|
751
732
|
completedGCRuns: this.completedRuns,
|
|
752
733
|
isTombstoned,
|
|
@@ -820,9 +801,10 @@ export class GarbageCollector {
|
|
|
820
801
|
*
|
|
821
802
|
* @param fromNodePath - The node from which the reference is added.
|
|
822
803
|
* @param toNodePath - The node to which the reference is added.
|
|
804
|
+
* @param timestampMs - The timestamp of the message that added the reference.
|
|
823
805
|
* @param autorecovery - This reference is added artificially, for autorecovery. Used for logging.
|
|
824
806
|
*/
|
|
825
|
-
addedOutboundReference(fromNodePath, toNodePath, autorecovery) {
|
|
807
|
+
addedOutboundReference(fromNodePath, toNodePath, timestampMs, autorecovery) {
|
|
826
808
|
if (!this.shouldRunGC) {
|
|
827
809
|
return;
|
|
828
810
|
}
|
|
@@ -848,7 +830,7 @@ export class GarbageCollector {
|
|
|
848
830
|
id: toNodePath,
|
|
849
831
|
fromId: fromNodePath,
|
|
850
832
|
usageType: "Revived",
|
|
851
|
-
currentReferenceTimestampMs:
|
|
833
|
+
currentReferenceTimestampMs: timestampMs,
|
|
852
834
|
packagePath: undefined,
|
|
853
835
|
completedGCRuns: this.completedRuns,
|
|
854
836
|
isTombstoned: this.tombstones.includes(trackedId),
|