@fluidframework/container-runtime 2.0.0-internal.5.3.2 → 2.0.0-internal.6.0.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 +80 -0
- package/dist/batchTracker.d.ts +2 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +13 -2
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +103 -25
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +12 -4
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +69 -22
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +344 -238
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +11 -2
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +1 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +40 -44
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.js +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStores.d.ts +21 -5
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +102 -58
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +2 -0
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +5 -5
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +29 -25
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.js +13 -11
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +1 -0
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +5 -6
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +4 -6
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +44 -33
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/id-compressor/idCompressor.d.ts +3 -3
- package/dist/id-compressor/idCompressor.d.ts.map +1 -1
- package/dist/id-compressor/idCompressor.js +52 -52
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/idRange.js +2 -2
- package/dist/id-compressor/idRange.js.map +1 -1
- package/dist/id-compressor/sessionIdNormalizer.js +11 -16
- package/dist/id-compressor/sessionIdNormalizer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.js +10 -6
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +2 -2
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +7 -2
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +2 -2
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +12 -10
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +13 -5
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +2 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +11 -7
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +6 -5
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +6 -14
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +8 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.js +1 -2
- package/dist/opProperties.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 +6 -3
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +41 -32
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +15 -11
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -1
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +18 -19
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +3 -5
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +42 -66
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.js +5 -8
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.js +5 -9
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +8 -12
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +5 -5
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +26 -22
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +13 -16
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summaryCollection.js +3 -5
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.js +1 -2
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +67 -21
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +2 -3
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +9 -7
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +2 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +13 -2
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +103 -25
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +13 -5
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +69 -22
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +343 -238
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +11 -2
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +1 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +42 -46
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.js +2 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStores.d.ts +21 -5
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +103 -59
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js +2 -0
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +6 -6
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +30 -26
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.js +13 -11
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +1 -0
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +5 -6
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +4 -6
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +45 -34
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/id-compressor/idCompressor.d.ts +3 -3
- package/lib/id-compressor/idCompressor.d.ts.map +1 -1
- package/lib/id-compressor/idCompressor.js +52 -52
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/idRange.js +2 -2
- package/lib/id-compressor/idRange.js.map +1 -1
- package/lib/id-compressor/sessionIdNormalizer.js +11 -16
- package/lib/id-compressor/sessionIdNormalizer.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.js +10 -6
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +8 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +13 -11
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +13 -5
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +12 -8
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +6 -5
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +7 -15
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +8 -2
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.js +1 -2
- package/lib/opProperties.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 +6 -3
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +41 -32
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +16 -12
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +19 -20
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +3 -5
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +43 -67
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.js +6 -9
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.js +5 -9
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +8 -12
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +5 -5
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +27 -23
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +14 -17
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summaryCollection.js +3 -5
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.js +1 -2
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +68 -22
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +2 -3
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +10 -8
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +30 -18
- package/src/batchTracker.ts +4 -3
- package/src/blobManager.ts +113 -15
- package/src/connectionTelemetry.ts +7 -3
- package/src/containerRuntime.ts +354 -194
- package/src/dataStore.ts +10 -1
- package/src/dataStoreContext.ts +31 -33
- package/src/dataStoreContexts.ts +2 -2
- package/src/dataStores.ts +108 -71
- package/src/deltaManagerSummarizerProxy.ts +2 -0
- package/src/deltaScheduler.ts +6 -10
- package/src/gc/garbageCollection.ts +13 -8
- package/src/gc/gcHelpers.ts +1 -0
- package/src/gc/gcTelemetry.ts +13 -10
- package/src/id-compressor/idCompressor.ts +6 -5
- package/src/index.ts +0 -1
- package/src/opLifecycle/opCompressor.ts +4 -3
- package/src/opLifecycle/opDecompressor.ts +4 -3
- package/src/opLifecycle/opSplitter.ts +4 -3
- package/src/opLifecycle/outbox.ts +13 -25
- package/src/opLifecycle/remoteMessageProcessor.ts +8 -2
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +34 -25
- package/src/scheduleManager.ts +2 -2
- package/src/summary/orderedClientElection.ts +4 -3
- package/src/summary/runningSummarizer.ts +18 -44
- package/src/summary/summarizer.ts +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +13 -15
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +8 -7
- package/src/summary/summaryGenerator.ts +6 -2
- package/src/summary/summaryManager.ts +9 -5
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
/* eslint-disable @typescript-eslint/restrict-plus-operands */
|
|
5
6
|
import { assert } from "@fluidframework/common-utils";
|
|
6
7
|
import BTree from "sorted-btree";
|
|
8
|
+
import { createChildLogger } from "@fluidframework/telemetry-utils";
|
|
7
9
|
import { hasAtLeastLength, compareFiniteNumbers, compareFiniteNumbersReversed, compareMaps, compareStrings, fail, setPropertyIfDefined, } from "./utils";
|
|
8
10
|
import { assertIsStableId, isStableId } from "./uuidUtilities";
|
|
9
11
|
import { AppendOnlySortedMap } from "./appendOnlySortedMap";
|
|
@@ -44,7 +46,6 @@ export class IdCompressor {
|
|
|
44
46
|
*/
|
|
45
47
|
constructor(localSessionId, logger) {
|
|
46
48
|
this.localSessionId = localSessionId;
|
|
47
|
-
this.logger = logger;
|
|
48
49
|
/**
|
|
49
50
|
* Trivially reach consensus on default cluster size and reserved IDs.
|
|
50
51
|
* These initial values must *NOT* change without careful consideration to compatibility.
|
|
@@ -99,6 +100,7 @@ export class IdCompressor {
|
|
|
99
100
|
*/
|
|
100
101
|
this.finalIdToCluster = new AppendOnlySortedMap(compareFiniteNumbers);
|
|
101
102
|
this.localSession = this.createSession(localSessionId);
|
|
103
|
+
this.logger = createChildLogger({ logger });
|
|
102
104
|
}
|
|
103
105
|
/**
|
|
104
106
|
* The size of each newly created ID cluster.
|
|
@@ -143,9 +145,8 @@ export class IdCompressor {
|
|
|
143
145
|
* it is finalized. Ranges must be sent to the server in the order that they are taken via calls to this method.
|
|
144
146
|
*/
|
|
145
147
|
takeNextCreationRange() {
|
|
146
|
-
var _a;
|
|
147
148
|
const lastLocalInRange = -this.localIdCount;
|
|
148
|
-
const lastTakenNormalized =
|
|
149
|
+
const lastTakenNormalized = this.lastTakenLocalId ?? 0;
|
|
149
150
|
assert(lastLocalInRange <= lastTakenNormalized, 0x485 /* Inconsistent local ID state */);
|
|
150
151
|
let ids;
|
|
151
152
|
if (lastLocalInRange !== lastTakenNormalized) {
|
|
@@ -188,21 +189,20 @@ export class IdCompressor {
|
|
|
188
189
|
* @param range - the range of session-local IDs to finalize.
|
|
189
190
|
*/
|
|
190
191
|
finalizeCreationRange(range) {
|
|
191
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
192
192
|
const { sessionId } = range;
|
|
193
193
|
const isLocal = sessionId === this.localSessionId;
|
|
194
|
-
const session =
|
|
194
|
+
const session = this.sessions.get(sessionId) ?? this.createSession(sessionId);
|
|
195
195
|
const ids = getIds(range);
|
|
196
196
|
if (ids === undefined) {
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
199
199
|
const { currentClusterDetails } = session;
|
|
200
|
-
const { cluster: currentCluster, clusterBase: currentBaseFinalId } = currentClusterDetails
|
|
200
|
+
const { cluster: currentCluster, clusterBase: currentBaseFinalId } = currentClusterDetails ?? {
|
|
201
201
|
cluster: undefined,
|
|
202
202
|
clusterBase: undefined,
|
|
203
203
|
};
|
|
204
204
|
const currentClusterExists = currentCluster !== undefined && currentBaseFinalId !== undefined;
|
|
205
|
-
const normalizedLastFinalizedLocal =
|
|
205
|
+
const normalizedLastFinalizedLocal = session.lastFinalizedLocalId ?? 0;
|
|
206
206
|
const { first: newFirstFinalizedLocal, last: newLastFinalizedLocal } = ids;
|
|
207
207
|
assert(newFirstFinalizedLocal === normalizedLastFinalizedLocal - 1, 0x489 /* Ranges finalized out of order. */);
|
|
208
208
|
// The total number of session-local IDs to finalize
|
|
@@ -214,7 +214,8 @@ export class IdCompressor {
|
|
|
214
214
|
let newBaseUuid;
|
|
215
215
|
if (currentClusterExists) {
|
|
216
216
|
if (isLocal) {
|
|
217
|
-
const lastKnownFinal =
|
|
217
|
+
const lastKnownFinal = this.sessionIdNormalizer.getLastFinalId() ??
|
|
218
|
+
fail("Cluster exists but normalizer does not have an entry for it.");
|
|
218
219
|
const lastAlignedFinalInCluster = (currentBaseFinalId +
|
|
219
220
|
Math.min(currentCluster.count + finalizeCount, currentCluster.capacity) -
|
|
220
221
|
1);
|
|
@@ -265,7 +266,7 @@ export class IdCompressor {
|
|
|
265
266
|
// actually finalized, because total order broadcast guarantees that any usage of those final IDs will be observed after
|
|
266
267
|
// the finalization of the ranges.
|
|
267
268
|
this.sessionIdNormalizer.registerFinalIdBlock(finalPivot, expansionAmount, currentCluster);
|
|
268
|
-
|
|
269
|
+
this.logger?.sendTelemetryEvent({
|
|
269
270
|
eventName: "RuntimeIdCompressor:ClusterExpansion",
|
|
270
271
|
sessionId: this.localSessionId,
|
|
271
272
|
previousCapacity,
|
|
@@ -281,7 +282,7 @@ export class IdCompressor {
|
|
|
281
282
|
newBaseUuid = incrementUuid(currentCluster.baseUuid, currentCluster.capacity);
|
|
282
283
|
currentCluster.count += remainingCapacity;
|
|
283
284
|
remainingCount -= remainingCapacity;
|
|
284
|
-
|
|
285
|
+
this.logger?.sendTelemetryEvent({
|
|
285
286
|
eventName: "RuntimeIdCompressor:OverfilledCluster",
|
|
286
287
|
sessionId: this.localSessionId,
|
|
287
288
|
});
|
|
@@ -291,7 +292,7 @@ export class IdCompressor {
|
|
|
291
292
|
// Session has never made a cluster, form a new one with the session UUID as the baseUuid
|
|
292
293
|
newBaseUuid = session.sessionUuid;
|
|
293
294
|
if (isLocal) {
|
|
294
|
-
|
|
295
|
+
this.logger?.sendTelemetryEvent({
|
|
295
296
|
eventName: "RuntimeIdCompressor:FirstCluster",
|
|
296
297
|
sessionId: this.localSessionId,
|
|
297
298
|
});
|
|
@@ -326,7 +327,7 @@ export class IdCompressor {
|
|
|
326
327
|
const usedCapacity = finalizeCount - remainingCount;
|
|
327
328
|
localIdPivot = (newFirstFinalizedLocal - usedCapacity);
|
|
328
329
|
if (isLocal) {
|
|
329
|
-
|
|
330
|
+
this.logger?.sendTelemetryEvent({
|
|
330
331
|
eventName: "RuntimeIdCompressor:NewCluster",
|
|
331
332
|
sessionId: this.localSessionId,
|
|
332
333
|
clusterCapacity: newCapacity,
|
|
@@ -372,7 +373,7 @@ export class IdCompressor {
|
|
|
372
373
|
(normalizedLastFinalizedLocal - overriddenLocal) -
|
|
373
374
|
1);
|
|
374
375
|
}
|
|
375
|
-
|
|
376
|
+
cluster.overrides ?? (cluster.overrides = new Map());
|
|
376
377
|
const inversionKey = IdCompressor.createInversionKey(override);
|
|
377
378
|
const existingIds = this.getExistingIdsForNewOverride(inversionKey, true);
|
|
378
379
|
let overrideForCluster;
|
|
@@ -440,11 +441,11 @@ export class IdCompressor {
|
|
|
440
441
|
}
|
|
441
442
|
}
|
|
442
443
|
if (isLocal) {
|
|
443
|
-
|
|
444
|
+
this.logger?.sendTelemetryEvent({
|
|
444
445
|
eventName: "RuntimeIdCompressor:IdCompressorStatus",
|
|
445
|
-
eagerFinalIdCount: eagerFinalIdCount - (
|
|
446
|
-
localIdCount: remainingCount + (
|
|
447
|
-
overridesCount:
|
|
446
|
+
eagerFinalIdCount: eagerFinalIdCount - (overrides?.length ?? 0),
|
|
447
|
+
localIdCount: remainingCount + (overrides?.length ?? 0),
|
|
448
|
+
overridesCount: overrides?.length ?? 0,
|
|
448
449
|
sessionId: this.localSessionId,
|
|
449
450
|
});
|
|
450
451
|
}
|
|
@@ -489,7 +490,6 @@ export class IdCompressor {
|
|
|
489
490
|
* Returns an existing ID associated with an override, or undefined if none exists.
|
|
490
491
|
*/
|
|
491
492
|
getExistingIdsForNewOverride(inversionKey, isFinalOverride) {
|
|
492
|
-
var _a;
|
|
493
493
|
const closestMatch = this.clustersAndOverridesInversion.getPairOrNextLower(inversionKey, reusedArray);
|
|
494
494
|
let numericOverride;
|
|
495
495
|
let stableOverride;
|
|
@@ -527,7 +527,9 @@ export class IdCompressor {
|
|
|
527
527
|
}
|
|
528
528
|
}
|
|
529
529
|
}
|
|
530
|
-
const override =
|
|
530
|
+
const override = numericOverride ??
|
|
531
|
+
stableOverride ??
|
|
532
|
+
(IdCompressor.isStableInversionKey(inversionKey) ? inversionKey : undefined);
|
|
531
533
|
if (override !== undefined) {
|
|
532
534
|
const sessionSpaceId = this.getCompressedIdForStableId(override);
|
|
533
535
|
if (sessionSpaceId !== undefined) {
|
|
@@ -555,8 +557,7 @@ export class IdCompressor {
|
|
|
555
557
|
* Helper for retrieving an override.
|
|
556
558
|
*/
|
|
557
559
|
static tryGetOverride(cluster, finalId) {
|
|
558
|
-
|
|
559
|
-
const override = (_a = cluster.overrides) === null || _a === void 0 ? void 0 : _a.get(finalId);
|
|
560
|
+
const override = cluster.overrides?.get(finalId);
|
|
560
561
|
if (override === undefined) {
|
|
561
562
|
return undefined;
|
|
562
563
|
}
|
|
@@ -601,15 +602,15 @@ export class IdCompressor {
|
|
|
601
602
|
const registeredLocal = sessionIdNormalizer.addLocalId();
|
|
602
603
|
assert(registeredLocal === newLocalId, 0x496 /* Session ID Normalizer produced unexpected local ID */);
|
|
603
604
|
if (eagerFinalId !== undefined) {
|
|
604
|
-
sessionIdNormalizer.addFinalIds(eagerFinalId, eagerFinalId, cluster
|
|
605
|
+
sessionIdNormalizer.addFinalIds(eagerFinalId, eagerFinalId, cluster ?? fail("No cluster when generating compressed ID"));
|
|
605
606
|
}
|
|
606
|
-
this.localOverrides.append(newLocalId, override
|
|
607
|
+
this.localOverrides.append(newLocalId, override ?? fail("Override must be defined"));
|
|
607
608
|
// Since the local ID was just created, it is in both session and op space
|
|
608
609
|
const compressionMapping = newLocalId;
|
|
609
610
|
this.clustersAndOverridesInversion.set(overrideInversionKey, compressionMapping);
|
|
610
611
|
}
|
|
611
612
|
else if (eagerFinalId !== undefined) {
|
|
612
|
-
sessionIdNormalizer.addFinalIds(eagerFinalId, eagerFinalId, cluster
|
|
613
|
+
sessionIdNormalizer.addFinalIds(eagerFinalId, eagerFinalId, cluster ?? fail("No cluster when generating compressed ID"));
|
|
613
614
|
return eagerFinalId;
|
|
614
615
|
}
|
|
615
616
|
else {
|
|
@@ -624,8 +625,7 @@ export class IdCompressor {
|
|
|
624
625
|
* @returns the UUID or override string associated with the compressed ID. Fails if the ID was not generated by this compressor.
|
|
625
626
|
*/
|
|
626
627
|
decompress(id) {
|
|
627
|
-
|
|
628
|
-
return (_a = this.tryDecompress(id)) !== null && _a !== void 0 ? _a : fail("Compressed ID was not generated by this compressor");
|
|
628
|
+
return this.tryDecompress(id) ?? fail("Compressed ID was not generated by this compressor");
|
|
629
629
|
}
|
|
630
630
|
/**
|
|
631
631
|
* Attempts to decompress a previously compressed ID into a UUID or override string.
|
|
@@ -633,7 +633,6 @@ export class IdCompressor {
|
|
|
633
633
|
* @returns the UUID or override string associated with the compressed ID, or undefined if the ID was not generated by this compressor.
|
|
634
634
|
*/
|
|
635
635
|
tryDecompress(id) {
|
|
636
|
-
var _a;
|
|
637
636
|
if (isFinalId(id)) {
|
|
638
637
|
const possibleCluster = this.getClusterForFinalId(id);
|
|
639
638
|
if (possibleCluster === undefined) {
|
|
@@ -665,7 +664,7 @@ export class IdCompressor {
|
|
|
665
664
|
// If this is a local ID with an override, then it must have been allocated on this machine and will be contained in
|
|
666
665
|
// `localOverrides`s. Otherwise, it is a sequential allocation from the session UUID and can simply be negated and
|
|
667
666
|
// added to that UUID to obtain the stable ID associated with it.
|
|
668
|
-
const localOverride =
|
|
667
|
+
const localOverride = this.localOverrides?.get(id);
|
|
669
668
|
return localOverride !== undefined
|
|
670
669
|
? localOverride
|
|
671
670
|
: stableIdFromNumericUuid(this.localSession.sessionUuid, idOffset - 1);
|
|
@@ -677,8 +676,7 @@ export class IdCompressor {
|
|
|
677
676
|
* @returns the `CompressedId` associated with `uncompressed`. Fails if it has not been previously compressed by this compressor.
|
|
678
677
|
*/
|
|
679
678
|
recompress(uncompressed) {
|
|
680
|
-
|
|
681
|
-
return (_a = this.tryRecompress(uncompressed)) !== null && _a !== void 0 ? _a : fail("No such string has ever been compressed");
|
|
679
|
+
return this.tryRecompress(uncompressed) ?? fail("No such string has ever been compressed");
|
|
682
680
|
}
|
|
683
681
|
/**
|
|
684
682
|
* Attempts to recompresses a decompressed ID, which could be a UUID or an override string.
|
|
@@ -693,7 +691,6 @@ export class IdCompressor {
|
|
|
693
691
|
* performance optimization.
|
|
694
692
|
*/
|
|
695
693
|
recompressInternal(uncompressed, uncompressedUuidNumeric) {
|
|
696
|
-
var _a, _b;
|
|
697
694
|
let numericUuid = uncompressedUuidNumeric;
|
|
698
695
|
const inversionKey = IdCompressor.createInversionKey(uncompressed);
|
|
699
696
|
const isStable = IdCompressor.isStableInversionKey(inversionKey);
|
|
@@ -704,7 +701,8 @@ export class IdCompressor {
|
|
|
704
701
|
if (key === inversionKey) {
|
|
705
702
|
return IdCompressor.isUnfinalizedOverride(compressionMapping)
|
|
706
703
|
? compressionMapping
|
|
707
|
-
:
|
|
704
|
+
: compressionMapping.associatedLocalId ??
|
|
705
|
+
compressionMapping.originalOverridingFinal;
|
|
708
706
|
}
|
|
709
707
|
}
|
|
710
708
|
else {
|
|
@@ -712,11 +710,11 @@ export class IdCompressor {
|
|
|
712
710
|
return undefined;
|
|
713
711
|
}
|
|
714
712
|
const { clusterBase: closestBaseFinalId, cluster: closestCluster } = compressionMapping;
|
|
715
|
-
numericUuid
|
|
713
|
+
numericUuid ?? (numericUuid = numericUuidFromStableId(inversionKey));
|
|
716
714
|
const uuidOffset = getPositiveDelta(numericUuid, closestCluster.baseUuid, closestCluster.count - 1);
|
|
717
715
|
if (uuidOffset !== undefined) {
|
|
718
716
|
let targetFinalId = (closestBaseFinalId + uuidOffset);
|
|
719
|
-
const override =
|
|
717
|
+
const override = closestCluster.overrides?.get(targetFinalId);
|
|
720
718
|
if (typeof override === "object") {
|
|
721
719
|
if (override.associatedLocalId !== undefined) {
|
|
722
720
|
return override.associatedLocalId;
|
|
@@ -731,7 +729,7 @@ export class IdCompressor {
|
|
|
731
729
|
}
|
|
732
730
|
if (isStable) {
|
|
733
731
|
// May have already computed the numeric UUID, so avoid recomputing if possible
|
|
734
|
-
const sessionSpaceId = this.getCompressedIdForStableId(numericUuid
|
|
732
|
+
const sessionSpaceId = this.getCompressedIdForStableId(numericUuid ?? inversionKey);
|
|
735
733
|
if (sessionSpaceId !== undefined) {
|
|
736
734
|
return sessionSpaceId;
|
|
737
735
|
}
|
|
@@ -744,7 +742,6 @@ export class IdCompressor {
|
|
|
744
742
|
* @returns the ID in op space.
|
|
745
743
|
*/
|
|
746
744
|
normalizeToOpSpace(id) {
|
|
747
|
-
var _a, _b, _c;
|
|
748
745
|
if (isFinalId(id)) {
|
|
749
746
|
return id;
|
|
750
747
|
}
|
|
@@ -763,7 +760,8 @@ export class IdCompressor {
|
|
|
763
760
|
const override = this.localOverrides.get(id);
|
|
764
761
|
if (override !== undefined) {
|
|
765
762
|
const inversionKey = IdCompressor.createInversionKey(override);
|
|
766
|
-
const compressionMapping =
|
|
763
|
+
const compressionMapping = this.clustersAndOverridesInversion.get(inversionKey) ??
|
|
764
|
+
fail("Bimap is malformed.");
|
|
767
765
|
return !IdCompressor.isClusterInfo(compressionMapping) &&
|
|
768
766
|
!IdCompressor.isUnfinalizedOverride(compressionMapping) &&
|
|
769
767
|
compressionMapping.associatedLocalId === id
|
|
@@ -771,9 +769,10 @@ export class IdCompressor {
|
|
|
771
769
|
: id;
|
|
772
770
|
}
|
|
773
771
|
const possibleFinal = this.sessionIdNormalizer.getFinalId(id);
|
|
774
|
-
return
|
|
772
|
+
return possibleFinal?.[0] ?? id;
|
|
775
773
|
}
|
|
776
|
-
const [correspondingFinal, cluster] =
|
|
774
|
+
const [correspondingFinal, cluster] = this.sessionIdNormalizer.getFinalId(id) ??
|
|
775
|
+
fail("Locally created cluster should be added to the map when allocated");
|
|
777
776
|
if (cluster.overrides) {
|
|
778
777
|
const override = cluster.overrides.get(correspondingFinal);
|
|
779
778
|
if (typeof override === "object" && override.originalOverridingFinal !== undefined) {
|
|
@@ -784,7 +783,6 @@ export class IdCompressor {
|
|
|
784
783
|
return correspondingFinal;
|
|
785
784
|
}
|
|
786
785
|
normalizeToSessionSpace(id, sessionIdIfLocal) {
|
|
787
|
-
var _a, _b, _c, _d;
|
|
788
786
|
if (isLocalId(id)) {
|
|
789
787
|
if (sessionIdIfLocal === undefined || sessionIdIfLocal === this.localSessionId) {
|
|
790
788
|
const localIndex = -id;
|
|
@@ -794,10 +792,12 @@ export class IdCompressor {
|
|
|
794
792
|
return id;
|
|
795
793
|
}
|
|
796
794
|
else {
|
|
797
|
-
const session =
|
|
795
|
+
const session = this.sessions.get(sessionIdIfLocal) ??
|
|
796
|
+
fail("No IDs have ever been finalized by the supplied session.");
|
|
798
797
|
const localCount = -id;
|
|
799
798
|
const numericUuid = incrementUuid(session.sessionUuid, localCount - 1);
|
|
800
|
-
return (
|
|
799
|
+
return (this.compressNumericUuid(numericUuid) ??
|
|
800
|
+
fail("ID is not known to this compressor."));
|
|
801
801
|
}
|
|
802
802
|
}
|
|
803
803
|
const normalizedId = this.sessionIdNormalizer.getSessionSpaceId(id);
|
|
@@ -806,8 +806,9 @@ export class IdCompressor {
|
|
|
806
806
|
}
|
|
807
807
|
// Check for a unified override finalized first by another session but to which the local session
|
|
808
808
|
// still has an associated local ID.
|
|
809
|
-
const [_, cluster] =
|
|
810
|
-
|
|
809
|
+
const [_, cluster] = this.getClusterForFinalId(id) ??
|
|
810
|
+
fail("Supplied final ID was not finalized by this compressor.");
|
|
811
|
+
const override = cluster.overrides?.get(id);
|
|
811
812
|
if (typeof override === "object" && override.associatedLocalId !== undefined) {
|
|
812
813
|
return override.associatedLocalId;
|
|
813
814
|
}
|
|
@@ -976,7 +977,6 @@ export class IdCompressor {
|
|
|
976
977
|
return true;
|
|
977
978
|
}
|
|
978
979
|
static idClustersEqual(a, b, checkSessionData = true, compareLocalState = true) {
|
|
979
|
-
var _a, _b;
|
|
980
980
|
const areEqual = numericUuidEquals(a.baseUuid, b.baseUuid) &&
|
|
981
981
|
a.capacity === b.capacity &&
|
|
982
982
|
a.count === b.count &&
|
|
@@ -984,7 +984,7 @@ export class IdCompressor {
|
|
|
984
984
|
IdCompressor.sessionDataEqual(a.session, b.session, false, compareLocalState)) &&
|
|
985
985
|
(a.overrides === undefined) === (b.overrides === undefined) &&
|
|
986
986
|
(a.overrides === undefined ||
|
|
987
|
-
compareMaps(
|
|
987
|
+
compareMaps(a.overrides ?? fail("Overrides must be defined"), b.overrides ?? fail("Overrides must be defined"), (overrideA, overrideB) => {
|
|
988
988
|
if (compareLocalState) {
|
|
989
989
|
if (typeof overrideA === "string" || typeof overrideB === "string") {
|
|
990
990
|
return overrideA === overrideB;
|
|
@@ -1008,7 +1008,6 @@ export class IdCompressor {
|
|
|
1008
1008
|
return areEqual;
|
|
1009
1009
|
}
|
|
1010
1010
|
serialize(withSession) {
|
|
1011
|
-
var _a, _b;
|
|
1012
1011
|
const serializedSessions = [];
|
|
1013
1012
|
const sessionIdToSessionIndex = new Map();
|
|
1014
1013
|
for (const [sessionId, session] of this.sessions) {
|
|
@@ -1026,7 +1025,8 @@ export class IdCompressor {
|
|
|
1026
1025
|
for (const [baseFinalId, cluster] of this.finalIdToCluster.entries()) {
|
|
1027
1026
|
const sessionId = stableIdFromNumericUuid(cluster.session.sessionUuid);
|
|
1028
1027
|
if (sessionId !== reservedSessionId) {
|
|
1029
|
-
const sessionIndex =
|
|
1028
|
+
const sessionIndex = sessionIdToSessionIndex.get(sessionId) ??
|
|
1029
|
+
fail("Session object contains wrong session numeric UUID");
|
|
1030
1030
|
const serializedCluster = [
|
|
1031
1031
|
sessionIndex,
|
|
1032
1032
|
cluster.capacity,
|
|
@@ -1078,7 +1078,7 @@ export class IdCompressor {
|
|
|
1078
1078
|
}
|
|
1079
1079
|
return serializedWithSession;
|
|
1080
1080
|
}
|
|
1081
|
-
|
|
1081
|
+
this.logger?.sendTelemetryEvent({
|
|
1082
1082
|
eventName: "RuntimeIdCompressor:SerializedIdCompressorSize",
|
|
1083
1083
|
size: JSON.stringify(serializedIdCompressor).length,
|
|
1084
1084
|
clusterCount: serializedIdCompressor.clusters.length,
|
|
@@ -1139,7 +1139,7 @@ export class IdCompressor {
|
|
|
1139
1139
|
baseUuid: incrementUuid(sessionUuid, currentIdCount),
|
|
1140
1140
|
session,
|
|
1141
1141
|
};
|
|
1142
|
-
const lastFinalizedNormalized = lastFinalizedLocalId
|
|
1142
|
+
const lastFinalizedNormalized = lastFinalizedLocalId ?? 0;
|
|
1143
1143
|
const clusterBase = compressor.nextClusterBaseFinalId;
|
|
1144
1144
|
session.lastFinalizedLocalId = (lastFinalizedNormalized - count);
|
|
1145
1145
|
session.currentClusterDetails = { clusterBase, cluster };
|
|
@@ -1193,8 +1193,8 @@ export class IdCompressor {
|
|
|
1193
1193
|
}
|
|
1194
1194
|
if (serializedLocalState !== undefined) {
|
|
1195
1195
|
compressor.sessionIdNormalizer = SessionIdNormalizer.deserialize(serializedLocalState.sessionNormalizer, (finalId) => {
|
|
1196
|
-
|
|
1197
|
-
|
|
1196
|
+
const [_, cluster] = compressor.finalIdToCluster.getPairOrNextLower(finalId) ??
|
|
1197
|
+
fail("Final in serialized normalizer was never created.");
|
|
1198
1198
|
return cluster;
|
|
1199
1199
|
});
|
|
1200
1200
|
}
|