@fluidframework/container-runtime 2.5.0-302463 → 2.10.0-304831
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 +18 -0
- package/api-report/container-runtime.legacy.alpha.api.md +3 -1
- package/container-runtime.test-files.tar +0 -0
- package/dist/blobManager/blobManager.d.ts +3 -3
- package/dist/blobManager/blobManager.d.ts.map +1 -1
- package/dist/blobManager/blobManager.js +1 -1
- package/dist/blobManager/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +20 -5
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +185 -129
- package/dist/channelCollection.js.map +1 -1
- package/dist/containerRuntime.d.ts +14 -4
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +145 -64
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +15 -3
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +48 -19
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +6 -14
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +5 -6
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +23 -22
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +2 -2
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +3 -0
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +9 -0
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +1 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +2 -0
- package/dist/opLifecycle/remoteMessageProcessor.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/summary/documentSchema.d.ts +11 -0
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +43 -28
- package/dist/summary/documentSchema.js.map +1 -1
- package/lib/blobManager/blobManager.d.ts +3 -3
- package/lib/blobManager/blobManager.d.ts.map +1 -1
- package/lib/blobManager/blobManager.js +1 -1
- package/lib/blobManager/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +20 -5
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +186 -130
- package/lib/channelCollection.js.map +1 -1
- package/lib/containerRuntime.d.ts +14 -4
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +144 -63
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +15 -3
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +48 -19
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +7 -15
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +5 -6
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +23 -22
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +2 -2
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +3 -0
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +9 -0
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +1 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +2 -0
- package/lib/opLifecycle/remoteMessageProcessor.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/summary/documentSchema.d.ts +11 -0
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +43 -28
- package/lib/summary/documentSchema.js.map +1 -1
- package/package.json +21 -21
- package/src/blobManager/blobManager.ts +2 -2
- package/src/channelCollection.ts +234 -176
- package/src/containerRuntime.ts +189 -79
- package/src/dataStoreContext.ts +66 -23
- package/src/dataStoreContexts.ts +7 -20
- package/src/gc/garbageCollection.ts +32 -32
- package/src/gc/gcDefinitions.ts +3 -3
- package/src/opLifecycle/outbox.ts +12 -0
- package/src/opLifecycle/remoteMessageProcessor.ts +3 -0
- package/src/packageVersion.ts +1 -1
- package/src/summary/documentSchema.ts +56 -37
package/dist/containerRuntime.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ContainerRuntime = exports.loadContainerRuntime = exports.getSingleUseLegacyLogCallback = exports.makeLegacySendBatchFn = exports.getDeviceSpec = exports.agentSchedulerId = exports.isUnpackedRuntimeMessage = exports.defaultPendingOpsRetryDelayMs = exports.defaultPendingOpsWaitTimeoutMs = exports.disabledCompressionConfig = exports.CompressionAlgorithms = exports.InactiveResponseHeaderKey = exports.TombstoneResponseHeaderKey = exports.DeletedResponseHeaderKey = exports.DefaultSummaryConfiguration = void 0;
|
|
7
|
+
exports.ContainerRuntime = exports.loadContainerRuntime = exports.getSingleUseLegacyLogCallback = exports.makeLegacySendBatchFn = exports.getDeviceSpec = exports.agentSchedulerId = exports.isUnpackedRuntimeMessage = exports.defaultPendingOpsRetryDelayMs = exports.defaultPendingOpsWaitTimeoutMs = exports.disabledCompressionConfig = exports.CompressionAlgorithms = exports.defaultRuntimeHeaderData = exports.InactiveResponseHeaderKey = exports.TombstoneResponseHeaderKey = exports.DeletedResponseHeaderKey = exports.DefaultSummaryConfiguration = void 0;
|
|
8
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
9
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
10
10
|
const internal_1 = require("@fluidframework/container-definitions/internal");
|
|
@@ -90,6 +90,12 @@ exports.TombstoneResponseHeaderKey = "isTombstoned";
|
|
|
90
90
|
* to this was experimental and is no longer supported.
|
|
91
91
|
*/
|
|
92
92
|
exports.InactiveResponseHeaderKey = "isInactive";
|
|
93
|
+
/** Default values for Runtime Headers */
|
|
94
|
+
exports.defaultRuntimeHeaderData = {
|
|
95
|
+
wait: true,
|
|
96
|
+
viaHandle: false,
|
|
97
|
+
allowTombstone: false,
|
|
98
|
+
};
|
|
93
99
|
/**
|
|
94
100
|
* Available compression algorithms for op compression.
|
|
95
101
|
* @legacy
|
|
@@ -1587,20 +1593,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1587
1593
|
: inboundResult.type === "batchStartingMessage"
|
|
1588
1594
|
? { batchStart: true, batchEnd: false }
|
|
1589
1595
|
: { batchStart: false, batchEnd: inboundResult.batchEnd === true };
|
|
1590
|
-
this.processInboundMessages(messagesWithPendingState, locationInBatch, local, savedOp, runtimeBatch
|
|
1596
|
+
this.processInboundMessages(messagesWithPendingState, locationInBatch, local, savedOp, runtimeBatch, inboundResult.type === "fullBatch"
|
|
1597
|
+
? inboundResult.groupedBatch
|
|
1598
|
+
: false /* groupedBatch */);
|
|
1591
1599
|
}
|
|
1592
1600
|
else {
|
|
1593
|
-
if (!runtimeBatch) {
|
|
1594
|
-
// The DeltaManager used to do this, but doesn't anymore as of Loader v2.4
|
|
1595
|
-
// Anyone listening to our "op" event would expect the contents to be parsed per this same logic
|
|
1596
|
-
if (typeof messageCopy.contents === "string" &&
|
|
1597
|
-
messageCopy.contents !== "" &&
|
|
1598
|
-
messageCopy.type !== internal_3.MessageType.ClientLeave) {
|
|
1599
|
-
messageCopy.contents = JSON.parse(messageCopy.contents);
|
|
1600
|
-
}
|
|
1601
|
-
}
|
|
1602
1601
|
this.processInboundMessages([{ message: messageCopy, localOpMetadata: undefined }], { batchStart: true, batchEnd: true }, // Single message
|
|
1603
|
-
local, savedOp, runtimeBatch);
|
|
1602
|
+
local, savedOp, runtimeBatch, false /* groupedBatch */);
|
|
1604
1603
|
}
|
|
1605
1604
|
if (local) {
|
|
1606
1605
|
// If we have processed a local op, this means that the container is
|
|
@@ -1611,35 +1610,93 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1611
1610
|
}
|
|
1612
1611
|
/**
|
|
1613
1612
|
* Processes inbound message(s). It calls schedule manager according to the messages' location in the batch.
|
|
1614
|
-
* @param
|
|
1613
|
+
* @param messagesWithMetadata - messages to process along with their metadata.
|
|
1615
1614
|
* @param locationInBatch - Are we processing the start and/or end of a batch?
|
|
1616
1615
|
* @param local - true if the messages were originally generated by the client receiving it.
|
|
1617
1616
|
* @param savedOp - true if the message is a replayed saved op.
|
|
1618
1617
|
* @param runtimeBatch - true if these are runtime messages.
|
|
1618
|
+
* @param groupedBatch - true if these messages are part of a grouped op batch.
|
|
1619
1619
|
*/
|
|
1620
|
-
processInboundMessages(
|
|
1620
|
+
processInboundMessages(messagesWithMetadata, locationInBatch, local, savedOp, runtimeBatch, groupedBatch) {
|
|
1621
1621
|
if (locationInBatch.batchStart) {
|
|
1622
|
-
const firstMessage =
|
|
1622
|
+
const firstMessage = messagesWithMetadata[0]?.message;
|
|
1623
1623
|
(0, internal_2.assert)(firstMessage !== undefined, 0xa31 /* Batch must have at least one message */);
|
|
1624
1624
|
this.scheduleManager.batchBegin(firstMessage);
|
|
1625
1625
|
}
|
|
1626
1626
|
let error;
|
|
1627
1627
|
try {
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
this.validateAndProcessRuntimeMessage({
|
|
1632
|
-
message: message,
|
|
1633
|
-
local,
|
|
1634
|
-
savedOp,
|
|
1635
|
-
localOpMetadata,
|
|
1636
|
-
});
|
|
1637
|
-
}
|
|
1638
|
-
else {
|
|
1628
|
+
if (!runtimeBatch) {
|
|
1629
|
+
messagesWithMetadata.forEach(({ message }) => {
|
|
1630
|
+
this.ensureNoDataModelChanges(() => {
|
|
1639
1631
|
this.observeNonRuntimeMessage(message);
|
|
1640
|
-
}
|
|
1632
|
+
});
|
|
1641
1633
|
});
|
|
1642
|
-
|
|
1634
|
+
return;
|
|
1635
|
+
}
|
|
1636
|
+
// Helper that updates a message's minimum sequence number to the minimum sequence number that container
|
|
1637
|
+
// runtime is tracking and sets _processedClientSequenceNumber. It returns the updated message.
|
|
1638
|
+
const updateSequenceNumbers = (message) => {
|
|
1639
|
+
// Set the minimum sequence number to the containerRuntime's understanding of minimum sequence number.
|
|
1640
|
+
message.minimumSequenceNumber =
|
|
1641
|
+
this.useDeltaManagerOpsProxy &&
|
|
1642
|
+
this.deltaManager.minimumSequenceNumber < message.minimumSequenceNumber
|
|
1643
|
+
? this.deltaManager.minimumSequenceNumber
|
|
1644
|
+
: message.minimumSequenceNumber;
|
|
1645
|
+
this._processedClientSequenceNumber = message.clientSequenceNumber;
|
|
1646
|
+
return message;
|
|
1647
|
+
};
|
|
1648
|
+
// Non-grouped batch messages are processed one at a time.
|
|
1649
|
+
if (!groupedBatch) {
|
|
1650
|
+
for (const { message, localOpMetadata } of messagesWithMetadata) {
|
|
1651
|
+
updateSequenceNumbers(message);
|
|
1652
|
+
this.ensureNoDataModelChanges(() => {
|
|
1653
|
+
this.validateAndProcessRuntimeMessages(message, [
|
|
1654
|
+
{
|
|
1655
|
+
contents: message.contents,
|
|
1656
|
+
localOpMetadata,
|
|
1657
|
+
clientSequenceNumber: message.clientSequenceNumber,
|
|
1658
|
+
},
|
|
1659
|
+
], local, savedOp);
|
|
1660
|
+
this.emit("op", message, true /* runtimeMessage */);
|
|
1661
|
+
});
|
|
1662
|
+
}
|
|
1663
|
+
return;
|
|
1664
|
+
}
|
|
1665
|
+
let bunchedMessagesContent = [];
|
|
1666
|
+
let previousMessage;
|
|
1667
|
+
// Helper that processes the previous bunch of messages.
|
|
1668
|
+
const sendBunchedMessages = () => {
|
|
1669
|
+
(0, internal_2.assert)(previousMessage !== undefined, 0xa67 /* previous message must exist */);
|
|
1670
|
+
this.ensureNoDataModelChanges(() => {
|
|
1671
|
+
this.validateAndProcessRuntimeMessages(
|
|
1672
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1673
|
+
previousMessage, bunchedMessagesContent, local, savedOp);
|
|
1674
|
+
});
|
|
1675
|
+
bunchedMessagesContent = [];
|
|
1676
|
+
};
|
|
1677
|
+
/**
|
|
1678
|
+
* For grouped batch messages, bunch contiguous messages of the same type and process them together.
|
|
1679
|
+
* This is an optimization mainly for DDSes, where it can process a bunch of ops together. DDSes
|
|
1680
|
+
* like merge tree or shared tree can process ops more efficiently when they are bunched together.
|
|
1681
|
+
*/
|
|
1682
|
+
for (const { message, localOpMetadata } of messagesWithMetadata) {
|
|
1683
|
+
const currentMessage = updateSequenceNumbers(message);
|
|
1684
|
+
if (previousMessage && previousMessage.type !== currentMessage.type) {
|
|
1685
|
+
sendBunchedMessages();
|
|
1686
|
+
}
|
|
1687
|
+
previousMessage = currentMessage;
|
|
1688
|
+
bunchedMessagesContent.push({
|
|
1689
|
+
contents: message.contents,
|
|
1690
|
+
localOpMetadata,
|
|
1691
|
+
clientSequenceNumber: message.clientSequenceNumber,
|
|
1692
|
+
});
|
|
1693
|
+
}
|
|
1694
|
+
// Process the last bunch of messages.
|
|
1695
|
+
sendBunchedMessages();
|
|
1696
|
+
// Send the "op" events for the messages now that the ops have been processed.
|
|
1697
|
+
for (const { message } of messagesWithMetadata) {
|
|
1698
|
+
this.emit("op", message, true /* runtimeMessage */);
|
|
1699
|
+
}
|
|
1643
1700
|
}
|
|
1644
1701
|
catch (e) {
|
|
1645
1702
|
error = e;
|
|
@@ -1647,7 +1704,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1647
1704
|
}
|
|
1648
1705
|
finally {
|
|
1649
1706
|
if (locationInBatch.batchEnd) {
|
|
1650
|
-
const lastMessage =
|
|
1707
|
+
const lastMessage = messagesWithMetadata[messagesWithMetadata.length - 1]?.message;
|
|
1651
1708
|
(0, internal_2.assert)(lastMessage !== undefined, 0xa32 /* Batch must have at least one message */);
|
|
1652
1709
|
this.scheduleManager.batchEnd(error, lastMessage);
|
|
1653
1710
|
}
|
|
@@ -1668,65 +1725,60 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1668
1725
|
if (!this.hasPendingMessages()) {
|
|
1669
1726
|
this.updateDocumentDirtyState(false);
|
|
1670
1727
|
}
|
|
1728
|
+
// The DeltaManager used to do this, but doesn't anymore as of Loader v2.4
|
|
1729
|
+
// Anyone listening to our "op" event would expect the contents to be parsed per this same logic
|
|
1730
|
+
if (typeof message.contents === "string" &&
|
|
1731
|
+
message.contents !== "" &&
|
|
1732
|
+
message.type !== internal_3.MessageType.ClientLeave) {
|
|
1733
|
+
message.contents = JSON.parse(message.contents);
|
|
1734
|
+
}
|
|
1671
1735
|
this.emit("op", message, false /* runtimeMessage */);
|
|
1672
1736
|
}
|
|
1673
1737
|
/**
|
|
1674
|
-
*
|
|
1675
|
-
*
|
|
1738
|
+
* Process runtime messages. The messages here are contiguous messages in a batch.
|
|
1739
|
+
* Assuming the messages in the given bunch are also a TypedContainerRuntimeMessage, checks its type and dispatch
|
|
1740
|
+
* the messages to the appropriate handler in the runtime.
|
|
1676
1741
|
* Throws a DataProcessingError if the message looks like but doesn't conform to a known TypedContainerRuntimeMessage type.
|
|
1742
|
+
* @param message - The core message with common properties for all the messages.
|
|
1743
|
+
* @param messageContents - The contents, local metadata and clientSequenceNumbers of the messages.
|
|
1744
|
+
* @param local - true if the messages were originally generated by the client receiving it.
|
|
1745
|
+
* @param savedOp - true if the message is a replayed saved op.
|
|
1746
|
+
*
|
|
1677
1747
|
*/
|
|
1678
|
-
|
|
1679
|
-
const { local, message, savedOp, localOpMetadata } = messageWithContext;
|
|
1680
|
-
// Set the minimum sequence number to the containerRuntime's understanding of minimum sequence number.
|
|
1681
|
-
if (this.useDeltaManagerOpsProxy &&
|
|
1682
|
-
this.deltaManager.minimumSequenceNumber < message.minimumSequenceNumber) {
|
|
1683
|
-
message.minimumSequenceNumber = this.deltaManager.minimumSequenceNumber;
|
|
1684
|
-
}
|
|
1685
|
-
this._processedClientSequenceNumber = message.clientSequenceNumber;
|
|
1748
|
+
validateAndProcessRuntimeMessages(message, messagesContent, local, savedOp) {
|
|
1686
1749
|
// If there are no more pending messages after processing a local message,
|
|
1687
1750
|
// the document is no longer dirty.
|
|
1688
1751
|
if (!this.hasPendingMessages()) {
|
|
1689
1752
|
this.updateDocumentDirtyState(false);
|
|
1690
1753
|
}
|
|
1754
|
+
// Get the contents without the localOpMetadata because not all message types know about localOpMetadata.
|
|
1755
|
+
const contents = messagesContent.map((c) => c.contents);
|
|
1691
1756
|
switch (message.type) {
|
|
1757
|
+
case messageTypes_js_1.ContainerMessageType.FluidDataStoreOp:
|
|
1692
1758
|
case messageTypes_js_1.ContainerMessageType.Attach:
|
|
1693
1759
|
case messageTypes_js_1.ContainerMessageType.Alias:
|
|
1694
|
-
|
|
1695
|
-
|
|
1760
|
+
// Remove the metadata from the message before sending it to the channel collection. The metadata
|
|
1761
|
+
// is added by the container runtime and is not part of the message that the channel collection and
|
|
1762
|
+
// layers below it expect.
|
|
1763
|
+
this.channelCollection.processMessages({ envelope: message, messagesContent, local });
|
|
1696
1764
|
break;
|
|
1697
1765
|
case messageTypes_js_1.ContainerMessageType.BlobAttach:
|
|
1698
|
-
this.blobManager.
|
|
1766
|
+
this.blobManager.processBlobAttachMessage(message, local);
|
|
1699
1767
|
break;
|
|
1700
1768
|
case messageTypes_js_1.ContainerMessageType.IdAllocation:
|
|
1701
|
-
|
|
1702
|
-
// stashed ops flow. The compressor is stashed with these ops already processed.
|
|
1703
|
-
// That said, in idCompressorMode === "delayed", we might not serialize ID compressor, and
|
|
1704
|
-
// thus we need to process all the ops.
|
|
1705
|
-
if (!(this.skipSavedCompressorOps && savedOp === true)) {
|
|
1706
|
-
const range = message.contents;
|
|
1707
|
-
// Some other client turned on the id compressor. If we have not turned it on,
|
|
1708
|
-
// put it in a pending queue and delay finalization.
|
|
1709
|
-
if (this._idCompressor === undefined) {
|
|
1710
|
-
(0, internal_2.assert)(this.idCompressorMode !== undefined, 0x93c /* id compressor should be enabled */);
|
|
1711
|
-
this.pendingIdCompressorOps.push(range);
|
|
1712
|
-
}
|
|
1713
|
-
else {
|
|
1714
|
-
(0, internal_2.assert)(this.pendingIdCompressorOps.length === 0, 0x979 /* there should be no pending ops! */);
|
|
1715
|
-
this._idCompressor.finalizeCreationRange(range);
|
|
1716
|
-
}
|
|
1717
|
-
}
|
|
1769
|
+
this.processIdCompressorMessages(contents, savedOp);
|
|
1718
1770
|
break;
|
|
1719
1771
|
case messageTypes_js_1.ContainerMessageType.GC:
|
|
1720
|
-
this.garbageCollector.
|
|
1772
|
+
this.garbageCollector.processMessages(contents, message.timestamp, local);
|
|
1721
1773
|
break;
|
|
1722
1774
|
case messageTypes_js_1.ContainerMessageType.ChunkedOp:
|
|
1723
|
-
// From observability POV, we should not
|
|
1775
|
+
// From observability POV, we should not expose the rest of the system (including "op" events on object) to these messages.
|
|
1724
1776
|
// Also resetReconnectCount() would be wrong - see comment that was there before this change was made.
|
|
1725
1777
|
(0, internal_2.assert)(false, 0x93d /* should not even get here */);
|
|
1726
1778
|
case messageTypes_js_1.ContainerMessageType.Rejoin:
|
|
1727
1779
|
break;
|
|
1728
1780
|
case messageTypes_js_1.ContainerMessageType.DocumentSchemaChange:
|
|
1729
|
-
this.documentsSchemaController.
|
|
1781
|
+
this.documentsSchemaController.processDocumentSchemaMessages(contents, local, message.sequenceNumber);
|
|
1730
1782
|
break;
|
|
1731
1783
|
default: {
|
|
1732
1784
|
const error = getUnknownMessageTypeError(message.type, "validateAndProcessRuntimeMessage" /* codePath */, message);
|
|
@@ -1734,7 +1786,26 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1734
1786
|
throw error;
|
|
1735
1787
|
}
|
|
1736
1788
|
}
|
|
1737
|
-
|
|
1789
|
+
}
|
|
1790
|
+
processIdCompressorMessages(messageContents, savedOp) {
|
|
1791
|
+
for (const range of messageContents) {
|
|
1792
|
+
// Don't re-finalize the range if we're processing a "savedOp" in
|
|
1793
|
+
// stashed ops flow. The compressor is stashed with these ops already processed.
|
|
1794
|
+
// That said, in idCompressorMode === "delayed", we might not serialize ID compressor, and
|
|
1795
|
+
// thus we need to process all the ops.
|
|
1796
|
+
if (!(this.skipSavedCompressorOps && savedOp === true)) {
|
|
1797
|
+
// Some other client turned on the id compressor. If we have not turned it on,
|
|
1798
|
+
// put it in a pending queue and delay finalization.
|
|
1799
|
+
if (this._idCompressor === undefined) {
|
|
1800
|
+
(0, internal_2.assert)(this.idCompressorMode !== undefined, 0x93c /* id compressor should be enabled */);
|
|
1801
|
+
this.pendingIdCompressorOps.push(range);
|
|
1802
|
+
}
|
|
1803
|
+
else {
|
|
1804
|
+
(0, internal_2.assert)(this.pendingIdCompressorOps.length === 0, 0x979 /* there should be no pending ops! */);
|
|
1805
|
+
this._idCompressor.finalizeCreationRange(range);
|
|
1806
|
+
}
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1738
1809
|
}
|
|
1739
1810
|
/**
|
|
1740
1811
|
* Emits the Signal event and update the perf signal data.
|
|
@@ -2310,7 +2381,17 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2310
2381
|
},
|
|
2311
2382
|
},
|
|
2312
2383
|
});
|
|
2313
|
-
|
|
2384
|
+
// legacy: assert 0x3d1
|
|
2385
|
+
if (!this.outbox.isEmpty) {
|
|
2386
|
+
throw internal_7.DataProcessingError.create("Can't trigger summary in the middle of a batch", "submitSummary", undefined, {
|
|
2387
|
+
summaryNumber,
|
|
2388
|
+
pendingMessages: this.pendingMessagesCount,
|
|
2389
|
+
outboxLength: this.outbox.messageCount,
|
|
2390
|
+
mainBatchLength: this.outbox.mainBatchMessageCount,
|
|
2391
|
+
blobAttachBatchLength: this.outbox.blobAttachBatchMessageCount,
|
|
2392
|
+
idAllocationBatchLength: this.outbox.idAllocationBatchMessageCount,
|
|
2393
|
+
});
|
|
2394
|
+
}
|
|
2314
2395
|
// If the container is dirty, i.e., there are pending unacked ops, the summary will not be eventual consistent
|
|
2315
2396
|
// and it may even be incorrect. So, wait for the container to be saved with a timeout. If the container is not
|
|
2316
2397
|
// saved within the timeout, check if it should be failed or can continue.
|