@fluidframework/container-runtime 2.4.0-299707 → 2.5.0-302463
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 +12 -0
- package/container-runtime.test-files.tar +0 -0
- package/dist/blobManager/blobManager.d.ts.map +1 -1
- package/dist/blobManager/blobManager.js +10 -4
- package/dist/blobManager/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +10 -2
- package/dist/channelCollection.js.map +1 -1
- package/dist/containerRuntime.d.ts +6 -2
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +46 -28
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +14 -6
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +1 -1
- 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/outbox.d.ts +6 -0
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +9 -1
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -4
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +6 -18
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.js +1 -1
- 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/summary/documentSchema.js +2 -2
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +3 -4
- package/dist/summary/summaryCollection.js.map +1 -1
- package/lib/blobManager/blobManager.d.ts.map +1 -1
- package/lib/blobManager/blobManager.js +10 -4
- package/lib/blobManager/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +11 -3
- package/lib/channelCollection.js.map +1 -1
- package/lib/containerRuntime.d.ts +6 -2
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +44 -27
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +15 -7
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +1 -1
- 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/outbox.d.ts +6 -0
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +7 -0
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +4 -4
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +6 -18
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.js +1 -1
- 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/summary/documentSchema.js +2 -2
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +3 -4
- package/lib/summary/summaryCollection.js.map +1 -1
- package/package.json +22 -26
- package/src/blobManager/blobManager.ts +10 -4
- package/src/channelCollection.ts +16 -7
- package/src/containerRuntime.ts +49 -27
- package/src/dataStoreContexts.ts +20 -7
- package/src/opLifecycle/index.ts +1 -1
- package/src/opLifecycle/outbox.ts +11 -0
- package/src/opLifecycle/remoteMessageProcessor.ts +8 -22
- package/src/opProperties.ts +1 -1
- package/src/packageVersion.ts +1 -1
- package/src/summary/documentSchema.ts +2 -2
- package/src/summary/summaryCollection.ts +3 -4
package/lib/containerRuntime.js
CHANGED
|
@@ -25,7 +25,7 @@ import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
|
|
|
25
25
|
import { DeltaManagerPendingOpsProxy, DeltaManagerSummarizerProxy, } from "./deltaManagerProxies.js";
|
|
26
26
|
import { GCNodeType, GarbageCollector, gcGenerationOptionName, } from "./gc/index.js";
|
|
27
27
|
import { ContainerMessageType, } from "./messageTypes.js";
|
|
28
|
-
import { DuplicateBatchDetector, ensureContentsDeserialized, OpCompressor, OpDecompressor, OpGroupingManager, OpSplitter, Outbox, RemoteMessageProcessor, } from "./opLifecycle/index.js";
|
|
28
|
+
import { DuplicateBatchDetector, ensureContentsDeserialized, OpCompressor, OpDecompressor, OpGroupingManager, OpSplitter, Outbox, RemoteMessageProcessor, serializeOpContents, } from "./opLifecycle/index.js";
|
|
29
29
|
import { pkgVersion } from "./packageVersion.js";
|
|
30
30
|
import { PendingStateManager, } from "./pendingStateManager.js";
|
|
31
31
|
import { ScheduleManager } from "./scheduleManager.js";
|
|
@@ -89,12 +89,6 @@ export const TombstoneResponseHeaderKey = "isTombstoned";
|
|
|
89
89
|
* to this was experimental and is no longer supported.
|
|
90
90
|
*/
|
|
91
91
|
export const InactiveResponseHeaderKey = "isInactive";
|
|
92
|
-
/** Default values for Runtime Headers */
|
|
93
|
-
export const defaultRuntimeHeaderData = {
|
|
94
|
-
wait: true,
|
|
95
|
-
viaHandle: false,
|
|
96
|
-
allowTombstone: false,
|
|
97
|
-
};
|
|
98
92
|
/**
|
|
99
93
|
* Available compression algorithms for op compression.
|
|
100
94
|
* @legacy
|
|
@@ -232,7 +226,7 @@ function lastMessageFromMetadata(metadata) {
|
|
|
232
226
|
* to understand if/when it is hit.
|
|
233
227
|
* We only want to log this once, to avoid spamming telemetry if we are wrong and these cases are hit commonly.
|
|
234
228
|
*/
|
|
235
|
-
let getSingleUseLegacyLogCallback = (logger, type) => {
|
|
229
|
+
export let getSingleUseLegacyLogCallback = (logger, type) => {
|
|
236
230
|
return (codePath) => {
|
|
237
231
|
logger.sendTelemetryEvent({
|
|
238
232
|
eventName: "LegacyMessageFormat",
|
|
@@ -1519,8 +1513,11 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1519
1513
|
const hasModernRuntimeMessageEnvelope = messageCopy.type === MessageType.Operation;
|
|
1520
1514
|
const savedOp = messageCopy.metadata?.savedOp;
|
|
1521
1515
|
const logLegacyCase = getSingleUseLegacyLogCallback(this.logger, messageCopy.type);
|
|
1522
|
-
|
|
1523
|
-
|
|
1516
|
+
let runtimeBatch = hasModernRuntimeMessageEnvelope || isUnpackedRuntimeMessage(messageCopy);
|
|
1517
|
+
if (runtimeBatch) {
|
|
1518
|
+
// We expect runtime messages to have JSON contents - deserialize it in place.
|
|
1519
|
+
ensureContentsDeserialized(messageCopy);
|
|
1520
|
+
}
|
|
1524
1521
|
if (hasModernRuntimeMessageEnvelope) {
|
|
1525
1522
|
// If the message has the modern message envelope, then process it here.
|
|
1526
1523
|
// Here we unpack the message (decompress, unchunk, and/or ungroup) into a batch of messages with ContainerMessageType
|
|
@@ -1549,7 +1546,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1549
1546
|
throw error;
|
|
1550
1547
|
}
|
|
1551
1548
|
}
|
|
1552
|
-
let runtimeBatch = true;
|
|
1553
1549
|
// Reach out to PendingStateManager, either to zip localOpMetadata into the *local* message list,
|
|
1554
1550
|
// or to check to ensure the *remote* messages don't match the batchId of a pending local batch.
|
|
1555
1551
|
// This latter case would indicate that the container has forked - two copies are trying to persist the same local changes.
|
|
@@ -1588,8 +1584,17 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1588
1584
|
this.processInboundMessages(messagesWithPendingState, locationInBatch, local, savedOp, runtimeBatch);
|
|
1589
1585
|
}
|
|
1590
1586
|
else {
|
|
1587
|
+
if (!runtimeBatch) {
|
|
1588
|
+
// The DeltaManager used to do this, but doesn't anymore as of Loader v2.4
|
|
1589
|
+
// Anyone listening to our "op" event would expect the contents to be parsed per this same logic
|
|
1590
|
+
if (typeof messageCopy.contents === "string" &&
|
|
1591
|
+
messageCopy.contents !== "" &&
|
|
1592
|
+
messageCopy.type !== MessageType.ClientLeave) {
|
|
1593
|
+
messageCopy.contents = JSON.parse(messageCopy.contents);
|
|
1594
|
+
}
|
|
1595
|
+
}
|
|
1591
1596
|
this.processInboundMessages([{ message: messageCopy, localOpMetadata: undefined }], { batchStart: true, batchEnd: true }, // Single message
|
|
1592
|
-
local, savedOp,
|
|
1597
|
+
local, savedOp, runtimeBatch);
|
|
1593
1598
|
}
|
|
1594
1599
|
if (local) {
|
|
1595
1600
|
// If we have processed a local op, this means that the container is
|
|
@@ -1732,11 +1737,13 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1732
1737
|
const duration = Date.now() - this._signalTracking.signalTimestamp;
|
|
1733
1738
|
this.mc.logger.sendPerformanceEvent({
|
|
1734
1739
|
eventName: "SignalLatency",
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
+
details: {
|
|
1741
|
+
duration, // Roundtrip duration of the tracked signal in milliseconds.
|
|
1742
|
+
sent: this._signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.
|
|
1743
|
+
lost: this._signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.
|
|
1744
|
+
outOfOrder: this._signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.
|
|
1745
|
+
reconnectCount: this.consecutiveReconnects, // Container reconnect count.
|
|
1746
|
+
},
|
|
1740
1747
|
});
|
|
1741
1748
|
this._signalTracking.signalsLost = 0;
|
|
1742
1749
|
this._signalTracking.signalsOutOfOrder = 0;
|
|
@@ -1763,9 +1770,11 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1763
1770
|
this._signalTracking.signalsLost += signalsLost;
|
|
1764
1771
|
this.mc.logger.sendErrorEvent({
|
|
1765
1772
|
eventName: "SignalLost",
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1773
|
+
details: {
|
|
1774
|
+
signalsLost, // Number of lost signals detected.
|
|
1775
|
+
expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
|
|
1776
|
+
clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
|
|
1777
|
+
},
|
|
1769
1778
|
});
|
|
1770
1779
|
}
|
|
1771
1780
|
// Update the tracking signal sequence number to the next expected signal in the sequence.
|
|
@@ -1777,11 +1786,18 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1777
1786
|
clientBroadcastSignalSequenceNumber >=
|
|
1778
1787
|
this._signalTracking.minimumTrackingSignalSequenceNumber) {
|
|
1779
1788
|
this._signalTracking.signalsOutOfOrder++;
|
|
1789
|
+
const details = {
|
|
1790
|
+
expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
|
|
1791
|
+
clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
|
|
1792
|
+
};
|
|
1793
|
+
// Only log `contents.type` when address is for container to avoid
|
|
1794
|
+
// chance that contents type is customer data.
|
|
1795
|
+
if (envelope.address === undefined) {
|
|
1796
|
+
details.contentsType = envelope.contents.type; // Type of signal that was received out of order.
|
|
1797
|
+
}
|
|
1780
1798
|
this.mc.logger.sendTelemetryEvent({
|
|
1781
1799
|
eventName: "SignalOutOfOrder",
|
|
1782
|
-
|
|
1783
|
-
trackingSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
|
|
1784
|
-
clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
|
|
1800
|
+
details,
|
|
1785
1801
|
});
|
|
1786
1802
|
}
|
|
1787
1803
|
if (this._signalTracking.roundTripSignalSequenceNumber !== undefined &&
|
|
@@ -1790,7 +1806,8 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1790
1806
|
this._signalTracking.roundTripSignalSequenceNumber) {
|
|
1791
1807
|
// Latency tracked signal has been received.
|
|
1792
1808
|
// We now log the roundtrip duration of the tracked signal.
|
|
1793
|
-
// This telemetry event also logs metrics for
|
|
1809
|
+
// This telemetry event also logs metrics for broadcast signals
|
|
1810
|
+
// sent, lost, and out of order.
|
|
1794
1811
|
// These metrics are reset after logging the telemetry event.
|
|
1795
1812
|
this.sendSignalTelemetryEvent();
|
|
1796
1813
|
}
|
|
@@ -2636,7 +2653,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
2636
2653
|
contents: idRange,
|
|
2637
2654
|
};
|
|
2638
2655
|
const idAllocationBatchMessage = {
|
|
2639
|
-
contents:
|
|
2656
|
+
contents: serializeOpContents(idAllocationMessage),
|
|
2640
2657
|
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
2641
2658
|
};
|
|
2642
2659
|
this.outbox.submitIdAllocation(idAllocationBatchMessage);
|
|
@@ -2679,12 +2696,12 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
2679
2696
|
contents: schemaChangeMessage,
|
|
2680
2697
|
};
|
|
2681
2698
|
this.outbox.submit({
|
|
2682
|
-
contents:
|
|
2699
|
+
contents: serializeOpContents(msg),
|
|
2683
2700
|
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
2684
2701
|
});
|
|
2685
2702
|
}
|
|
2686
2703
|
const message = {
|
|
2687
|
-
contents:
|
|
2704
|
+
contents: serializeOpContents(containerRuntimeMessage),
|
|
2688
2705
|
metadata,
|
|
2689
2706
|
localOpMetadata,
|
|
2690
2707
|
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|