@fluidframework/container-runtime 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.3.1.0.125672
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/.eslintrc.js +21 -10
- package/.mocharc.js +2 -2
- package/api-extractor.json +2 -2
- package/dist/batchTracker.d.ts +1 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +2 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +53 -34
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +236 -124
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +11 -9
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +3 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +95 -46
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +288 -135
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +11 -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 +38 -21
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +7 -3
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +3 -1
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/dataStores.d.ts +12 -9
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +68 -46
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +8 -3
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/garbageCollection.d.ts +50 -26
- package/dist/garbageCollection.d.ts.map +1 -1
- package/dist/garbageCollection.js +348 -196
- package/dist/garbageCollection.js.map +1 -1
- package/dist/garbageCollectionConstants.d.ts +7 -3
- package/dist/garbageCollectionConstants.d.ts.map +1 -1
- package/dist/garbageCollectionConstants.js +10 -8
- package/dist/garbageCollectionConstants.js.map +1 -1
- package/dist/garbageCollectionHelpers.d.ts +15 -0
- package/dist/garbageCollectionHelpers.d.ts.map +1 -0
- package/dist/garbageCollectionHelpers.js +27 -0
- package/dist/garbageCollectionHelpers.js.map +1 -0
- package/dist/gcSweepReadyUsageDetection.d.ts +5 -5
- package/dist/gcSweepReadyUsageDetection.d.ts.map +1 -1
- package/dist/gcSweepReadyUsageDetection.js +14 -10
- package/dist/gcSweepReadyUsageDetection.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +13 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +48 -7
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +25 -1
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +2 -2
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +2 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +24 -10
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +2 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +33 -17
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +34 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +117 -5
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +5 -0
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +38 -27
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +17 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.d.ts.map +1 -1
- package/dist/opProperties.js +1 -3
- package/dist/opProperties.js.map +1 -1
- package/dist/orderedClientElection.d.ts.map +1 -1
- package/dist/orderedClientElection.js +10 -4
- package/dist/orderedClientElection.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.d.ts +4 -13
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +134 -161
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/runningSummarizer.d.ts.map +1 -1
- package/dist/runningSummarizer.js +34 -22
- package/dist/runningSummarizer.js.map +1 -1
- package/dist/scheduleManager.d.ts +0 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +11 -21
- package/dist/scheduleManager.js.map +1 -1
- package/dist/serializedSnapshotStorage.d.ts.map +1 -1
- package/dist/serializedSnapshotStorage.js +3 -1
- package/dist/serializedSnapshotStorage.js.map +1 -1
- package/dist/summarizer.d.ts +2 -3
- package/dist/summarizer.d.ts.map +1 -1
- package/dist/summarizer.js +39 -18
- package/dist/summarizer.js.map +1 -1
- package/dist/summarizerClientElection.d.ts +1 -2
- package/dist/summarizerClientElection.d.ts.map +1 -1
- package/dist/summarizerClientElection.js +3 -30
- package/dist/summarizerClientElection.js.map +1 -1
- package/dist/summarizerHandle.d.ts.map +1 -1
- package/dist/summarizerHandle.js.map +1 -1
- package/dist/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summarizerHeuristics.js +6 -9
- package/dist/summarizerHeuristics.js.map +1 -1
- package/dist/summarizerTypes.d.ts +22 -25
- package/dist/summarizerTypes.d.ts.map +1 -1
- package/dist/summarizerTypes.js.map +1 -1
- package/dist/summaryCollection.d.ts.map +1 -1
- package/dist/summaryCollection.js +18 -8
- package/dist/summaryCollection.js.map +1 -1
- package/dist/summaryFormat.d.ts.map +1 -1
- package/dist/summaryFormat.js +18 -11
- package/dist/summaryFormat.js.map +1 -1
- package/dist/summaryGenerator.d.ts.map +1 -1
- package/dist/summaryGenerator.js +32 -14
- package/dist/summaryGenerator.js.map +1 -1
- package/dist/summaryManager.d.ts.map +1 -1
- package/dist/summaryManager.js +21 -9
- package/dist/summaryManager.js.map +1 -1
- package/dist/throttler.d.ts +2 -2
- package/dist/throttler.d.ts.map +1 -1
- package/dist/throttler.js +4 -4
- package/dist/throttler.js.map +1 -1
- package/garbageCollection.md +15 -2
- package/lib/batchTracker.d.ts +1 -2
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +53 -34
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +239 -127
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +11 -9
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +3 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +95 -46
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +291 -138
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +11 -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 +40 -23
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +7 -3
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js +3 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/dataStores.d.ts +12 -9
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +74 -52
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +9 -4
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/garbageCollection.d.ts +50 -26
- package/lib/garbageCollection.d.ts.map +1 -1
- package/lib/garbageCollection.js +347 -195
- package/lib/garbageCollection.js.map +1 -1
- package/lib/garbageCollectionConstants.d.ts +7 -3
- package/lib/garbageCollectionConstants.d.ts.map +1 -1
- package/lib/garbageCollectionConstants.js +9 -7
- package/lib/garbageCollectionConstants.js.map +1 -1
- package/lib/garbageCollectionHelpers.d.ts +15 -0
- package/lib/garbageCollectionHelpers.d.ts.map +1 -0
- package/lib/garbageCollectionHelpers.js +23 -0
- package/lib/garbageCollectionHelpers.js.map +1 -0
- package/lib/gcSweepReadyUsageDetection.d.ts +5 -5
- package/lib/gcSweepReadyUsageDetection.d.ts.map +1 -1
- package/lib/gcSweepReadyUsageDetection.js +14 -10
- package/lib/gcSweepReadyUsageDetection.js.map +1 -1
- package/lib/index.d.ts +3 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -3
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +13 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +48 -7
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +25 -1
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +2 -2
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +1 -1
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +24 -10
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +2 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +33 -17
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +34 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +116 -5
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +5 -0
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +38 -27
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +17 -2
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.d.ts.map +1 -1
- package/lib/opProperties.js +1 -3
- package/lib/opProperties.js.map +1 -1
- package/lib/orderedClientElection.d.ts.map +1 -1
- package/lib/orderedClientElection.js +10 -4
- package/lib/orderedClientElection.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.d.ts +4 -13
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +134 -161
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/runningSummarizer.d.ts.map +1 -1
- package/lib/runningSummarizer.js +35 -23
- package/lib/runningSummarizer.js.map +1 -1
- package/lib/scheduleManager.d.ts +0 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +11 -21
- package/lib/scheduleManager.js.map +1 -1
- package/lib/serializedSnapshotStorage.d.ts.map +1 -1
- package/lib/serializedSnapshotStorage.js +3 -1
- package/lib/serializedSnapshotStorage.js.map +1 -1
- package/lib/summarizer.d.ts +2 -3
- package/lib/summarizer.d.ts.map +1 -1
- package/lib/summarizer.js +39 -18
- package/lib/summarizer.js.map +1 -1
- package/lib/summarizerClientElection.d.ts +1 -2
- package/lib/summarizerClientElection.d.ts.map +1 -1
- package/lib/summarizerClientElection.js +3 -30
- package/lib/summarizerClientElection.js.map +1 -1
- package/lib/summarizerHandle.d.ts.map +1 -1
- package/lib/summarizerHandle.js.map +1 -1
- package/lib/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summarizerHeuristics.js +6 -9
- package/lib/summarizerHeuristics.js.map +1 -1
- package/lib/summarizerTypes.d.ts +22 -25
- package/lib/summarizerTypes.d.ts.map +1 -1
- package/lib/summarizerTypes.js.map +1 -1
- package/lib/summaryCollection.d.ts.map +1 -1
- package/lib/summaryCollection.js +18 -8
- package/lib/summaryCollection.js.map +1 -1
- package/lib/summaryFormat.d.ts.map +1 -1
- package/lib/summaryFormat.js +20 -13
- package/lib/summaryFormat.js.map +1 -1
- package/lib/summaryGenerator.d.ts.map +1 -1
- package/lib/summaryGenerator.js +32 -14
- package/lib/summaryGenerator.js.map +1 -1
- package/lib/summaryManager.d.ts.map +1 -1
- package/lib/summaryManager.js +21 -9
- package/lib/summaryManager.js.map +1 -1
- package/lib/throttler.d.ts +2 -2
- package/lib/throttler.d.ts.map +1 -1
- package/lib/throttler.js +4 -4
- package/lib/throttler.js.map +1 -1
- package/package.json +27 -24
- package/prettier.config.cjs +1 -1
- package/src/batchTracker.ts +55 -50
- package/src/blobManager.ts +799 -593
- package/src/connectionTelemetry.ts +280 -249
- package/src/containerHandleContext.ts +27 -29
- package/src/containerRuntime.ts +3123 -2793
- package/src/dataStore.ts +172 -159
- package/src/dataStoreContext.ts +1048 -991
- package/src/dataStoreContexts.ts +178 -161
- package/src/dataStoreRegistry.ts +25 -20
- package/src/dataStores.ts +784 -711
- package/src/deltaScheduler.ts +158 -150
- package/src/garbageCollection.ts +1795 -1546
- package/src/garbageCollectionConstants.ts +10 -7
- package/src/garbageCollectionHelpers.ts +37 -0
- package/src/gcSweepReadyUsageDetection.ts +89 -83
- package/src/index.ts +67 -69
- package/src/opLifecycle/batchManager.ts +148 -86
- package/src/opLifecycle/definitions.ts +45 -19
- package/src/opLifecycle/index.ts +6 -5
- package/src/opLifecycle/opCompressor.ts +57 -39
- package/src/opLifecycle/opDecompressor.ts +104 -64
- package/src/opLifecycle/opSplitter.ts +226 -66
- package/src/opLifecycle/outbox.ts +206 -182
- package/src/opLifecycle/remoteMessageProcessor.ts +63 -47
- package/src/opProperties.ts +11 -9
- package/src/orderedClientElection.ts +489 -457
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +379 -381
- package/src/runWhileConnectedCoordinator.ts +78 -71
- package/src/runningSummarizer.ts +619 -582
- package/src/scheduleManager.ts +299 -280
- package/src/serializedSnapshotStorage.ts +116 -111
- package/src/summarizer.ts +417 -381
- package/src/summarizerClientElection.ts +107 -129
- package/src/summarizerHandle.ts +11 -9
- package/src/summarizerHeuristics.ts +183 -186
- package/src/summarizerTypes.ts +344 -333
- package/src/summaryCollection.ts +378 -349
- package/src/summaryFormat.ts +146 -127
- package/src/summaryGenerator.ts +464 -406
- package/src/summaryManager.ts +377 -348
- package/src/throttler.ts +131 -122
- package/tsconfig.esnext.json +6 -6
- package/tsconfig.json +9 -13
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { GCVersion } from "./summaryFormat";
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
export const
|
|
9
|
-
|
|
10
|
-
export const
|
|
11
|
-
// The key for tombstone blob in the GC tree in summary.
|
|
12
|
-
export const gcTombstoneBlobKey = "__tombstones";
|
|
8
|
+
/** The stable version of garbage collection in production. */
|
|
9
|
+
export const stableGCVersion: GCVersion = 1;
|
|
10
|
+
/** The current version of garbage collection. */
|
|
11
|
+
export const currentGCVersion: GCVersion = 2;
|
|
13
12
|
|
|
14
13
|
// Feature gate key to turn GC on / off.
|
|
15
14
|
export const runGCKey = "Fluid.GarbageCollection.RunGC";
|
|
@@ -25,8 +24,12 @@ export const trackGCStateKey = "Fluid.GarbageCollection.TrackGCState";
|
|
|
25
24
|
export const disableSweepLogKey = "Fluid.GarbageCollection.DisableSweepLog";
|
|
26
25
|
// Feature gate key to disable the tombstone feature, i.e., tombstone information is not read / written into summary.
|
|
27
26
|
export const disableTombstoneKey = "Fluid.GarbageCollection.DisableTombstone";
|
|
28
|
-
// Feature gate to enable throwing an error when tombstone object is
|
|
27
|
+
// Feature gate to enable throwing an error when tombstone object is loaded (requested).
|
|
28
|
+
export const throwOnTombstoneLoadKey = "Fluid.GarbageCollection.ThrowOnTombstoneLoad";
|
|
29
|
+
// Feature gate to enable throwing an error when tombstone object is used (e.g. outgoing or incoming ops).
|
|
29
30
|
export const throwOnTombstoneUsageKey = "Fluid.GarbageCollection.ThrowOnTombstoneUsage";
|
|
31
|
+
// Feature gate to enable GC version upgrade.
|
|
32
|
+
export const gcVersionUpgradeToV2Key = "Fluid.GarbageCollection.GCVersionUpgradeToV2";
|
|
30
33
|
|
|
31
34
|
// One day in milliseconds.
|
|
32
35
|
export const oneDayMs = 1 * 24 * 60 * 60 * 1000;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ITelemetryGenericEvent } from "@fluidframework/common-definitions";
|
|
7
|
+
import { packagePathToTelemetryProperty } from "@fluidframework/runtime-utils";
|
|
8
|
+
import { MonitoringContext } from "@fluidframework/telemetry-utils";
|
|
9
|
+
import {
|
|
10
|
+
disableTombstoneKey,
|
|
11
|
+
runSweepKey,
|
|
12
|
+
throwOnTombstoneLoadKey,
|
|
13
|
+
throwOnTombstoneUsageKey,
|
|
14
|
+
} from "./garbageCollectionConstants";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Consolidates info / logic for logging when we encounter unexpected usage of GC'd objects. For example, when a
|
|
18
|
+
* tombstoned or deleted object is loaded.
|
|
19
|
+
*/
|
|
20
|
+
export function sendGCUnexpectedUsageEvent(
|
|
21
|
+
mc: MonitoringContext,
|
|
22
|
+
event: ITelemetryGenericEvent & { category: "error" | "generic"; isSummarizerClient: boolean },
|
|
23
|
+
packagePath: readonly string[] | undefined,
|
|
24
|
+
error?: unknown,
|
|
25
|
+
) {
|
|
26
|
+
event.pkg = packagePathToTelemetryProperty(packagePath);
|
|
27
|
+
event.tombstoneFlags = JSON.stringify({
|
|
28
|
+
DisableTombstone: mc.config.getBoolean(disableTombstoneKey),
|
|
29
|
+
ThrowOnTombstoneUsage: mc.config.getBoolean(throwOnTombstoneUsageKey),
|
|
30
|
+
ThrowOnTombstoneLoad: mc.config.getBoolean(throwOnTombstoneLoadKey),
|
|
31
|
+
});
|
|
32
|
+
event.sweepFlags = JSON.stringify({
|
|
33
|
+
EnableSweepFlag: mc.config.getBoolean(runSweepKey),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
mc.logger.sendTelemetryEvent(event, error);
|
|
37
|
+
}
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
import { ITelemetryProperties } from "@fluidframework/common-definitions";
|
|
7
7
|
import { ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
8
8
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
IConfigProvider,
|
|
10
|
+
IFluidErrorBase,
|
|
11
|
+
LoggingError,
|
|
12
|
+
MonitoringContext,
|
|
13
13
|
} from "@fluidframework/telemetry-utils";
|
|
14
14
|
import { oneDayMs } from "./garbageCollectionConstants";
|
|
15
15
|
|
|
@@ -17,30 +17,33 @@ import { oneDayMs } from "./garbageCollectionConstants";
|
|
|
17
17
|
* Feature Gate Key -
|
|
18
18
|
* How many days between closing the container from this error (avoids locking user out of their file altogether)
|
|
19
19
|
*/
|
|
20
|
-
export const skipClosureForXDaysKey =
|
|
20
|
+
export const skipClosureForXDaysKey =
|
|
21
|
+
"Fluid.GarbageCollection.Dogfood.SweepReadyUsageDetection.SkipClosureForXDays";
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* LocalStorage key (NOT via feature gate / monitoring context)
|
|
24
25
|
* A map from docId to info about the last time we closed due to this error
|
|
25
26
|
*/
|
|
26
|
-
export const closuresMapLocalStorageKey =
|
|
27
|
+
export const closuresMapLocalStorageKey =
|
|
28
|
+
"Fluid.GarbageCollection.Dogfood.SweepReadyUsageDetection.Closures";
|
|
27
29
|
|
|
28
30
|
/**
|
|
29
31
|
* Feature gate key to enable closing the container if SweepReady objects are used.
|
|
30
32
|
* Value should contain keywords "interactiveClient" and/or "summarizer" to enable detection in each container type
|
|
31
33
|
*/
|
|
32
34
|
const sweepReadyUsageDetectionSetting = {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
read(config: IConfigProvider) {
|
|
36
|
+
const sweepReadyUsageDetectionKey =
|
|
37
|
+
"Fluid.GarbageCollection.Dogfood.SweepReadyUsageDetection";
|
|
38
|
+
const value = config.getString(sweepReadyUsageDetectionKey);
|
|
39
|
+
if (value === undefined) {
|
|
40
|
+
return { interactiveClient: false, summarizer: false };
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
interactiveClient: value.includes("interactiveClient"),
|
|
44
|
+
summarizer: value.includes("summarizer"),
|
|
45
|
+
};
|
|
46
|
+
},
|
|
44
47
|
};
|
|
45
48
|
|
|
46
49
|
/**
|
|
@@ -52,8 +55,8 @@ const sweepReadyUsageDetectionSetting = {
|
|
|
52
55
|
* since only the Summarizer has the latest truth about unreferenced node tracking
|
|
53
56
|
*/
|
|
54
57
|
export class SweepReadyUsageError extends LoggingError implements IFluidErrorBase {
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
/** This errorType will be in temporary use (until Sweep is fully implemented) so don't add to any errorType type */
|
|
59
|
+
public errorType: string = "unreferencedObjectUsedAfterGarbageCollected";
|
|
57
60
|
}
|
|
58
61
|
|
|
59
62
|
/**
|
|
@@ -65,75 +68,78 @@ export class SweepReadyUsageError extends LoggingError implements IFluidErrorBas
|
|
|
65
68
|
* (via skipClosureForXDaysKey above. Uses localStorage and closuresMapLocalStorageKey to implement this behavior)
|
|
66
69
|
*/
|
|
67
70
|
export class SweepReadyUsageDetectionHandler {
|
|
68
|
-
|
|
71
|
+
private readonly localStorage: Pick<Storage, "getItem" | "setItem">;
|
|
69
72
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
constructor(
|
|
74
|
+
private readonly uniqueContainerKey: string,
|
|
75
|
+
private readonly mc: MonitoringContext,
|
|
76
|
+
private readonly closeFn: (error?: ICriticalContainerError) => void,
|
|
77
|
+
localStorageOverride?: Pick<Storage, "getItem" | "setItem">,
|
|
78
|
+
) {
|
|
79
|
+
const noopStorage = { getItem: () => null, setItem: () => {} };
|
|
80
|
+
// localStorage is not defined in Node environment, so fall back to noopStorage if needed.
|
|
81
|
+
this.localStorage = localStorageOverride ?? globalThis.localStorage ?? noopStorage;
|
|
79
82
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
if (this.localStorage === noopStorage) {
|
|
84
|
+
// This means the Skip Closure Period logic will not work.
|
|
85
|
+
this.mc.logger.sendTelemetryEvent({
|
|
86
|
+
eventName: "SweepReadyUsageDetectionHandlerNoopStorage",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
85
90
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
/**
|
|
92
|
+
* If SweepReady Usage Detection is enabled, close the interactive container.
|
|
93
|
+
* If the SkipClosureForXDays setting is set, don't close the container more than once in that period.
|
|
94
|
+
*
|
|
95
|
+
* Once Sweep is fully implemented, this will be removed since the objects will be gone
|
|
96
|
+
* and errors will arise elsewhere in the runtime
|
|
97
|
+
*/
|
|
98
|
+
public usageDetectedInInteractiveClient(errorProps: ITelemetryProperties) {
|
|
99
|
+
if (!sweepReadyUsageDetectionSetting.read(this.mc.config).interactiveClient) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
97
102
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
lastCloseTime = pastClosuresMap[this.uniqueContainerKey]?.lastCloseTime;
|
|
103
|
+
// Default stance is we close every time - this reflects the severity of SweepReady Object Usage.
|
|
104
|
+
// However, we may choose to "throttle" the closures by setting the SkipClosureForXDays setting,
|
|
105
|
+
// which will only allow the container to close once during that period, to avoid locking users out.
|
|
106
|
+
let shouldClose: boolean = true;
|
|
107
|
+
let pastClosuresMap: Record<string, { lastCloseTime: number } | undefined> = {};
|
|
108
|
+
let lastCloseTime: number | undefined;
|
|
109
|
+
const skipClosureForXDays = this.mc.config.getNumber(skipClosureForXDaysKey);
|
|
110
|
+
if (skipClosureForXDays !== undefined) {
|
|
111
|
+
// Read pastClosuresMap from localStorage then extract the lastCloseTime from the map
|
|
112
|
+
try {
|
|
113
|
+
const rawValue = this.localStorage.getItem(closuresMapLocalStorageKey);
|
|
114
|
+
const parsedValue = rawValue === null ? {} : JSON.parse(rawValue);
|
|
115
|
+
if (typeof parsedValue === "object") {
|
|
116
|
+
pastClosuresMap = parsedValue;
|
|
117
|
+
}
|
|
118
|
+
} catch (e) {}
|
|
119
|
+
lastCloseTime = pastClosuresMap[this.uniqueContainerKey]?.lastCloseTime;
|
|
116
120
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
// Don't close if we did already within the Skip Closure Period
|
|
122
|
+
if (
|
|
123
|
+
lastCloseTime !== undefined &&
|
|
124
|
+
Date.now() < lastCloseTime + skipClosureForXDays * oneDayMs
|
|
125
|
+
) {
|
|
126
|
+
shouldClose = false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
122
129
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
this.localStorage.setItem(closuresMapLocalStorageKey, JSON.stringify(pastClosuresMap));
|
|
130
|
+
const error = new SweepReadyUsageError("SweepReady object used in Non-Summarizer Client", {
|
|
131
|
+
errorDetails: JSON.stringify({ ...errorProps, lastCloseTime, skipClosureForXDays }),
|
|
132
|
+
});
|
|
133
|
+
if (shouldClose) {
|
|
134
|
+
// Update closures map in localStorage before closing
|
|
135
|
+
// Note there is a race condition between different tabs updating localStorage and overwriting
|
|
136
|
+
// each others' updates. If so, some tab will crash again. Just reload one at a time to get unstuck
|
|
137
|
+
pastClosuresMap[this.uniqueContainerKey] = { lastCloseTime: Date.now() };
|
|
138
|
+
this.localStorage.setItem(closuresMapLocalStorageKey, JSON.stringify(pastClosuresMap));
|
|
133
139
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
140
|
+
this.closeFn(error);
|
|
141
|
+
} else {
|
|
142
|
+
this.mc.logger.sendErrorEvent({ eventName: "SweepReadyObject_UsageAllowed" }, error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
139
145
|
}
|
package/src/index.ts
CHANGED
|
@@ -4,82 +4,80 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
export {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
7
|
+
ContainerMessageType,
|
|
8
|
+
ContainerRuntimeMessage,
|
|
9
|
+
IGCRuntimeOptions,
|
|
10
|
+
ISummaryRuntimeOptions,
|
|
11
|
+
ISummaryBaseConfiguration,
|
|
12
|
+
ISummaryConfigurationHeuristics,
|
|
13
|
+
ISummaryConfigurationDisableSummarizer,
|
|
14
|
+
ISummaryConfigurationDisableHeuristics,
|
|
15
|
+
IContainerRuntimeOptions,
|
|
16
|
+
IRootSummaryTreeWithStats,
|
|
17
|
+
isRuntimeMessage,
|
|
18
|
+
RuntimeMessage,
|
|
19
|
+
agentSchedulerId,
|
|
20
|
+
ContainerRuntime,
|
|
21
|
+
RuntimeHeaders,
|
|
22
|
+
AllowTombstoneRequestHeaderKey,
|
|
23
|
+
TombstoneResponseHeaderKey,
|
|
24
|
+
ISummaryConfiguration,
|
|
25
|
+
DefaultSummaryConfiguration,
|
|
26
|
+
ICompressionRuntimeOptions,
|
|
27
|
+
CompressionAlgorithms,
|
|
26
28
|
} from "./containerRuntime";
|
|
27
29
|
export { FluidDataStoreRegistry } from "./dataStoreRegistry";
|
|
30
|
+
export { IGCStats } from "./garbageCollection";
|
|
28
31
|
export {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
gcTombstoneBlobKey,
|
|
34
|
-
gcTreeKey,
|
|
35
|
-
} from "./garbageCollectionConstants";
|
|
36
|
-
export {
|
|
37
|
-
IPendingFlush,
|
|
38
|
-
IPendingLocalState,
|
|
39
|
-
IPendingMessage,
|
|
40
|
-
IPendingState,
|
|
32
|
+
IPendingFlush,
|
|
33
|
+
IPendingLocalState,
|
|
34
|
+
IPendingMessage,
|
|
35
|
+
IPendingState,
|
|
41
36
|
} from "./pendingStateManager";
|
|
42
37
|
export { Summarizer } from "./summarizer";
|
|
43
38
|
export {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
39
|
+
EnqueueSummarizeResult,
|
|
40
|
+
IAckSummaryResult,
|
|
41
|
+
IBaseSummarizeResult,
|
|
42
|
+
IBroadcastSummaryResult,
|
|
43
|
+
ICancellationToken,
|
|
44
|
+
IConnectableRuntime,
|
|
45
|
+
IEnqueueSummarizeOptions,
|
|
46
|
+
IGenerateSummaryTreeResult,
|
|
47
|
+
IGeneratedSummaryStats,
|
|
48
|
+
INackSummaryResult,
|
|
49
|
+
IOnDemandSummarizeOptions,
|
|
50
|
+
IProvideSummarizer,
|
|
51
|
+
IRefreshSummaryAckOptions,
|
|
52
|
+
ISubmitSummaryOpResult,
|
|
53
|
+
ISubmitSummaryOptions,
|
|
54
|
+
ISummarizeOptions,
|
|
55
|
+
ISummarizeResults,
|
|
56
|
+
ISummarizer,
|
|
57
|
+
ISummarizerEvents,
|
|
58
|
+
ISummarizerInternalsProvider,
|
|
59
|
+
ISummarizerRuntime,
|
|
60
|
+
ISummarizingWarning,
|
|
61
|
+
ISummaryCancellationToken,
|
|
62
|
+
IUploadSummaryResult,
|
|
63
|
+
SubmitSummaryResult,
|
|
64
|
+
SummarizeResultPart,
|
|
65
|
+
SummarizerStopReason,
|
|
71
66
|
} from "./summarizerTypes";
|
|
72
67
|
export {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
68
|
+
IAckedSummary,
|
|
69
|
+
IClientSummaryWatcher,
|
|
70
|
+
ISummary,
|
|
71
|
+
ISummaryCollectionOpEvents,
|
|
72
|
+
ISummaryAckMessage,
|
|
73
|
+
ISummaryNackMessage,
|
|
74
|
+
ISummaryOpMessage,
|
|
75
|
+
OpActionEventListener,
|
|
76
|
+
OpActionEventName,
|
|
77
|
+
SummaryCollection,
|
|
83
78
|
} from "./summaryCollection";
|
|
84
|
-
export {
|
|
79
|
+
export {
|
|
80
|
+
ICancellableSummarizerController,
|
|
81
|
+
neverCancelledSummaryToken,
|
|
82
|
+
} from "./runWhileConnectedCoordinator";
|
|
85
83
|
export { IChunkedOp, unpackRuntimeMessage } from "./opLifecycle";
|