@fluidframework/container-runtime 2.23.0-325054 → 2.30.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/CHANGELOG.md +52 -0
- package/api-report/container-runtime.legacy.alpha.api.md +0 -246
- package/dist/blobManager/blobManager.d.ts +11 -9
- package/dist/blobManager/blobManager.d.ts.map +1 -1
- package/dist/blobManager/blobManager.js +38 -39
- package/dist/blobManager/blobManager.js.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.d.ts +2 -4
- package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.js +6 -6
- package/dist/blobManager/blobManagerSnapSum.js.map +1 -1
- package/dist/channelCollection.d.ts +1 -7
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +1 -26
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +0 -43
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +21 -141
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +49 -290
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +0 -13
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +2 -25
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +2 -20
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +0 -2
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +8 -24
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +1 -3
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +1 -4
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +0 -1
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +4 -16
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +0 -29
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/signalTelemetryProcessing.d.ts +33 -0
- package/dist/signalTelemetryProcessing.d.ts.map +1 -0
- package/dist/signalTelemetryProcessing.js +149 -0
- package/dist/signalTelemetryProcessing.js.map +1 -0
- package/dist/summary/documentSchema.d.ts +7 -31
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +2 -18
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +7 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +1 -3
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -3
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +2 -7
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +1 -2
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +4 -23
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +2 -5
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +3 -11
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js +0 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +109 -22
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +3 -9
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +3 -9
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryHelpers.d.ts +19 -0
- package/dist/summary/summaryHelpers.d.ts.map +1 -0
- package/dist/summary/summaryHelpers.js +90 -0
- package/dist/summary/summaryHelpers.js.map +1 -0
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +0 -2
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/blobManager/blobManager.d.ts +11 -9
- package/lib/blobManager/blobManager.d.ts.map +1 -1
- package/lib/blobManager/blobManager.js +37 -37
- package/lib/blobManager/blobManager.js.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.d.ts +2 -4
- package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.js +6 -6
- package/lib/blobManager/blobManagerSnapSum.js.map +1 -1
- package/lib/channelCollection.d.ts +1 -7
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +2 -29
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +0 -43
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +21 -141
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +51 -298
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +0 -13
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +2 -25
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +3 -23
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +0 -2
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +8 -24
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +1 -3
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +1 -4
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +0 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +5 -19
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +0 -29
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/signalTelemetryProcessing.d.ts +33 -0
- package/lib/signalTelemetryProcessing.d.ts.map +1 -0
- package/lib/signalTelemetryProcessing.js +145 -0
- package/lib/signalTelemetryProcessing.js.map +1 -0
- package/lib/summary/documentSchema.d.ts +7 -31
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +2 -18
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/index.d.ts +2 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -0
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +1 -3
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -3
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +2 -7
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +1 -2
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +4 -23
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +2 -5
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -11
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js +0 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +109 -22
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +3 -9
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +3 -9
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryHelpers.d.ts +19 -0
- package/lib/summary/summaryHelpers.d.ts.map +1 -0
- package/lib/summary/summaryHelpers.js +84 -0
- package/lib/summary/summaryHelpers.js.map +1 -0
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +0 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +27 -20
- package/src/blobManager/blobManager.ts +70 -62
- package/src/blobManager/blobManagerSnapSum.ts +7 -9
- package/src/channelCollection.ts +3 -31
- package/src/connectionTelemetry.ts +0 -51
- package/src/containerRuntime.ts +111 -522
- package/src/dataStoreContext.ts +2 -32
- package/src/gc/garbageCollection.ts +9 -26
- package/src/gc/gcConfigs.ts +3 -6
- package/src/gc/gcDefinitions.ts +10 -28
- package/src/gc/gcHelpers.ts +0 -5
- package/src/gc/gcSummaryStateTracker.ts +1 -2
- package/src/gc/gcTelemetry.ts +6 -13
- package/src/index.ts +6 -6
- package/src/messageTypes.ts +0 -2
- package/src/packageVersion.ts +1 -1
- package/src/signalTelemetryProcessing.ts +233 -0
- package/src/summary/documentSchema.ts +7 -38
- package/src/summary/index.ts +12 -0
- package/src/summary/orderedClientElection.ts +1 -3
- package/src/summary/runWhileConnectedCoordinator.ts +3 -8
- package/src/summary/runningSummarizer.ts +12 -20
- package/src/summary/summarizer.ts +6 -18
- package/src/summary/summarizerClientElection.ts +0 -2
- package/src/summary/summarizerHeuristics.ts +1 -2
- package/src/summary/summarizerTypes.ts +119 -23
- package/src/summary/summaryFormat.ts +4 -13
- package/src/summary/summaryGenerator.ts +1 -8
- package/src/summary/summaryHelpers.ts +118 -0
- package/src/summary/summaryManager.ts +0 -2
package/lib/containerRuntime.js
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { Trace, TypedEventEmitter
|
|
6
|
-
import { AttachState
|
|
7
|
-
import {
|
|
5
|
+
import { Trace, TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
6
|
+
import { AttachState } from "@fluidframework/container-definitions";
|
|
7
|
+
import { isIDeltaManagerFull } from "@fluidframework/container-definitions/internal";
|
|
8
8
|
import { assert, Deferred, LazyPromise, PromiseCache, delay, } from "@fluidframework/core-utils/internal";
|
|
9
|
-
import { SummaryType
|
|
10
|
-
import {
|
|
9
|
+
import { SummaryType } from "@fluidframework/driver-definitions";
|
|
10
|
+
import { FetchSource, MessageType } from "@fluidframework/driver-definitions/internal";
|
|
11
11
|
import { readAndParse } from "@fluidframework/driver-utils/internal";
|
|
12
12
|
import { FlushMode, FlushModeExperimental, channelsTreeName, gcTreeKey, } from "@fluidframework/runtime-definitions/internal";
|
|
13
|
-
import { GCDataBuilder, RequestParser, TelemetryContext, addBlobToSummary, addSummarizeResultToSummary, calculateStats, create404Response, exceptionToResponse,
|
|
13
|
+
import { GCDataBuilder, RequestParser, TelemetryContext, addBlobToSummary, addSummarizeResultToSummary, calculateStats, create404Response, exceptionToResponse, seqFromTree, } from "@fluidframework/runtime-utils/internal";
|
|
14
14
|
import { DataCorruptionError, DataProcessingError, extractSafePropertiesFromMessage, GenericError, LoggingError, PerformanceEvent,
|
|
15
15
|
// eslint-disable-next-line import/no-deprecated
|
|
16
16
|
TaggedLoggerAdapter, UsageError, createChildLogger, createChildMonitoringContext, createSampledLogger, loggerToMonitoringContext, raiseConnectedEvent, wrapError, tagCodeArtifacts, } from "@fluidframework/telemetry-utils/internal";
|
|
@@ -24,20 +24,15 @@ import { channelToDataStore } from "./dataStore.js";
|
|
|
24
24
|
import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
|
|
25
25
|
import { DeltaManagerPendingOpsProxy, DeltaManagerSummarizerProxy, } from "./deltaManagerProxies.js";
|
|
26
26
|
import { DeltaScheduler } from "./deltaScheduler.js";
|
|
27
|
-
import {
|
|
28
|
-
// eslint-disable-next-line import/no-deprecated
|
|
29
|
-
GCNodeType, GarbageCollector, gcGenerationOptionName, } from "./gc/index.js";
|
|
27
|
+
import { GCNodeType, GarbageCollector, gcGenerationOptionName, } from "./gc/index.js";
|
|
30
28
|
import { InboundBatchAggregator } from "./inboundBatchAggregator.js";
|
|
31
29
|
import { RuntimeCompatDetails, validateLoaderCompatibility } from "./layerCompatState.js";
|
|
32
30
|
import { ContainerMessageType, } from "./messageTypes.js";
|
|
33
31
|
import { DuplicateBatchDetector, ensureContentsDeserialized, OpCompressor, OpDecompressor, OpGroupingManager, OpSplitter, Outbox, RemoteMessageProcessor, serializeOpContents, } from "./opLifecycle/index.js";
|
|
34
32
|
import { pkgVersion } from "./packageVersion.js";
|
|
35
33
|
import { PendingStateManager, } from "./pendingStateManager.js";
|
|
36
|
-
import {
|
|
37
|
-
|
|
38
|
-
DocumentsSchemaController, OrderedClientCollection, OrderedClientElection, RetriableSummaryError, RunWhileConnectedCoordinator,
|
|
39
|
-
// eslint-disable-next-line import/no-deprecated
|
|
40
|
-
Summarizer, SummarizerClientElection, SummaryCollection, SummaryManager, aliasBlobName, chunksBlobName, recentBatchInfoBlobName, createRootSummarizerNodeWithGC, electedSummarizerBlobName, extractSummaryMetadataMessage, idCompressorBlobName, metadataBlobName, rootHasIsolatedChannels, summarizerClientType, wrapSummaryInChannelsTree, } from "./summary/index.js";
|
|
34
|
+
import { SignalTelemetryManager } from "./signalTelemetryProcessing.js";
|
|
35
|
+
import { DocumentsSchemaController, OrderedClientCollection, OrderedClientElection, RetriableSummaryError, RunWhileConnectedCoordinator, Summarizer, SummarizerClientElection, SummaryCollection, SummaryManager, aliasBlobName, chunksBlobName, recentBatchInfoBlobName, createRootSummarizerNodeWithGC, electedSummarizerBlobName, extractSummaryMetadataMessage, idCompressorBlobName, metadataBlobName, rootHasIsolatedChannels, summarizerClientType, wrapSummaryInChannelsTree, formCreateSummarizerFn, summarizerRequestUrl, validateSummaryHeuristicConfiguration, DefaultSummaryConfiguration, isSummariesDisabled, } from "./summary/index.js";
|
|
41
36
|
import { Throttler, formExponentialFn } from "./throttler.js";
|
|
42
37
|
/**
|
|
43
38
|
* Creates an error object to be thrown / passed to Container's close fn in case of an unknown message type.
|
|
@@ -58,32 +53,9 @@ function getUnknownMessageTypeError(unknownContainerRuntimeMessageType, codePath
|
|
|
58
53
|
},
|
|
59
54
|
});
|
|
60
55
|
}
|
|
61
|
-
export function isSummariesDisabled(config) {
|
|
62
|
-
return config.state === "disabled";
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* @legacy
|
|
66
|
-
* @alpha
|
|
67
|
-
*/
|
|
68
|
-
export const DefaultSummaryConfiguration = {
|
|
69
|
-
state: "enabled",
|
|
70
|
-
minIdleTime: 0,
|
|
71
|
-
maxIdleTime: 30 * 1000, // 30 secs.
|
|
72
|
-
maxTime: 60 * 1000, // 1 min.
|
|
73
|
-
maxOps: 100, // Summarize if 100 weighted ops received since last snapshot.
|
|
74
|
-
minOpsForLastSummaryAttempt: 10,
|
|
75
|
-
maxAckWaitTime: 3 * 60 * 1000, // 3 mins.
|
|
76
|
-
maxOpsSinceLastSummary: 7000,
|
|
77
|
-
initialSummarizerDelayMs: 5 * 1000, // 5 secs.
|
|
78
|
-
nonRuntimeOpWeight: 0.1,
|
|
79
|
-
runtimeOpWeight: 1,
|
|
80
|
-
nonRuntimeHeuristicThreshold: 20,
|
|
81
|
-
};
|
|
82
56
|
/**
|
|
83
57
|
* Error responses when requesting a deleted object will have this header set to true
|
|
84
|
-
* @
|
|
85
|
-
* @alpha
|
|
86
|
-
* @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
|
|
58
|
+
* @internal
|
|
87
59
|
*/
|
|
88
60
|
export const DeletedResponseHeaderKey = "wasDeleted";
|
|
89
61
|
/**
|
|
@@ -199,55 +171,13 @@ export const makeLegacySendBatchFn = (submitFn, deltaManager) => (batch) => {
|
|
|
199
171
|
deltaManager.flush();
|
|
200
172
|
return clientSequenceNumber;
|
|
201
173
|
};
|
|
202
|
-
const summarizerRequestUrl = "_summarizer";
|
|
203
|
-
/**
|
|
204
|
-
* Create and retrieve the summmarizer
|
|
205
|
-
*/
|
|
206
|
-
async function createSummarizer(loader, url) {
|
|
207
|
-
const request = {
|
|
208
|
-
headers: {
|
|
209
|
-
[LoaderHeader.cache]: false,
|
|
210
|
-
[LoaderHeader.clientDetails]: {
|
|
211
|
-
capabilities: { interactive: false },
|
|
212
|
-
type: summarizerClientType,
|
|
213
|
-
},
|
|
214
|
-
[DriverHeader.summarizingClient]: true,
|
|
215
|
-
[LoaderHeader.reconnect]: false,
|
|
216
|
-
},
|
|
217
|
-
url,
|
|
218
|
-
};
|
|
219
|
-
const resolvedContainer = await loader.resolve(request);
|
|
220
|
-
let fluidObject;
|
|
221
|
-
// Older containers may not have the "getEntryPoint" API
|
|
222
|
-
// ! This check will need to stay until LTS of loader moves past 2.0.0-internal.7.0.0
|
|
223
|
-
if (resolvedContainer.getEntryPoint === undefined) {
|
|
224
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-explicit-any
|
|
225
|
-
const response = (await resolvedContainer.request({
|
|
226
|
-
url: `/${summarizerRequestUrl}`,
|
|
227
|
-
}));
|
|
228
|
-
if (response.status !== 200 || response.mimeType !== "fluid/object") {
|
|
229
|
-
throw responseToException(response, request);
|
|
230
|
-
}
|
|
231
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
232
|
-
fluidObject = response.value;
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
fluidObject = await resolvedContainer.getEntryPoint();
|
|
236
|
-
}
|
|
237
|
-
if (fluidObject?.ISummarizer === undefined) {
|
|
238
|
-
throw new UsageError("Fluid object does not implement ISummarizer");
|
|
239
|
-
}
|
|
240
|
-
return fluidObject.ISummarizer;
|
|
241
|
-
}
|
|
242
174
|
/**
|
|
243
175
|
* Extract last message from the snapshot metadata.
|
|
244
176
|
* Uses legacy property if not using explicit schema control, otherwise uses the new property.
|
|
245
177
|
* This allows new runtime to make documents not openable for old runtimes, one explicit document schema control is enabled.
|
|
246
178
|
* Please see addMetadataToSummary() as well
|
|
247
179
|
*/
|
|
248
|
-
function lastMessageFromMetadata(
|
|
249
|
-
// eslint-disable-next-line import/no-deprecated
|
|
250
|
-
metadata) {
|
|
180
|
+
function lastMessageFromMetadata(metadata) {
|
|
251
181
|
return metadata?.documentSchema?.runtime?.explicitSchemaControl
|
|
252
182
|
? metadata?.lastMessage
|
|
253
183
|
: metadata?.message;
|
|
@@ -279,7 +209,6 @@ export async function loadContainerRuntime(params) {
|
|
|
279
209
|
return ContainerRuntime.loadRuntime(params);
|
|
280
210
|
}
|
|
281
211
|
const defaultMaxConsecutiveReconnects = 7;
|
|
282
|
-
const defaultTelemetrySignalSampleCount = 100;
|
|
283
212
|
/**
|
|
284
213
|
* Represents the runtime of the container. Contains helper functions/state of the container.
|
|
285
214
|
* It will define the store level mappings.
|
|
@@ -335,15 +264,13 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
335
264
|
const [chunks, recentBatchInfo, metadata, electedSummarizerData, aliases, serializedIdCompressor,] = await Promise.all([
|
|
336
265
|
tryFetchBlob(chunksBlobName),
|
|
337
266
|
tryFetchBlob(recentBatchInfoBlobName),
|
|
338
|
-
// eslint-disable-next-line import/no-deprecated
|
|
339
267
|
tryFetchBlob(metadataBlobName),
|
|
340
|
-
// eslint-disable-next-line import/no-deprecated
|
|
341
268
|
tryFetchBlob(electedSummarizerBlobName),
|
|
342
269
|
tryFetchBlob(aliasBlobName),
|
|
343
270
|
tryFetchBlob(idCompressorBlobName),
|
|
344
271
|
]);
|
|
345
272
|
// read snapshot blobs needed for BlobManager to load
|
|
346
|
-
const
|
|
273
|
+
const blobManagerLoadInfo = await loadBlobManagerLoadInfo(context);
|
|
347
274
|
const messageAtLastSummary = lastMessageFromMetadata(metadata);
|
|
348
275
|
// Verify summary runtime sequence number matches protocol sequence number.
|
|
349
276
|
const runtimeSequenceNumber = messageAtLastSummary?.sequenceNumber;
|
|
@@ -447,7 +374,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
447
374
|
};
|
|
448
375
|
const compressionLz4 = compressionOptions.minimumBatchSizeInBytes !== Number.POSITIVE_INFINITY &&
|
|
449
376
|
compressionOptions.compressionAlgorithm === "lz4";
|
|
450
|
-
// eslint-disable-next-line import/no-deprecated
|
|
451
377
|
const documentSchemaController = new DocumentsSchemaController(existing, protocolSequenceNumber, metadata?.documentSchema, {
|
|
452
378
|
explicitSchemaControl,
|
|
453
379
|
compressionLz4,
|
|
@@ -475,7 +401,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
475
401
|
enableGroupedBatching,
|
|
476
402
|
explicitSchemaControl,
|
|
477
403
|
};
|
|
478
|
-
const runtime = new containerRuntimeCtor(context, registry, metadata, electedSummarizerData, chunks ?? [], aliases ?? [], internalRuntimeOptions, containerScope, logger, existing,
|
|
404
|
+
const runtime = new containerRuntimeCtor(context, registry, metadata, electedSummarizerData, chunks ?? [], aliases ?? [], internalRuntimeOptions, containerScope, logger, existing, blobManagerLoadInfo, context.storage, createIdCompressorFn, documentSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler, undefined, // summaryConfiguration
|
|
479
405
|
recentBatchInfo);
|
|
480
406
|
runtime.blobManager.stashedBlobsUploadP.then(() => {
|
|
481
407
|
// make sure we didn't reconnect before the promise resolved
|
|
@@ -604,23 +530,15 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
604
530
|
return RuntimeCompatDetails;
|
|
605
531
|
}
|
|
606
532
|
/***/
|
|
607
|
-
constructor(context, registry,
|
|
608
|
-
// eslint-disable-next-line import/no-deprecated
|
|
609
|
-
metadata,
|
|
610
|
-
// eslint-disable-next-line import/no-deprecated
|
|
611
|
-
electedSummarizerData, chunks, dataStoreAliasMap, baseRuntimeOptions, containerScope,
|
|
533
|
+
constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope,
|
|
612
534
|
// Create a custom ITelemetryBaseLogger to output telemetry events.
|
|
613
|
-
baseLogger, existing,
|
|
614
|
-
// eslint-disable-next-line import/no-deprecated
|
|
615
|
-
blobManagerSnapshot, _storage, createIdCompressor,
|
|
616
|
-
// eslint-disable-next-line import/no-deprecated
|
|
617
|
-
documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler,
|
|
535
|
+
baseLogger, existing, blobManagerLoadInfo, _storage, createIdCompressor, documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler,
|
|
618
536
|
// eslint-disable-next-line unicorn/no-object-as-default-parameter
|
|
619
537
|
summaryConfiguration = {
|
|
620
538
|
// the defaults
|
|
621
539
|
...DefaultSummaryConfiguration,
|
|
622
540
|
// the runtime configuration overrides
|
|
623
|
-
...
|
|
541
|
+
...runtimeOptions.summaryOptions?.summaryConfigOverrides,
|
|
624
542
|
}, recentBatchInfo) {
|
|
625
543
|
super();
|
|
626
544
|
this.registry = registry;
|
|
@@ -641,17 +559,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
641
559
|
this.ensureNoDataModelChangesCalls = 0;
|
|
642
560
|
this._disposed = false;
|
|
643
561
|
this.emitDirtyDocumentEvent = true;
|
|
644
|
-
this.
|
|
645
|
-
totalSignalsSentInLatencyWindow: 0,
|
|
646
|
-
signalsLost: 0,
|
|
647
|
-
signalsOutOfOrder: 0,
|
|
648
|
-
signalsSentSinceLastLatencyMeasurement: 0,
|
|
649
|
-
broadcastSignalSequenceNumber: 0,
|
|
650
|
-
signalTimestamp: 0,
|
|
651
|
-
roundTripSignalSequenceNumber: undefined,
|
|
652
|
-
trackingSignalSequenceNumber: undefined,
|
|
653
|
-
minimumTrackingSignalSequenceNumber: undefined,
|
|
654
|
-
};
|
|
562
|
+
this.signalTelemetryManager = new SignalTelemetryManager();
|
|
655
563
|
/**
|
|
656
564
|
* It a cache for holding mapping for loading groupIds with its snapshot from the service. Add expiry policy of 1 minute.
|
|
657
565
|
* Starting with 1 min and based on recorded usage we can tweak it later on.
|
|
@@ -665,11 +573,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
665
573
|
this.disposeFn = disposeFn ?? closeFn;
|
|
666
574
|
const maybeLoaderCompatDetails = context;
|
|
667
575
|
validateLoaderCompatibility(maybeLoaderCompatDetails.ILayerCompatDetails, this.disposeFn);
|
|
668
|
-
// Backfill in defaults for the internal runtimeOptions, since they may not be present on the provided runtimeOptions object
|
|
669
|
-
const runtimeOptions = {
|
|
670
|
-
flushMode: defaultFlushMode,
|
|
671
|
-
...baseRuntimeOptions,
|
|
672
|
-
};
|
|
673
576
|
this.mc = createChildMonitoringContext({
|
|
674
577
|
logger: this.baseLogger,
|
|
675
578
|
namespace: "ContainerRuntime",
|
|
@@ -781,7 +684,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
781
684
|
this._deltaManager = outerDeltaManager;
|
|
782
685
|
this.handleContext = new ContainerFluidHandleContext("", this);
|
|
783
686
|
if (summaryConfiguration.state === "enabled") {
|
|
784
|
-
|
|
687
|
+
validateSummaryHeuristicConfiguration(summaryConfiguration);
|
|
785
688
|
}
|
|
786
689
|
this.summariesDisabled = isSummariesDisabled(summaryConfiguration);
|
|
787
690
|
const { maxOpsSinceLastSummary = 0, initialSummarizerDelayMs = 0 } = isSummariesDisabled(summaryConfiguration)
|
|
@@ -879,9 +782,14 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
879
782
|
// what is the interface of passing signals, we need the
|
|
880
783
|
// downstream stores to wrap the signal.
|
|
881
784
|
parentContext.submitSignal = (type, content, targetClientId) => {
|
|
785
|
+
// Future: Can the `content` argument type be IEnvelope?
|
|
786
|
+
// verifyNotClosed is called in FluidDataStoreContext, which is *the* expected caller.
|
|
882
787
|
const envelope1 = content;
|
|
883
|
-
const envelope2 =
|
|
884
|
-
|
|
788
|
+
const envelope2 = createNewSignalEnvelope(envelope1.address, type, envelope1.contents);
|
|
789
|
+
if (targetClientId === undefined) {
|
|
790
|
+
this.signalTelemetryManager.applyTrackingToBroadcastSignalEnvelope(envelope2);
|
|
791
|
+
}
|
|
792
|
+
this.submitSignalFn(envelope2, targetClientId);
|
|
885
793
|
};
|
|
886
794
|
let snapshot = getSummaryForDatastores(baseSnapshot, metadata);
|
|
887
795
|
if (snapshot !== undefined && snapshotWithContents !== undefined) {
|
|
@@ -896,8 +804,8 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
896
804
|
}), (path) => this.garbageCollector.isNodeDeleted(path), new Map(dataStoreAliasMap), async (runtime) => provideEntryPoint);
|
|
897
805
|
this.blobManager = new BlobManager({
|
|
898
806
|
routeContext: this.handleContext,
|
|
899
|
-
|
|
900
|
-
|
|
807
|
+
blobManagerLoadInfo,
|
|
808
|
+
storage: this.storage,
|
|
901
809
|
sendBlobAttachOp: (localId, blobId) => {
|
|
902
810
|
if (!this.disposed) {
|
|
903
811
|
this.submit({ type: ContainerMessageType.BlobAttach, contents: undefined }, undefined, {
|
|
@@ -985,10 +893,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
985
893
|
const orderedClientElectionForSummarizer = new OrderedClientElection(orderedClientLogger, orderedClientCollection, electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber, SummarizerClientElection.isClientEligible, this.mc.config.getBoolean("Fluid.ContainerRuntime.OrderedClientElection.EnablePerformanceEvents"));
|
|
986
894
|
this.summarizerClientElection = new SummarizerClientElection(orderedClientLogger, summaryCollection, orderedClientElectionForSummarizer, maxOpsSinceLastSummary);
|
|
987
895
|
if (isSummarizerClient) {
|
|
988
|
-
|
|
989
|
-
this._summarizer = new Summarizer(this /* ISummarizerRuntime */, () => summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, summaryCollection,
|
|
990
|
-
// eslint-disable-next-line import/no-deprecated
|
|
991
|
-
async (runtime) => RunWhileConnectedCoordinator.create(runtime,
|
|
896
|
+
this._summarizer = new Summarizer(this /* ISummarizerRuntime */, () => summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, summaryCollection, async (runtime) => RunWhileConnectedCoordinator.create(runtime,
|
|
992
897
|
// Summarization runs in summarizer client and needs access to the real (non-proxy) active
|
|
993
898
|
// information. The proxy delta manager would always return false for summarizer client.
|
|
994
899
|
() => this.innerDeltaManager.active));
|
|
@@ -1016,7 +921,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1016
921
|
summaryCollection.on("default", defaultAction);
|
|
1017
922
|
// Create the SummaryManager and mark the initial state
|
|
1018
923
|
this.summaryManager = new SummaryManager(this.summarizerClientElection, this, // IConnectedState
|
|
1019
|
-
summaryCollection, this.baseLogger,
|
|
924
|
+
summaryCollection, this.baseLogger, formCreateSummarizerFn(loader), new Throttler(60 * 1000, // 60 sec delay window
|
|
1020
925
|
30 * 1000, // 30 sec max delay
|
|
1021
926
|
// throttling function increases exponentially (0ms, 40ms, 80ms, 160ms, etc)
|
|
1022
927
|
formExponentialFn({ coefficient: 20, initialDelay: 0 })), {
|
|
@@ -1051,7 +956,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1051
956
|
summaryFormatVersion: metadata?.summaryFormatVersion,
|
|
1052
957
|
disableIsolatedChannels: metadata?.disableIsolatedChannels,
|
|
1053
958
|
gcVersion: metadata?.gcFeature,
|
|
1054
|
-
options: JSON.stringify(
|
|
959
|
+
options: JSON.stringify(runtimeOptions),
|
|
1055
960
|
idCompressorModeMetadata: metadata?.documentSchema?.runtime?.idCompressorMode,
|
|
1056
961
|
idCompressorMode: this.sessionSchema.idCompressorMode,
|
|
1057
962
|
sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
|
|
@@ -1076,7 +981,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1076
981
|
// saved state, i.e. all the ops marked by Loader layer sa savedOp === true.
|
|
1077
982
|
this.skipSavedCompressorOps = pendingRuntimeState?.pendingIdCompressorState !== undefined;
|
|
1078
983
|
}
|
|
1079
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1080
984
|
onSchemaChange(schema) {
|
|
1081
985
|
this.mc.logger.sendTelemetryEvent({
|
|
1082
986
|
eventName: "SchemaChangeAccept",
|
|
@@ -1287,13 +1191,11 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1287
1191
|
}
|
|
1288
1192
|
if (id === blobManagerBasePath && requestParser.isLeaf(2)) {
|
|
1289
1193
|
const blob = await this.blobManager.getBlob(requestParser.pathParts[1]);
|
|
1290
|
-
return
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
}
|
|
1296
|
-
: create404Response(request);
|
|
1194
|
+
return {
|
|
1195
|
+
status: 200,
|
|
1196
|
+
mimeType: "fluid/object",
|
|
1197
|
+
value: blob,
|
|
1198
|
+
};
|
|
1297
1199
|
}
|
|
1298
1200
|
else if (requestParser.pathParts.length > 0) {
|
|
1299
1201
|
return await this.channelCollection.request(request);
|
|
@@ -1324,7 +1226,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1324
1226
|
const documentSchema = this.documentsSchemaController.summarizeDocumentSchema(this.deltaManager.lastSequenceNumber);
|
|
1325
1227
|
// Is document schema explicit control on?
|
|
1326
1228
|
const explicitSchemaControl = documentSchema?.runtime.explicitSchemaControl;
|
|
1327
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1328
1229
|
const metadata = {
|
|
1329
1230
|
...this.createContainerMetadata,
|
|
1330
1231
|
// Increment the summary number for the next summary that will be generated.
|
|
@@ -1338,8 +1239,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1338
1239
|
// last message's sequence number.
|
|
1339
1240
|
// See also lastMessageFromMetadata()
|
|
1340
1241
|
message: explicitSchemaControl
|
|
1341
|
-
?
|
|
1342
|
-
{ sequenceNumber: -1 }
|
|
1242
|
+
? { sequenceNumber: -1 }
|
|
1343
1243
|
: message,
|
|
1344
1244
|
lastMessage: explicitSchemaControl ? message : undefined,
|
|
1345
1245
|
documentSchema,
|
|
@@ -1561,14 +1461,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1561
1461
|
if (connected) {
|
|
1562
1462
|
assert(this.attachState === AttachState.Attached, 0x3cd /* Connection is possible only if container exists in storage */);
|
|
1563
1463
|
if (changeOfState) {
|
|
1564
|
-
this.
|
|
1565
|
-
this._signalTracking.signalsOutOfOrder = 0;
|
|
1566
|
-
this._signalTracking.signalTimestamp = 0;
|
|
1567
|
-
this._signalTracking.signalsSentSinceLastLatencyMeasurement = 0;
|
|
1568
|
-
this._signalTracking.totalSignalsSentInLatencyWindow = 0;
|
|
1569
|
-
this._signalTracking.roundTripSignalSequenceNumber = undefined;
|
|
1570
|
-
this._signalTracking.trackingSignalSequenceNumber = undefined;
|
|
1571
|
-
this._signalTracking.minimumTrackingSignalSequenceNumber = undefined;
|
|
1464
|
+
this.signalTelemetryManager.resetTracking();
|
|
1572
1465
|
}
|
|
1573
1466
|
}
|
|
1574
1467
|
// Fail while disconnected
|
|
@@ -1867,9 +1760,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1867
1760
|
break;
|
|
1868
1761
|
}
|
|
1869
1762
|
case ContainerMessageType.DocumentSchemaChange: {
|
|
1870
|
-
this.documentsSchemaController.processDocumentSchemaMessages(
|
|
1871
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1872
|
-
contents, local, message.sequenceNumber);
|
|
1763
|
+
this.documentsSchemaController.processDocumentSchemaMessages(contents, local, message.sequenceNumber);
|
|
1873
1764
|
break;
|
|
1874
1765
|
}
|
|
1875
1766
|
default: {
|
|
@@ -1899,90 +1790,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1899
1790
|
}
|
|
1900
1791
|
}
|
|
1901
1792
|
}
|
|
1902
|
-
/**
|
|
1903
|
-
* Emits the Signal event and update the perf signal data.
|
|
1904
|
-
*/
|
|
1905
|
-
sendSignalTelemetryEvent() {
|
|
1906
|
-
const duration = Date.now() - this._signalTracking.signalTimestamp;
|
|
1907
|
-
this.mc.logger.sendPerformanceEvent({
|
|
1908
|
-
eventName: "SignalLatency",
|
|
1909
|
-
details: {
|
|
1910
|
-
duration, // Roundtrip duration of the tracked signal in milliseconds.
|
|
1911
|
-
sent: this._signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.
|
|
1912
|
-
lost: this._signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.
|
|
1913
|
-
outOfOrder: this._signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.
|
|
1914
|
-
reconnectCount: this.consecutiveReconnects, // Container reconnect count.
|
|
1915
|
-
},
|
|
1916
|
-
});
|
|
1917
|
-
this._signalTracking.signalsLost = 0;
|
|
1918
|
-
this._signalTracking.signalsOutOfOrder = 0;
|
|
1919
|
-
this._signalTracking.signalTimestamp = 0;
|
|
1920
|
-
this._signalTracking.totalSignalsSentInLatencyWindow = 0;
|
|
1921
|
-
}
|
|
1922
|
-
/**
|
|
1923
|
-
* Updates signal telemetry including emitting telemetry events.
|
|
1924
|
-
*/
|
|
1925
|
-
processSignalForTelemetry(envelope) {
|
|
1926
|
-
const { clientBroadcastSignalSequenceNumber, contents: envelopeContents, address: envelopeAddress, } = envelope;
|
|
1927
|
-
if (clientBroadcastSignalSequenceNumber === undefined) {
|
|
1928
|
-
return;
|
|
1929
|
-
}
|
|
1930
|
-
if (this._signalTracking.trackingSignalSequenceNumber === undefined ||
|
|
1931
|
-
this._signalTracking.minimumTrackingSignalSequenceNumber === undefined) {
|
|
1932
|
-
return;
|
|
1933
|
-
}
|
|
1934
|
-
if (clientBroadcastSignalSequenceNumber >= this._signalTracking.trackingSignalSequenceNumber) {
|
|
1935
|
-
// Calculate the number of signals lost and log the event.
|
|
1936
|
-
const signalsLost = clientBroadcastSignalSequenceNumber -
|
|
1937
|
-
this._signalTracking.trackingSignalSequenceNumber;
|
|
1938
|
-
if (signalsLost > 0) {
|
|
1939
|
-
this._signalTracking.signalsLost += signalsLost;
|
|
1940
|
-
this.mc.logger.sendErrorEvent({
|
|
1941
|
-
eventName: "SignalLost",
|
|
1942
|
-
details: {
|
|
1943
|
-
signalsLost, // Number of lost signals detected.
|
|
1944
|
-
expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
|
|
1945
|
-
clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
|
|
1946
|
-
},
|
|
1947
|
-
});
|
|
1948
|
-
}
|
|
1949
|
-
// Update the tracking signal sequence number to the next expected signal in the sequence.
|
|
1950
|
-
this._signalTracking.trackingSignalSequenceNumber =
|
|
1951
|
-
clientBroadcastSignalSequenceNumber + 1;
|
|
1952
|
-
}
|
|
1953
|
-
else if (
|
|
1954
|
-
// Check if this is a signal in range of interest.
|
|
1955
|
-
clientBroadcastSignalSequenceNumber >=
|
|
1956
|
-
this._signalTracking.minimumTrackingSignalSequenceNumber) {
|
|
1957
|
-
this._signalTracking.signalsOutOfOrder++;
|
|
1958
|
-
const details = {
|
|
1959
|
-
expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
|
|
1960
|
-
clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
|
|
1961
|
-
};
|
|
1962
|
-
// Only log `contents.type` when address is for container to avoid
|
|
1963
|
-
// chance that contents type is customer data.
|
|
1964
|
-
if (envelopeAddress === undefined) {
|
|
1965
|
-
details.contentsType = envelopeContents.type; // Type of signal that was received out of order.
|
|
1966
|
-
}
|
|
1967
|
-
this.mc.logger.sendTelemetryEvent({
|
|
1968
|
-
eventName: "SignalOutOfOrder",
|
|
1969
|
-
details,
|
|
1970
|
-
});
|
|
1971
|
-
}
|
|
1972
|
-
if (this._signalTracking.roundTripSignalSequenceNumber !== undefined &&
|
|
1973
|
-
clientBroadcastSignalSequenceNumber >= this._signalTracking.roundTripSignalSequenceNumber) {
|
|
1974
|
-
if (clientBroadcastSignalSequenceNumber ===
|
|
1975
|
-
this._signalTracking.roundTripSignalSequenceNumber) {
|
|
1976
|
-
// Latency tracked signal has been received.
|
|
1977
|
-
// We now log the roundtrip duration of the tracked signal.
|
|
1978
|
-
// This telemetry event also logs metrics for broadcast signals
|
|
1979
|
-
// sent, lost, and out of order.
|
|
1980
|
-
// These metrics are reset after logging the telemetry event.
|
|
1981
|
-
this.sendSignalTelemetryEvent();
|
|
1982
|
-
}
|
|
1983
|
-
this._signalTracking.roundTripSignalSequenceNumber = undefined;
|
|
1984
|
-
}
|
|
1985
|
-
}
|
|
1986
1793
|
processSignal(message, local) {
|
|
1987
1794
|
const envelope = message.content;
|
|
1988
1795
|
const transformed = {
|
|
@@ -1993,7 +1800,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1993
1800
|
};
|
|
1994
1801
|
// Only collect signal telemetry for broadcast messages sent by the current client.
|
|
1995
1802
|
if (message.clientId === this.clientId) {
|
|
1996
|
-
this.
|
|
1803
|
+
this.signalTelemetryManager.trackReceivedSignal(envelope, this.mc.logger, this.consecutiveReconnects);
|
|
1997
1804
|
}
|
|
1998
1805
|
if (envelope.address === undefined) {
|
|
1999
1806
|
// No address indicates a container signal message.
|
|
@@ -2161,43 +1968,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
2161
1968
|
}
|
|
2162
1969
|
return true;
|
|
2163
1970
|
}
|
|
2164
|
-
createNewSignalEnvelope(address, type, content) {
|
|
2165
|
-
const newEnvelope = {
|
|
2166
|
-
address,
|
|
2167
|
-
contents: { type, content },
|
|
2168
|
-
};
|
|
2169
|
-
return newEnvelope;
|
|
2170
|
-
}
|
|
2171
|
-
submitEnvelopedSignal(envelope, targetClientId) {
|
|
2172
|
-
const isBroadcastSignal = targetClientId === undefined;
|
|
2173
|
-
if (isBroadcastSignal) {
|
|
2174
|
-
const clientBroadcastSignalSequenceNumber = ++this._signalTracking
|
|
2175
|
-
.broadcastSignalSequenceNumber;
|
|
2176
|
-
// Stamp with the broadcast signal sequence number.
|
|
2177
|
-
envelope.clientBroadcastSignalSequenceNumber = clientBroadcastSignalSequenceNumber;
|
|
2178
|
-
this._signalTracking.signalsSentSinceLastLatencyMeasurement++;
|
|
2179
|
-
if (this._signalTracking.minimumTrackingSignalSequenceNumber === undefined ||
|
|
2180
|
-
this._signalTracking.trackingSignalSequenceNumber === undefined) {
|
|
2181
|
-
// Signal monitoring window is undefined
|
|
2182
|
-
// Initialize tracking to expect the next signal sent by the connected client.
|
|
2183
|
-
this._signalTracking.minimumTrackingSignalSequenceNumber =
|
|
2184
|
-
clientBroadcastSignalSequenceNumber;
|
|
2185
|
-
this._signalTracking.trackingSignalSequenceNumber =
|
|
2186
|
-
clientBroadcastSignalSequenceNumber;
|
|
2187
|
-
}
|
|
2188
|
-
// We should not track the round trip of a new signal in the case we are already tracking one.
|
|
2189
|
-
if (clientBroadcastSignalSequenceNumber % defaultTelemetrySignalSampleCount === 1 &&
|
|
2190
|
-
this._signalTracking.roundTripSignalSequenceNumber === undefined) {
|
|
2191
|
-
this._signalTracking.signalTimestamp = Date.now();
|
|
2192
|
-
this._signalTracking.roundTripSignalSequenceNumber =
|
|
2193
|
-
clientBroadcastSignalSequenceNumber;
|
|
2194
|
-
this._signalTracking.totalSignalsSentInLatencyWindow +=
|
|
2195
|
-
this._signalTracking.signalsSentSinceLastLatencyMeasurement;
|
|
2196
|
-
this._signalTracking.signalsSentSinceLastLatencyMeasurement = 0;
|
|
2197
|
-
}
|
|
2198
|
-
}
|
|
2199
|
-
this.submitSignalFn(envelope, targetClientId);
|
|
2200
|
-
}
|
|
2201
1971
|
/**
|
|
2202
1972
|
* Submits the signal to be sent to other clients.
|
|
2203
1973
|
* @param type - Type of the signal.
|
|
@@ -2212,8 +1982,11 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
2212
1982
|
*/
|
|
2213
1983
|
submitSignal(type, content, targetClientId) {
|
|
2214
1984
|
this.verifyNotClosed();
|
|
2215
|
-
const envelope =
|
|
2216
|
-
|
|
1985
|
+
const envelope = createNewSignalEnvelope(undefined /* address */, type, content);
|
|
1986
|
+
if (targetClientId === undefined) {
|
|
1987
|
+
this.signalTelemetryManager.applyTrackingToBroadcastSignalEnvelope(envelope);
|
|
1988
|
+
}
|
|
1989
|
+
this.submitSignalFn(envelope, targetClientId);
|
|
2217
1990
|
}
|
|
2218
1991
|
setAttachState(attachState) {
|
|
2219
1992
|
if (attachState === AttachState.Attaching) {
|
|
@@ -2367,13 +2140,10 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
2367
2140
|
* Returns the type of the GC node. Currently, there are nodes that belong to the root ("/"), data stores or
|
|
2368
2141
|
* blob manager.
|
|
2369
2142
|
*/
|
|
2370
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2371
2143
|
getNodeType(nodePath) {
|
|
2372
2144
|
if (isBlobPath(nodePath)) {
|
|
2373
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2374
2145
|
return GCNodeType.Blob;
|
|
2375
2146
|
}
|
|
2376
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2377
2147
|
return this.channelCollection.getGCNodeType(nodePath) ?? GCNodeType.Other;
|
|
2378
2148
|
}
|
|
2379
2149
|
/**
|
|
@@ -2387,13 +2157,10 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
2387
2157
|
return ["_gcRoot"];
|
|
2388
2158
|
}
|
|
2389
2159
|
switch (this.getNodeType(nodePath)) {
|
|
2390
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2391
2160
|
case GCNodeType.Blob: {
|
|
2392
2161
|
return [blobManagerBasePath];
|
|
2393
2162
|
}
|
|
2394
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2395
2163
|
case GCNodeType.DataStore:
|
|
2396
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2397
2164
|
case GCNodeType.SubDataStore: {
|
|
2398
2165
|
return this.channelCollection.getDataStorePackagePath(nodePath);
|
|
2399
2166
|
}
|
|
@@ -2461,7 +2228,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
2461
2228
|
* op processing, updating SummarizerNode state tracking, and garbage collection.
|
|
2462
2229
|
* @param options - options controlling how the summary is generated or submitted
|
|
2463
2230
|
*/
|
|
2464
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2465
2231
|
async submitSummary(options) {
|
|
2466
2232
|
const { cancellationToken, fullTree = false, finalAttempt = false, summaryLogger, latestSummaryRefSeqNum, } = options;
|
|
2467
2233
|
// The summary number for this summary. This will be updated during the summary process, so get it now and
|
|
@@ -3063,7 +2829,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
3063
2829
|
/**
|
|
3064
2830
|
* Implementation of ISummarizerInternalsProvider.refreshLatestSummaryAck
|
|
3065
2831
|
*/
|
|
3066
|
-
// eslint-disable-next-line import/no-deprecated
|
|
3067
2832
|
async refreshLatestSummaryAck(options) {
|
|
3068
2833
|
const { proposalHandle, ackHandle, summaryRefSeq, summaryLogger } = options;
|
|
3069
2834
|
// proposalHandle is always passed from RunningSummarizer.
|
|
@@ -3222,27 +2987,15 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
3222
2987
|
return this.summaryManager.enqueueSummarize(options);
|
|
3223
2988
|
}
|
|
3224
2989
|
}
|
|
3225
|
-
/**
|
|
3226
|
-
* Forms a function that will create and retrieve a Summarizer.
|
|
3227
|
-
*/
|
|
3228
|
-
formCreateSummarizerFn(loader) {
|
|
3229
|
-
return async () => {
|
|
3230
|
-
return createSummarizer(loader, `/${summarizerRequestUrl}`);
|
|
3231
|
-
};
|
|
3232
|
-
}
|
|
3233
|
-
validateSummaryHeuristicConfiguration(configuration) {
|
|
3234
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
3235
|
-
for (const prop in configuration) {
|
|
3236
|
-
if (typeof configuration[prop] === "number" && configuration[prop] < 0) {
|
|
3237
|
-
throw new UsageError(`Summary heuristic configuration property "${prop}" cannot be less than 0`);
|
|
3238
|
-
}
|
|
3239
|
-
}
|
|
3240
|
-
if (configuration.minIdleTime > configuration.maxIdleTime) {
|
|
3241
|
-
throw new UsageError(`"minIdleTime" [${configuration.minIdleTime}] cannot be greater than "maxIdleTime" [${configuration.maxIdleTime}]`);
|
|
3242
|
-
}
|
|
3243
|
-
}
|
|
3244
2990
|
get groupedBatchingEnabled() {
|
|
3245
2991
|
return this.sessionSchema.opGroupingEnabled === true;
|
|
3246
2992
|
}
|
|
3247
2993
|
}
|
|
2994
|
+
export function createNewSignalEnvelope(address, type, content) {
|
|
2995
|
+
const newEnvelope = {
|
|
2996
|
+
address,
|
|
2997
|
+
contents: { type, content },
|
|
2998
|
+
};
|
|
2999
|
+
return newEnvelope;
|
|
3000
|
+
}
|
|
3248
3001
|
//# sourceMappingURL=containerRuntime.js.map
|