@fluidframework/container-runtime 0.51.0-43124 → 0.51.3
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/dist/containerRuntime.d.ts +31 -31
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +61 -144
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.js +1 -1
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +3 -5
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +3 -4
- package/dist/dataStores.js.map +1 -1
- package/dist/garbageCollection.d.ts +116 -0
- package/dist/garbageCollection.d.ts.map +1 -0
- package/dist/garbageCollection.js +148 -0
- package/dist/garbageCollection.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.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/pendingStateManager.d.ts +0 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +0 -36
- package/dist/pendingStateManager.js.map +1 -1
- package/lib/containerRuntime.d.ts +31 -31
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +62 -145
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.js +1 -1
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +3 -5
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +3 -4
- package/lib/dataStores.js.map +1 -1
- package/lib/garbageCollection.d.ts +116 -0
- package/lib/garbageCollection.d.ts.map +1 -0
- package/lib/garbageCollection.js +144 -0
- package/lib/garbageCollection.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.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/pendingStateManager.d.ts +0 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +0 -36
- package/lib/pendingStateManager.js.map +1 -1
- package/package.json +11 -11
- package/src/containerRuntime.ts +89 -188
- package/src/dataStoreContext.ts +1 -1
- package/src/dataStores.ts +5 -5
- package/src/garbageCollection.ts +269 -0
- package/src/index.ts +1 -0
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +0 -43
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pendingStateManager.js","sourceRoot":"","sources":["../src/pendingStateManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDisposable } from \"@fluidframework/common-definitions\";\nimport { assert, Lazy } from \"@fluidframework/common-utils\";\nimport { DataProcessingError } from \"@fluidframework/container-utils\";\nimport {\n ISequencedDocumentMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport Deque from \"double-ended-queue\";\nimport { ContainerRuntime, ContainerMessageType, isRuntimeMessage } from \"./containerRuntime\";\n\n/**\n * This represents a message that has been submitted and is added to the pending queue when `submit` is called on the\n * ContainerRuntime. This message has either not been ack'd by the server or has not been submitted to the server yet.\n */\nexport interface IPendingMessage {\n type: \"message\";\n messageType: ContainerMessageType;\n clientSequenceNumber: number;\n referenceSequenceNumber: number;\n content: any;\n localOpMetadata: unknown;\n opMetadata: Record<string, unknown> | undefined;\n}\n\n/**\n * This represents a FlushMode update and is added to the pending queue when `setFlushMode` is called on the\n * ContainerRuntime and the FlushMode changes.\n */\nexport interface IPendingFlushMode {\n type: \"flushMode\";\n flushMode: FlushMode;\n}\n\n/**\n * This represents a manual flush and is added to the pending queue when `flush` is called on the ContainerRuntime to\n * flush any pending messages. This is applicable only when the FlushMode is Manual.\n */\nexport interface IPendingFlush {\n type: \"flush\";\n}\n\nexport type IPendingState = IPendingMessage | IPendingFlushMode | IPendingFlush;\n\nexport interface IPendingLocalState {\n /**\n * client ID we most recently connected with, or undefined if we never connected\n */\n clientId?: string;\n /**\n * list of pending states, including ops and batch information\n */\n pendingStates: IPendingState[];\n}\n\n/**\n * PendingStateManager is responsible for maintaining the messages that have not been sent or have not yet been\n * acknowledged by the server. It also maintains the batch information for both automatically and manually flushed\n * batches along with the messages.\n * When the Container reconnects, it replays the pending states, which includes setting the FlushMode, manual flushing\n * of messages and triggering resubmission of unacked ops.\n *\n * It verifies that all the ops are acked, are received in the right order and batch information is correct.\n */\nexport class PendingStateManager implements IDisposable {\n private readonly pendingStates = new Deque<IPendingState>();\n private readonly initialStates: Deque<IPendingState>;\n private readonly previousClientIds = new Set<string>();\n private readonly firstStashedCSN: number = -1;\n private stashedCount = 0;\n private readonly disposeOnce = new Lazy<void>(() => {\n this.initialStates.clear();\n this.pendingStates.clear();\n });\n\n // Maintains the count of messages that are currently unacked.\n private pendingMessagesCount: number = 0;\n\n // Indicates whether we are processing a batch.\n private isProcessingBatch: boolean = false;\n\n // This stores the first message in the batch that we are processing. This is used to verify that we get\n // the correct batch metadata.\n private pendingBatchBeginMessage: ISequencedDocumentMessage | undefined;\n\n private clientId: string | undefined;\n\n private get connected(): boolean {\n return this.containerRuntime.connected;\n }\n\n /**\n * Called to check if there are any pending messages in the pending state queue.\n * @returns A boolean indicating whether there are messages or not.\n */\n public hasPendingMessages(): boolean {\n return this.pendingMessagesCount !== 0;\n }\n\n public getLocalState(): IPendingLocalState | undefined {\n if (this.hasPendingMessages()) {\n return {\n clientId: this.clientId,\n pendingStates: this.pendingStates.toArray().map(\n // delete localOpMetadata since it may not be serializable\n // and will be regenerated by applyStashedOp()\n (state) => state.type === \"message\" ? {...state, localOpMetadata: undefined } : state),\n };\n }\n }\n\n constructor(\n private readonly containerRuntime: ContainerRuntime,\n private readonly applyStashedOp: (type, content) => Promise<unknown>,\n initialState: IPendingLocalState | undefined,\n ) {\n this.initialStates = new Deque<IPendingState>(initialState?.pendingStates ?? []);\n\n if (initialState) {\n if (initialState?.clientId) {\n this.previousClientIds.add(initialState.clientId);\n }\n // get stashed op count and client sequence number of first op\n const messages = initialState.pendingStates\n .filter((state) => state.type === \"message\") as IPendingMessage[];\n this.stashedCount = messages.length;\n this.firstStashedCSN = messages[0].clientSequenceNumber;\n }\n }\n\n public get disposed() { return this.disposeOnce.evaluated; }\n public readonly dispose = () => this.disposeOnce.value;\n\n /**\n * Called when a message is submitted locally. Adds the message and the associated details to the pending state\n * queue.\n * @param type - The container message type.\n * @param clientSequenceNumber - The clientSequenceNumber associated with the message.\n * @param content - The message content.\n * @param localOpMetadata - The local metadata associated with the message.\n */\n public onSubmitMessage(\n type: ContainerMessageType,\n clientSequenceNumber: number,\n referenceSequenceNumber: number,\n content: any,\n localOpMetadata: unknown,\n opMetadata: Record<string, unknown> | undefined,\n ) {\n const pendingMessage: IPendingMessage = {\n type: \"message\",\n messageType: type,\n clientSequenceNumber,\n referenceSequenceNumber,\n content,\n localOpMetadata,\n opMetadata,\n };\n\n this.pendingStates.push(pendingMessage);\n\n this.pendingMessagesCount++;\n }\n\n /**\n * Called when the FlushMode is updated. Adds the FlushMode to the pending state queue.\n * @param flushMode - The flushMode that was updated.\n */\n public onFlushModeUpdated(flushMode: FlushMode) {\n if (flushMode === FlushMode.Immediate) {\n const previousState = this.pendingStates.peekBack();\n\n // We don't have to track a previous \"flush\" state because FlushMode.Immediate flushes the messages. So,\n // just tracking this FlushMode.Immediate is enough.\n if (previousState?.type === \"flush\") {\n this.pendingStates.removeBack();\n }\n\n // If no messages were sent between FlushMode.TurnBased and FlushMode.Immediate,\n // then we do not have to track both these states.\n // Remove FlushMode.TurnBased from the pending queue and return.\n if (previousState?.type === \"flushMode\" && previousState.flushMode === FlushMode.TurnBased) {\n this.pendingStates.removeBack();\n return;\n }\n }\n\n const pendingFlushMode: IPendingFlushMode = {\n type: \"flushMode\",\n flushMode,\n };\n this.pendingStates.push(pendingFlushMode);\n }\n\n /**\n * Called when flush() is called on the ContainerRuntime to manually flush messages.\n */\n public onFlush() {\n // If the FlushMode is Immediate, we should not track this flush call as it is only applicable when FlushMode\n // is TurnBased.\n if (this.containerRuntime.flushMode === FlushMode.Immediate) {\n return;\n }\n\n // If the previous state is not a message, we don't have to track this flush call as there is nothing to flush.\n const previousState = this.pendingStates.peekBack();\n if (previousState?.type !== \"message\") {\n return;\n }\n\n // Note that because of the checks above and the checks in onFlushModeUpdated(), we can be sure that a \"flush\"\n // state always has a \"message\" before and after it. So, it marks the end of a batch and the beginning of a\n // new one.\n const pendingFlush: IPendingFlush = {\n type: \"flush\",\n };\n this.pendingStates.push(pendingFlush);\n }\n\n /**\n * Applies stashed ops at their reference sequence number so they are ready to be ACKed or resubmitted\n */\n public async applyStashedOpsAt(seqNum: number) {\n // apply stashed ops at sequence number\n while (!this.initialStates.isEmpty()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const nextState = this.initialStates.peekFront()!;\n if (nextState.type === \"message\") {\n if (nextState.referenceSequenceNumber > seqNum) {\n break; // nothing left to do at this sequence number\n } else if (nextState.referenceSequenceNumber > 0 && nextState.referenceSequenceNumber < seqNum) {\n throw new Error(\"loaded from snapshot too recent to apply stashed ops\");\n }\n\n // applyStashedOp will cause the DDS to behave as if it has sent the op but not actually send it\n const localOpMetadata = await this.applyStashedOp(nextState.messageType, nextState.content);\n nextState.localOpMetadata = localOpMetadata;\n }\n\n // then we push onto pendingStates which will cause PendingStateManager to resubmit when we connect\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.pendingStates.push(this.initialStates.shift()!);\n }\n }\n\n /**\n * Processes a local message once it's ack'd by the server to verify that there was no data corruption and that\n * the batch information was preserved for batch messages. Also process remote messages that might have been\n * sent from a previous container.\n * @param message - The messsage that got ack'd and needs to be processed.\n */\n public processMessage(message: ISequencedDocumentMessage, local: boolean) {\n // Do not process chunked ops until all pieces are available.\n if (message.type === ContainerMessageType.ChunkedOp) {\n return { localAck: false, localOpMetadata: undefined };\n }\n\n if (local) {\n return { localAck: false, localOpMetadata: this.processPendingLocalMessage(message) };\n } else {\n return this.processRemoteMessage(message);\n }\n }\n\n /**\n * Listens for ACKs of stashed ops\n */\n private processRemoteMessage(message: ISequencedDocumentMessage) {\n if (!isRuntimeMessage(message)) {\n return { localAck: false, localOpMetadata: undefined };\n }\n\n // this message was a pending op that was actually sent successfully\n const isOriginalClientId = message.clientId === Array.from(this.previousClientIds)[0] &&\n message.clientSequenceNumber >= this.firstStashedCSN;\n // this message is a pending or stashed op that was resubmitted\n const isNewClientId = Array.from(this.previousClientIds).indexOf(message.clientId) > 0;\n\n // if this is an ack for a stashed op, dequeue one message.\n // we should have seen its ref seq num by now and the DDS should be ready for it to be ACKed\n if (isOriginalClientId || isNewClientId) {\n assert(this.clientId === undefined, 0x28b /* \"multiple clients connected with stashed ops\" */);\n while (!this.pendingStates.isEmpty()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const nextState = this.pendingStates.shift()!;\n // if it's not a message just drop it and keep looking\n if (nextState.type === \"message\") {\n this.assertOpMatch(nextState, message, isOriginalClientId);\n --this.stashedCount;\n return { localAck: true, localOpMetadata: nextState.localOpMetadata };\n }\n }\n }\n\n if (message.type === ContainerMessageType.Rejoin && this.previousClientIds.has(message.contents?.clientId)) {\n this.previousClientIds.add(message.clientId);\n }\n\n return { localAck: false, localOpMetadata: undefined };\n }\n\n private assertOpMatch(state: IPendingMessage, message: ISequencedDocumentMessage, isOriginalClientId: boolean) {\n assert(message.type === state.messageType, 0x28c /* \"different message type\" */);\n assert(message.clientSequenceNumber === state.clientSequenceNumber || !isOriginalClientId,\n 0x28d /* \"client sequence number doesn't match\" */);\n switch(message.type) {\n case ContainerMessageType.Attach:\n assert(message.contents.id === state.content.id, 0x28e /* \"datastore ID doesn't match\" */);\n break;\n case ContainerMessageType.FluidDataStoreOp:\n assert(message.contents.address === state.content.address, 0x28f /* \"address doesn't match\" */);\n break;\n case ContainerMessageType.BlobAttach:\n // todo: assert we have blob storage, assert blob IDs match, remove blob from blob storage since it made\n // it through successfully\n break;\n case ContainerMessageType.Rejoin:\n default:\n throw new Error(`${message.type} not expected`);\n }\n }\n\n /**\n * Processes a local message once its ack'd by the server. It verifies that there was no data corruption and that\n * the batch information was preserved for batch messages.\n * @param message - The messsage that got ack'd and needs to be processed.\n */\n private processPendingLocalMessage(message: ISequencedDocumentMessage): unknown {\n // Pre-processing part - This may be the start of a batch.\n this.maybeProcessBatchBegin(message);\n\n // Get the next state from the pending queue and verify that it is of type \"message\".\n const pendingState = this.peekNextPendingState();\n assert(pendingState.type === \"message\", 0x169 /* \"No pending message found for this remote message\" */);\n this.pendingStates.shift();\n\n // Processing part - Verify that there has been no data corruption.\n // The clientSequenceNumber of the incoming message must match that of the pending message.\n if (pendingState.clientSequenceNumber !== message.clientSequenceNumber) {\n // Close the container because this could indicate data corruption.\n const error = new DataProcessingError(\n \"unexpectedAckReceived\",\n \"unexpectedAckReceived\",\n {\n clientId: message.clientId,\n sequenceNumber: message.sequenceNumber,\n clientSequenceNumber: message.clientSequenceNumber,\n expectedClientSequenceNumber: pendingState.clientSequenceNumber,\n },\n );\n\n this.containerRuntime.closeFn(error);\n return;\n }\n\n this.pendingMessagesCount--;\n\n // Post-processing part - If we are processing a batch then this could be the last message in the batch.\n if (this.isProcessingBatch) {\n this.maybeProcessBatchEnd(message);\n }\n\n return pendingState.localOpMetadata;\n }\n\n /**\n * This message could be the first message in batch. If so, set batch state marking the beginning of a batch.\n * @param message - The message that is being processed.\n */\n private maybeProcessBatchBegin(message: ISequencedDocumentMessage) {\n const pendingState = this.peekNextPendingState();\n if (pendingState.type !== \"flush\" && pendingState.type !== \"flushMode\") {\n return;\n }\n\n // If the pending state is of type \"flushMode\", it must be Manual since Automatic flush mode is processed\n // after a message is processed and not before.\n if (pendingState.type === \"flushMode\") {\n assert(pendingState.flushMode === FlushMode.TurnBased,\n 0x16a /* \"Flush mode should be manual when processing batch begin\" */);\n }\n\n // We should not already be processing a batch and there should be no pending batch begin message.\n assert(!this.isProcessingBatch && this.pendingBatchBeginMessage === undefined,\n 0x16b /* \"The pending batch state indicates we are already processing a batch\" */);\n\n // Set the pending batch state indicating we have started processing a batch.\n this.pendingBatchBeginMessage = message;\n this.isProcessingBatch = true;\n\n // Remove this pending state from the queue as we have processed it.\n this.pendingStates.shift();\n }\n\n private maybeProcessBatchEnd(message: ISequencedDocumentMessage) {\n const nextPendingState = this.peekNextPendingState();\n if (nextPendingState.type !== \"flush\" && nextPendingState.type !== \"flushMode\") {\n return;\n }\n\n // If the next pending state is of type \"flushMode\", it must be Immediate and if so, we need to remove it from\n // the queue.\n // Note that we do not remove the type \"flush\" from the queue because it indicates the end of one batch and the\n // beginning of a new one. So, it will removed when the next batch begin is processed.\n if (nextPendingState.type === \"flushMode\") {\n assert(nextPendingState.flushMode === FlushMode.Immediate,\n 0x16c /* \"Flush mode is set to TurnBased in the middle of processing a batch\" */);\n this.pendingStates.shift();\n }\n\n // There should be a pending batch begin message.\n assert(this.pendingBatchBeginMessage !== undefined, 0x16d /* \"There is no pending batch begin message\" */);\n\n // Get the batch begin metadata from the first message in the batch.\n const batchBeginMetadata = this.pendingBatchBeginMessage.metadata?.batch;\n\n // There could be just a single message in the batch. If so, it should not have any batch metadata. If there\n // are multiple messages in the batch, verify that we got the correct batch begin and end metadata.\n if (this.pendingBatchBeginMessage === message) {\n assert(batchBeginMetadata === undefined,\n 0x16e /* \"Batch with single message should not have batch metadata\" */);\n } else {\n // Get the batch metadata from the last message in the batch.\n const batchEndMetadata = message.metadata?.batch;\n assert(batchBeginMetadata === true, 0x16f /* \"Did not receive batch begin metadata\" */);\n assert(batchEndMetadata === false, 0x170 /* \"Did not receive batch end metadata\" */);\n }\n\n // Clear the pending batch state now that we have processed the entire batch.\n this.pendingBatchBeginMessage = undefined;\n this.isProcessingBatch = false;\n }\n\n /**\n * Returns the next pending state from the pending state queue.\n */\n private peekNextPendingState(): IPendingState {\n const nextPendingState = this.pendingStates.peekFront();\n assert(!!nextPendingState, 0x171 /* \"No pending state found for the remote message\" */);\n return nextPendingState;\n }\n\n /**\n * Called when the Container's connection state changes. If the Container gets connected, it replays all the pending\n * states in its queue. This includes setting the FlushMode and triggering resubmission of unacked ops.\n */\n public replayPendingStates() {\n assert(this.connected, 0x172 /* \"The connection state is not consistent with the runtime\" */);\n\n // This assert suggests we are about to send same ops twice, which will result in data loss.\n assert(this.clientId !== this.containerRuntime.clientId,\n 0x173 /* \"replayPendingStates called twice for same clientId!\" */);\n const prevClientId = this.clientId;\n this.clientId = this.containerRuntime.clientId;\n\n assert(this.initialStates.isEmpty(), 0x174 /* \"initial states should be empty before replaying pending\" */);\n\n let pendingStatesCount = this.pendingStates.length;\n if (pendingStatesCount === 0) {\n return;\n }\n\n if (!prevClientId && this.stashedCount > 0) {\n // this is first connect, verify we are about to \"resubmit\" only stashed ops\n assert(this.pendingStates.toArray().filter((s) => s.type === \"message\").length === this.stashedCount,\n 0x290 /* \"unexpected message queued before first connect\" */);\n\n Array.from(this.previousClientIds).map((id) =>\n assert(this.containerRuntime.getQuorum().getMember(id) === undefined,\n 0x291 /* \"client with stashed ops already connected\" */));\n\n // send rejoin op with stashed client ID if we have it\n if (this.previousClientIds.size > 0) {\n const clientId = Array.from(this.previousClientIds)[0];\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n this.pendingStates.unshift({\n type: \"message\",\n messageType: ContainerMessageType.Rejoin,\n content: { clientId },\n } as IPendingMessage);\n ++pendingStatesCount;\n }\n }\n\n if (prevClientId) {\n // add a rejoin op so future clients provided with our stashed pending ops can recognize them\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const firstState = this.pendingStates.peekFront()!;\n if (firstState.type !== \"message\" || firstState.messageType !== ContainerMessageType.Rejoin) {\n // if there is already a rejoin op in the queue, just resubmit same op under new client ID\n // otherwise, add one to the queue\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n this.pendingStates.unshift({\n type: \"message\",\n messageType: ContainerMessageType.Rejoin,\n content: { clientId: prevClientId },\n } as IPendingMessage);\n ++pendingStatesCount;\n }\n }\n\n // Reset the pending message count because all these messages will be removed from the queue.\n this.pendingMessagesCount = 0;\n\n // Save the current FlushMode so that we can revert it back after replaying the states.\n const savedFlushMode = this.containerRuntime.flushMode;\n\n // Process exactly `pendingStatesCount` items in the queue as it represents the number of states that were\n // pending when we connected. This is important because the `reSubmitFn` might add more items in the queue\n // which must not be replayed.\n while (pendingStatesCount > 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const pendingState = this.pendingStates.shift()!;\n switch (pendingState.type) {\n case \"message\":\n {\n this.containerRuntime.reSubmitFn(\n pendingState.messageType,\n pendingState.content,\n pendingState.localOpMetadata,\n pendingState.opMetadata);\n }\n break;\n case \"flushMode\":\n {\n this.containerRuntime.setFlushMode(pendingState.flushMode);\n }\n break;\n case \"flush\":\n {\n this.containerRuntime.flush();\n }\n break;\n default:\n break;\n }\n pendingStatesCount--;\n }\n\n // Revert the FlushMode.\n this.containerRuntime.setFlushMode(savedFlushMode);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pendingStateManager.js","sourceRoot":"","sources":["../src/pendingStateManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDisposable } from \"@fluidframework/common-definitions\";\nimport { assert, Lazy } from \"@fluidframework/common-utils\";\nimport { DataProcessingError } from \"@fluidframework/container-utils\";\nimport {\n ISequencedDocumentMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport { FlushMode } from \"@fluidframework/runtime-definitions\";\nimport Deque from \"double-ended-queue\";\nimport { ContainerRuntime, ContainerMessageType, isRuntimeMessage } from \"./containerRuntime\";\n\n/**\n * This represents a message that has been submitted and is added to the pending queue when `submit` is called on the\n * ContainerRuntime. This message has either not been ack'd by the server or has not been submitted to the server yet.\n */\nexport interface IPendingMessage {\n type: \"message\";\n messageType: ContainerMessageType;\n clientSequenceNumber: number;\n referenceSequenceNumber: number;\n content: any;\n localOpMetadata: unknown;\n opMetadata: Record<string, unknown> | undefined;\n}\n\n/**\n * This represents a FlushMode update and is added to the pending queue when `setFlushMode` is called on the\n * ContainerRuntime and the FlushMode changes.\n */\nexport interface IPendingFlushMode {\n type: \"flushMode\";\n flushMode: FlushMode;\n}\n\n/**\n * This represents a manual flush and is added to the pending queue when `flush` is called on the ContainerRuntime to\n * flush any pending messages. This is applicable only when the FlushMode is Manual.\n */\nexport interface IPendingFlush {\n type: \"flush\";\n}\n\nexport type IPendingState = IPendingMessage | IPendingFlushMode | IPendingFlush;\n\nexport interface IPendingLocalState {\n /**\n * client ID we most recently connected with, or undefined if we never connected\n */\n clientId?: string;\n /**\n * list of pending states, including ops and batch information\n */\n pendingStates: IPendingState[];\n}\n\n/**\n * PendingStateManager is responsible for maintaining the messages that have not been sent or have not yet been\n * acknowledged by the server. It also maintains the batch information for both automatically and manually flushed\n * batches along with the messages.\n * When the Container reconnects, it replays the pending states, which includes setting the FlushMode, manual flushing\n * of messages and triggering resubmission of unacked ops.\n *\n * It verifies that all the ops are acked, are received in the right order and batch information is correct.\n */\nexport class PendingStateManager implements IDisposable {\n private readonly pendingStates = new Deque<IPendingState>();\n private readonly initialStates: Deque<IPendingState>;\n private readonly previousClientIds = new Set<string>();\n private readonly firstStashedCSN: number = -1;\n private readonly disposeOnce = new Lazy<void>(() => {\n this.initialStates.clear();\n this.pendingStates.clear();\n });\n\n // Maintains the count of messages that are currently unacked.\n private pendingMessagesCount: number = 0;\n\n // Indicates whether we are processing a batch.\n private isProcessingBatch: boolean = false;\n\n // This stores the first message in the batch that we are processing. This is used to verify that we get\n // the correct batch metadata.\n private pendingBatchBeginMessage: ISequencedDocumentMessage | undefined;\n\n private clientId: string | undefined;\n\n private get connected(): boolean {\n return this.containerRuntime.connected;\n }\n\n /**\n * Called to check if there are any pending messages in the pending state queue.\n * @returns A boolean indicating whether there are messages or not.\n */\n public hasPendingMessages(): boolean {\n return this.pendingMessagesCount !== 0;\n }\n\n public getLocalState(): IPendingLocalState | undefined {\n if (this.hasPendingMessages()) {\n return {\n clientId: this.clientId,\n pendingStates: this.pendingStates.toArray().map(\n // delete localOpMetadata since it may not be serializable\n // and will be regenerated by applyStashedOp()\n (state) => state.type === \"message\" ? {...state, localOpMetadata: undefined } : state),\n };\n }\n }\n\n constructor(\n private readonly containerRuntime: ContainerRuntime,\n private readonly applyStashedOp: (type, content) => Promise<unknown>,\n initialState: IPendingLocalState | undefined,\n ) {\n this.initialStates = new Deque<IPendingState>(initialState?.pendingStates ?? []);\n\n if (initialState) {\n if (initialState?.clientId) {\n this.previousClientIds.add(initialState.clientId);\n }\n // get stashed op count and client sequence number of first op\n const messages = initialState.pendingStates\n .filter((state) => state.type === \"message\") as IPendingMessage[];\n this.firstStashedCSN = messages[0].clientSequenceNumber;\n }\n }\n\n public get disposed() { return this.disposeOnce.evaluated; }\n public readonly dispose = () => this.disposeOnce.value;\n\n /**\n * Called when a message is submitted locally. Adds the message and the associated details to the pending state\n * queue.\n * @param type - The container message type.\n * @param clientSequenceNumber - The clientSequenceNumber associated with the message.\n * @param content - The message content.\n * @param localOpMetadata - The local metadata associated with the message.\n */\n public onSubmitMessage(\n type: ContainerMessageType,\n clientSequenceNumber: number,\n referenceSequenceNumber: number,\n content: any,\n localOpMetadata: unknown,\n opMetadata: Record<string, unknown> | undefined,\n ) {\n const pendingMessage: IPendingMessage = {\n type: \"message\",\n messageType: type,\n clientSequenceNumber,\n referenceSequenceNumber,\n content,\n localOpMetadata,\n opMetadata,\n };\n\n this.pendingStates.push(pendingMessage);\n\n this.pendingMessagesCount++;\n }\n\n /**\n * Called when the FlushMode is updated. Adds the FlushMode to the pending state queue.\n * @param flushMode - The flushMode that was updated.\n */\n public onFlushModeUpdated(flushMode: FlushMode) {\n if (flushMode === FlushMode.Immediate) {\n const previousState = this.pendingStates.peekBack();\n\n // We don't have to track a previous \"flush\" state because FlushMode.Immediate flushes the messages. So,\n // just tracking this FlushMode.Immediate is enough.\n if (previousState?.type === \"flush\") {\n this.pendingStates.removeBack();\n }\n\n // If no messages were sent between FlushMode.TurnBased and FlushMode.Immediate,\n // then we do not have to track both these states.\n // Remove FlushMode.TurnBased from the pending queue and return.\n if (previousState?.type === \"flushMode\" && previousState.flushMode === FlushMode.TurnBased) {\n this.pendingStates.removeBack();\n return;\n }\n }\n\n const pendingFlushMode: IPendingFlushMode = {\n type: \"flushMode\",\n flushMode,\n };\n this.pendingStates.push(pendingFlushMode);\n }\n\n /**\n * Called when flush() is called on the ContainerRuntime to manually flush messages.\n */\n public onFlush() {\n // If the FlushMode is Immediate, we should not track this flush call as it is only applicable when FlushMode\n // is TurnBased.\n if (this.containerRuntime.flushMode === FlushMode.Immediate) {\n return;\n }\n\n // If the previous state is not a message, we don't have to track this flush call as there is nothing to flush.\n const previousState = this.pendingStates.peekBack();\n if (previousState?.type !== \"message\") {\n return;\n }\n\n // Note that because of the checks above and the checks in onFlushModeUpdated(), we can be sure that a \"flush\"\n // state always has a \"message\" before and after it. So, it marks the end of a batch and the beginning of a\n // new one.\n const pendingFlush: IPendingFlush = {\n type: \"flush\",\n };\n this.pendingStates.push(pendingFlush);\n }\n\n /**\n * Applies stashed ops at their reference sequence number so they are ready to be ACKed or resubmitted\n */\n public async applyStashedOpsAt(seqNum: number) {\n // apply stashed ops at sequence number\n while (!this.initialStates.isEmpty()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const nextState = this.initialStates.peekFront()!;\n if (nextState.type === \"message\") {\n if (nextState.referenceSequenceNumber > seqNum) {\n break; // nothing left to do at this sequence number\n } else if (nextState.referenceSequenceNumber > 0 && nextState.referenceSequenceNumber < seqNum) {\n throw new Error(\"loaded from snapshot too recent to apply stashed ops\");\n }\n\n // applyStashedOp will cause the DDS to behave as if it has sent the op but not actually send it\n const localOpMetadata = await this.applyStashedOp(nextState.messageType, nextState.content);\n nextState.localOpMetadata = localOpMetadata;\n }\n\n // then we push onto pendingStates which will cause PendingStateManager to resubmit when we connect\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.pendingStates.push(this.initialStates.shift()!);\n }\n }\n\n /**\n * Processes a local message once it's ack'd by the server to verify that there was no data corruption and that\n * the batch information was preserved for batch messages. Also process remote messages that might have been\n * sent from a previous container.\n * @param message - The messsage that got ack'd and needs to be processed.\n */\n public processMessage(message: ISequencedDocumentMessage, local: boolean) {\n // Do not process chunked ops until all pieces are available.\n if (message.type === ContainerMessageType.ChunkedOp) {\n return { localAck: false, localOpMetadata: undefined };\n }\n\n if (local) {\n return { localAck: false, localOpMetadata: this.processPendingLocalMessage(message) };\n } else {\n return this.processRemoteMessage(message);\n }\n }\n\n /**\n * Listens for ACKs of stashed ops\n */\n private processRemoteMessage(message: ISequencedDocumentMessage) {\n if (!isRuntimeMessage(message)) {\n return { localAck: false, localOpMetadata: undefined };\n }\n\n // this message was a pending op that was actually sent successfully\n const isOriginalClientId = message.clientId === Array.from(this.previousClientIds)[0] &&\n message.clientSequenceNumber >= this.firstStashedCSN;\n // this message is a pending or stashed op that was resubmitted\n const isNewClientId = Array.from(this.previousClientIds).indexOf(message.clientId) > 0;\n\n // if this is an ack for a stashed op, dequeue one message.\n // we should have seen its ref seq num by now and the DDS should be ready for it to be ACKed\n if (isOriginalClientId || isNewClientId) {\n assert(this.clientId === undefined, 0x28b /* \"multiple clients connected with stashed ops\" */);\n while (!this.pendingStates.isEmpty()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const nextState = this.pendingStates.shift()!;\n // if it's not a message just drop it and keep looking\n if (nextState.type === \"message\") {\n this.assertOpMatch(nextState, message, isOriginalClientId);\n return { localAck: true, localOpMetadata: nextState.localOpMetadata };\n }\n }\n }\n\n if (message.type === ContainerMessageType.Rejoin && this.previousClientIds.has(message.contents?.clientId)) {\n this.previousClientIds.add(message.clientId);\n }\n\n return { localAck: false, localOpMetadata: undefined };\n }\n\n private assertOpMatch(state: IPendingMessage, message: ISequencedDocumentMessage, isOriginalClientId: boolean) {\n assert(message.type === state.messageType, 0x28c /* \"different message type\" */);\n assert(message.clientSequenceNumber === state.clientSequenceNumber || !isOriginalClientId,\n 0x28d /* \"client sequence number doesn't match\" */);\n switch(message.type) {\n case ContainerMessageType.Attach:\n assert(message.contents.id === state.content.id, 0x28e /* \"datastore ID doesn't match\" */);\n break;\n case ContainerMessageType.FluidDataStoreOp:\n assert(message.contents.address === state.content.address, 0x28f /* \"address doesn't match\" */);\n break;\n case ContainerMessageType.BlobAttach:\n // todo: assert we have blob storage, assert blob IDs match, remove blob from blob storage since it made\n // it through successfully\n break;\n case ContainerMessageType.Rejoin:\n default:\n throw new Error(`${message.type} not expected`);\n }\n }\n\n /**\n * Processes a local message once its ack'd by the server. It verifies that there was no data corruption and that\n * the batch information was preserved for batch messages.\n * @param message - The messsage that got ack'd and needs to be processed.\n */\n private processPendingLocalMessage(message: ISequencedDocumentMessage): unknown {\n // Pre-processing part - This may be the start of a batch.\n this.maybeProcessBatchBegin(message);\n\n // Get the next state from the pending queue and verify that it is of type \"message\".\n const pendingState = this.peekNextPendingState();\n assert(pendingState.type === \"message\", 0x169 /* \"No pending message found for this remote message\" */);\n this.pendingStates.shift();\n\n // Processing part - Verify that there has been no data corruption.\n // The clientSequenceNumber of the incoming message must match that of the pending message.\n if (pendingState.clientSequenceNumber !== message.clientSequenceNumber) {\n // Close the container because this could indicate data corruption.\n const error = new DataProcessingError(\n \"unexpectedAckReceived\",\n \"unexpectedAckReceived\",\n {\n clientId: message.clientId,\n sequenceNumber: message.sequenceNumber,\n clientSequenceNumber: message.clientSequenceNumber,\n expectedClientSequenceNumber: pendingState.clientSequenceNumber,\n },\n );\n\n this.containerRuntime.closeFn(error);\n return;\n }\n\n this.pendingMessagesCount--;\n\n // Post-processing part - If we are processing a batch then this could be the last message in the batch.\n if (this.isProcessingBatch) {\n this.maybeProcessBatchEnd(message);\n }\n\n return pendingState.localOpMetadata;\n }\n\n /**\n * This message could be the first message in batch. If so, set batch state marking the beginning of a batch.\n * @param message - The message that is being processed.\n */\n private maybeProcessBatchBegin(message: ISequencedDocumentMessage) {\n const pendingState = this.peekNextPendingState();\n if (pendingState.type !== \"flush\" && pendingState.type !== \"flushMode\") {\n return;\n }\n\n // If the pending state is of type \"flushMode\", it must be Manual since Automatic flush mode is processed\n // after a message is processed and not before.\n if (pendingState.type === \"flushMode\") {\n assert(pendingState.flushMode === FlushMode.TurnBased,\n 0x16a /* \"Flush mode should be manual when processing batch begin\" */);\n }\n\n // We should not already be processing a batch and there should be no pending batch begin message.\n assert(!this.isProcessingBatch && this.pendingBatchBeginMessage === undefined,\n 0x16b /* \"The pending batch state indicates we are already processing a batch\" */);\n\n // Set the pending batch state indicating we have started processing a batch.\n this.pendingBatchBeginMessage = message;\n this.isProcessingBatch = true;\n\n // Remove this pending state from the queue as we have processed it.\n this.pendingStates.shift();\n }\n\n private maybeProcessBatchEnd(message: ISequencedDocumentMessage) {\n const nextPendingState = this.peekNextPendingState();\n if (nextPendingState.type !== \"flush\" && nextPendingState.type !== \"flushMode\") {\n return;\n }\n\n // If the next pending state is of type \"flushMode\", it must be Immediate and if so, we need to remove it from\n // the queue.\n // Note that we do not remove the type \"flush\" from the queue because it indicates the end of one batch and the\n // beginning of a new one. So, it will removed when the next batch begin is processed.\n if (nextPendingState.type === \"flushMode\") {\n assert(nextPendingState.flushMode === FlushMode.Immediate,\n 0x16c /* \"Flush mode is set to TurnBased in the middle of processing a batch\" */);\n this.pendingStates.shift();\n }\n\n // There should be a pending batch begin message.\n assert(this.pendingBatchBeginMessage !== undefined, 0x16d /* \"There is no pending batch begin message\" */);\n\n // Get the batch begin metadata from the first message in the batch.\n const batchBeginMetadata = this.pendingBatchBeginMessage.metadata?.batch;\n\n // There could be just a single message in the batch. If so, it should not have any batch metadata. If there\n // are multiple messages in the batch, verify that we got the correct batch begin and end metadata.\n if (this.pendingBatchBeginMessage === message) {\n assert(batchBeginMetadata === undefined,\n 0x16e /* \"Batch with single message should not have batch metadata\" */);\n } else {\n // Get the batch metadata from the last message in the batch.\n const batchEndMetadata = message.metadata?.batch;\n assert(batchBeginMetadata === true, 0x16f /* \"Did not receive batch begin metadata\" */);\n assert(batchEndMetadata === false, 0x170 /* \"Did not receive batch end metadata\" */);\n }\n\n // Clear the pending batch state now that we have processed the entire batch.\n this.pendingBatchBeginMessage = undefined;\n this.isProcessingBatch = false;\n }\n\n /**\n * Returns the next pending state from the pending state queue.\n */\n private peekNextPendingState(): IPendingState {\n const nextPendingState = this.pendingStates.peekFront();\n assert(!!nextPendingState, 0x171 /* \"No pending state found for the remote message\" */);\n return nextPendingState;\n }\n\n /**\n * Called when the Container's connection state changes. If the Container gets connected, it replays all the pending\n * states in its queue. This includes setting the FlushMode and triggering resubmission of unacked ops.\n */\n public replayPendingStates() {\n assert(this.connected, 0x172 /* \"The connection state is not consistent with the runtime\" */);\n\n // This assert suggests we are about to send same ops twice, which will result in data loss.\n assert(this.clientId !== this.containerRuntime.clientId,\n 0x173 /* \"replayPendingStates called twice for same clientId!\" */);\n this.clientId = this.containerRuntime.clientId;\n\n assert(this.initialStates.isEmpty(), 0x174 /* \"initial states should be empty before replaying pending\" */);\n\n let pendingStatesCount = this.pendingStates.length;\n if (pendingStatesCount === 0) {\n return;\n }\n\n // Reset the pending message count because all these messages will be removed from the queue.\n this.pendingMessagesCount = 0;\n\n // Save the current FlushMode so that we can revert it back after replaying the states.\n const savedFlushMode = this.containerRuntime.flushMode;\n\n // Process exactly `pendingStatesCount` items in the queue as it represents the number of states that were\n // pending when we connected. This is important because the `reSubmitFn` might add more items in the queue\n // which must not be replayed.\n while (pendingStatesCount > 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const pendingState = this.pendingStates.shift()!;\n switch (pendingState.type) {\n case \"message\":\n {\n this.containerRuntime.reSubmitFn(\n pendingState.messageType,\n pendingState.content,\n pendingState.localOpMetadata,\n pendingState.opMetadata);\n }\n break;\n case \"flushMode\":\n {\n this.containerRuntime.setFlushMode(pendingState.flushMode);\n }\n break;\n case \"flush\":\n {\n this.containerRuntime.flush();\n }\n break;\n default:\n break;\n }\n pendingStatesCount--;\n }\n\n // Revert the FlushMode.\n this.containerRuntime.setFlushMode(savedFlushMode);\n }\n}\n"]}
|
|
@@ -11,9 +11,10 @@ import { IContainerRuntime, IContainerRuntimeEvents } from "@fluidframework/cont
|
|
|
11
11
|
import { TypedEventEmitter } from "@fluidframework/common-utils";
|
|
12
12
|
import { IDocumentStorageService } from "@fluidframework/driver-definitions";
|
|
13
13
|
import { IClientDetails, IDocumentMessage, IQuorum, ISequencedDocumentMessage, ISignalMessage, ISummaryConfiguration, ISummaryTree, ITree, MessageType } from "@fluidframework/protocol-definitions";
|
|
14
|
-
import { FlushMode, IFluidDataStoreContextDetached, IFluidDataStoreRegistry, NamedFluidDataStoreRegistryEntries, ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
14
|
+
import { FlushMode, IFluidDataStoreContextDetached, IFluidDataStoreRegistry, IGarbageCollectionData, NamedFluidDataStoreRegistryEntries, ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
|
|
15
15
|
import { IPendingLocalState } from "./pendingStateManager";
|
|
16
16
|
import { SubmitSummaryResult, ISubmitSummaryOptions, ISummarizer, ISummarizerInternalsProvider, ISummarizerOptions, ISummarizerRuntime } from "./summarizerTypes";
|
|
17
|
+
import { IGarbageCollectionRuntime, IGCStats, IUsedStateStats } from "./garbageCollection";
|
|
17
18
|
export declare enum ContainerMessageType {
|
|
18
19
|
FluidDataStoreOp = "component",
|
|
19
20
|
Attach = "attach",
|
|
@@ -31,17 +32,6 @@ export interface ContainerRuntimeMessage {
|
|
|
31
32
|
contents: any;
|
|
32
33
|
type: ContainerMessageType;
|
|
33
34
|
}
|
|
34
|
-
/** The statistics of a garbage collection run */
|
|
35
|
-
export interface IGCStats {
|
|
36
|
-
/** Total number of nodes in the GC graph */
|
|
37
|
-
totalNodes: number;
|
|
38
|
-
/** Number of nodes that have been marked as deleted */
|
|
39
|
-
deletedNodes: number;
|
|
40
|
-
/** Total number of data stores in the GC graph */
|
|
41
|
-
totalDataStores: number;
|
|
42
|
-
/** Number of data stores that have been marked as deleted */
|
|
43
|
-
deletedDataStores: number;
|
|
44
|
-
}
|
|
45
35
|
export interface IGCRuntimeOptions {
|
|
46
36
|
disableGC?: boolean;
|
|
47
37
|
/**
|
|
@@ -130,7 +120,7 @@ export declare const agentSchedulerId = "_scheduler";
|
|
|
130
120
|
* Represents the runtime of the container. Contains helper functions/state of the container.
|
|
131
121
|
* It will define the store level mappings.
|
|
132
122
|
*/
|
|
133
|
-
export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents> implements IContainerRuntime, IRuntime, ISummarizerRuntime, ISummarizerInternalsProvider {
|
|
123
|
+
export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents> implements IContainerRuntime, IGarbageCollectionRuntime, IRuntime, ISummarizerRuntime, ISummarizerInternalsProvider {
|
|
134
124
|
private readonly context;
|
|
135
125
|
private readonly registry;
|
|
136
126
|
private readonly runtimeOptions;
|
|
@@ -202,12 +192,9 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
202
192
|
private readonly scheduleManager;
|
|
203
193
|
private readonly blobManager;
|
|
204
194
|
private readonly pendingStateManager;
|
|
195
|
+
private readonly garbageCollector;
|
|
205
196
|
private readonly chunkMap;
|
|
206
197
|
private readonly dataStores;
|
|
207
|
-
private readonly currentGCVersion;
|
|
208
|
-
private latestSummaryGCVersion;
|
|
209
|
-
private readonly shouldRunGC;
|
|
210
|
-
private readonly shouldRunSweep;
|
|
211
198
|
/**
|
|
212
199
|
* True if generating summaries with isolated channels is
|
|
213
200
|
* explicitly disabled. This only affects how summaries are written,
|
|
@@ -217,8 +204,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
217
204
|
/** The message in the metadata of the base summary this container is loaded from. */
|
|
218
205
|
private readonly baseSummaryMessage;
|
|
219
206
|
private static get defaultFlushMode();
|
|
220
|
-
private get gcEnabled();
|
|
221
|
-
get gcTestMode(): boolean;
|
|
222
207
|
private get summarizer();
|
|
223
208
|
private constructor();
|
|
224
209
|
dispose(error?: Error): void;
|
|
@@ -234,7 +219,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
234
219
|
* @param request - Request made to the handler.
|
|
235
220
|
*/
|
|
236
221
|
resolveHandle(request: IRequest): Promise<IResponse>;
|
|
237
|
-
private get shouldWriteMetadata();
|
|
238
222
|
private formMetadata;
|
|
239
223
|
/**
|
|
240
224
|
* Retrieves the runtime for a data store if it's referenced as per the initially summary that it is loaded with.
|
|
@@ -304,11 +288,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
304
288
|
*/
|
|
305
289
|
createSummary(blobRedirectTable?: Map<string, string>): ISummaryTree;
|
|
306
290
|
getAbsoluteUrl(relativeUrl: string): Promise<string | undefined>;
|
|
307
|
-
/**
|
|
308
|
-
* Runs garbage collection and udpates the reference / used state of the nodes in the container.
|
|
309
|
-
* @returns the number of data stores that have been marked as unreferenced.
|
|
310
|
-
*/
|
|
311
|
-
collectGarbage(logger: ITelemetryLogger, fullGC?: boolean): Promise<IGCStats>;
|
|
312
291
|
private summarizeInternal;
|
|
313
292
|
/**
|
|
314
293
|
* Returns a summary of the runtime at the current sequence number.
|
|
@@ -322,11 +301,36 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
322
301
|
trackState?: boolean;
|
|
323
302
|
/** True to run garbage collection before summarizing; defaults to true */
|
|
324
303
|
runGC?: boolean;
|
|
325
|
-
/** True to generate full GC data
|
|
304
|
+
/** True to generate full GC data */
|
|
326
305
|
fullGC?: boolean;
|
|
327
|
-
/** True to run GC sweep phase after the mark phase
|
|
306
|
+
/** True to run GC sweep phase after the mark phase */
|
|
328
307
|
runSweep?: boolean;
|
|
329
308
|
}): Promise<ISummaryTreeWithStats>;
|
|
309
|
+
/**
|
|
310
|
+
* Implementation of IGarbageCollectionRuntime::getGCData.
|
|
311
|
+
* Generates and returns the GC data for this container.
|
|
312
|
+
* @param fullGC - true to bypass optimizations and force full generation of GC data.
|
|
313
|
+
*/
|
|
314
|
+
getGCData(fullGC?: boolean): Promise<IGarbageCollectionData>;
|
|
315
|
+
/**
|
|
316
|
+
* Implementation of IGarbageCollectionRuntime::updateUsedRoutes.
|
|
317
|
+
* After GC has run, called to notify this container's nodes of routes that are used in it.
|
|
318
|
+
* @param usedRoutes - The routes that are used in all nodes in this Container.
|
|
319
|
+
* @returns the statistics of the used state of the data stores.
|
|
320
|
+
*/
|
|
321
|
+
updateUsedRoutes(usedRoutes: string[]): IUsedStateStats;
|
|
322
|
+
/**
|
|
323
|
+
* Runs garbage collection and udpates the reference / used state of the nodes in the container.
|
|
324
|
+
* @returns the statistics of the garbage collection run.
|
|
325
|
+
*/
|
|
326
|
+
collectGarbage(options: {
|
|
327
|
+
/** Logger to use for logging GC events */
|
|
328
|
+
logger?: ITelemetryLogger;
|
|
329
|
+
/** True to run GC sweep phase after the mark phase */
|
|
330
|
+
runSweep?: boolean;
|
|
331
|
+
/** True to generate full GC data */
|
|
332
|
+
fullGC?: boolean;
|
|
333
|
+
}): Promise<IGCStats>;
|
|
330
334
|
/**
|
|
331
335
|
* Generates the summary tree, uploads it to storage, and then submits the summarize op.
|
|
332
336
|
* This is intended to be called by the summarizer, since it is the implementation of
|
|
@@ -367,10 +371,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
367
371
|
* @returns downloaded snapshot's reference sequence number
|
|
368
372
|
*/
|
|
369
373
|
private refreshLatestSummaryAckFromServer;
|
|
370
|
-
/**
|
|
371
|
-
* Updates the summary GC version as per the metadata blob in given snapshot.
|
|
372
|
-
*/
|
|
373
|
-
private updateSummaryGCVersionFromSnapshot;
|
|
374
374
|
private fetchSnapshotFromStorage;
|
|
375
375
|
getPendingLocalState(): IPendingLocalState | undefined;
|
|
376
376
|
readonly summarizeOnDemand: ISummarizer["summarizeOnDemand"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerRuntime.d.ts","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAA0B,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC9F,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,mBAAmB,EACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACH,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EAEb,QAAQ,EACR,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,cAAc,EACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,iBAAiB,EACjB,uBAAuB,EAC1B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAGH,iBAAiB,EAEpB,MAAM,8BAA8B,CAAC;AAQtC,OAAO,EAAE,uBAAuB,EAAmB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"containerRuntime.d.ts","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAA0B,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAC9F,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,mBAAmB,EACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACH,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EAEb,QAAQ,EACR,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,cAAc,EACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,iBAAiB,EACjB,uBAAuB,EAC1B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAGH,iBAAiB,EAEpB,MAAM,8BAA8B,CAAC;AAQtC,OAAO,EAAE,uBAAuB,EAAmB,MAAM,oCAAoC,CAAC;AAO9F,OAAO,EACH,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,yBAAyB,EACzB,cAAc,EACd,qBAAqB,EAErB,YAAY,EACZ,KAAK,EACL,WAAW,EAEd,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACH,SAAS,EAET,8BAA8B,EAC9B,uBAAuB,EAEvB,sBAAsB,EAKtB,kCAAkC,EAClC,qBAAqB,EAMxB,MAAM,qCAAqC,CAAC;AAqB7C,OAAO,EAAE,kBAAkB,EAAuB,MAAM,uBAAuB,CAAC;AAkBhF,OAAO,EACH,mBAAmB,EAGnB,qBAAqB,EACrB,WAAW,EACX,4BAA4B,EAC5B,kBAAkB,EAClB,kBAAkB,EACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAEH,yBAAyB,EAEzB,QAAQ,EACR,eAAe,EAClB,MAAM,qBAAqB,CAAC;AAE7B,oBAAY,oBAAoB;IAE5B,gBAAgB,cAAc;IAG9B,MAAM,WAAW;IAGjB,SAAS,cAAc;IAGvB,UAAU,eAAe;IAGzB,MAAM,WAAW;CACpB;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,EAAE,MAAM,CAAC;IAEpB,QAAQ,EAAE,MAAM,CAAC;IAEjB,YAAY,EAAE,WAAW,GAAG,oBAAoB,CAAC;CACpD;AAED,MAAM,WAAW,uBAAuB;IACpC,QAAQ,EAAE,GAAG,CAAC;IACd,IAAI,EAAE,oBAAoB,CAAC;CAC9B;AAmBD,MAAM,WAAW,iBAAiB;IAE9B,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAKxD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAGlC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B;;;;;;;OAOG;IACH,8BAA8B,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;CAC/D;AASD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAY5E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,6BAmBtE;AAED,qBAAa,eAAe;IAQpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAT3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAqB;gBAGrB,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,EACxE,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,gBAAgB;IA+CtC,cAAc,CAAC,OAAO,EAAE,yBAAyB;IA4BjD,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,EAAE,OAAO,EAAE,yBAAyB;IAqBvE,SAAS,CAAC,WAAW,EAAE,OAAO;IAerC,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,YAAY;CA0BvB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAE7C;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,iBAAiB,CAAC,uBAAuB,CAC3E,YACI,iBAAiB,EACjB,yBAAyB,EACzB,QAAQ,EACR,kBAAkB,EAClB,4BAA4B;IA0S5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAIzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc;aACf,MAAM,EAAE,gBAAgB;IAGxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC;IAnTrB,IAAW,iBAAiB,SAAmB;IAC/C,IAAW,YAAY,SAAmB;IAG1C;;;OAGG;IACH,SAAgB,cAAc,EAAE,MAAM,CAAc;IAEpD;;;;;;;OAOG;WACiB,IAAI,CACpB,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,kCAAkC,EACnD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,SAAS,CAAC,EACtF,cAAc,GAAE,wBAA6B,EAC7C,cAAc,GAAE,YAA4B,EAC5C,QAAQ,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,gBAAgB,CAAC;IA+G5B,IAAW,EAAE,IAAI,MAAM,CAEtB;IAED,IAAW,OAAO,IAAI,cAAc,CAEnC;IAED,IAAW,QAAQ,IAAI,MAAM,GAAG,SAAS,CAExC;IAED,IAAW,aAAa,IAAI,cAAc,CAEzC;IAED,IAAW,YAAY,IAAI,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,CAEpF;IAED,IAAW,OAAO,IAAI,uBAAuB,CAoB5C;IAED,IAAW,UAAU,IAAI,CACrB,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,GAAG,EACZ,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAC9C,IAAI,CAGR;IAED,IAAW,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,uBAAuB,KAAK,IAAI,CAE9D;IAED,IAAW,SAAS,IAAI,SAAS,CAEhC;IAED,IAAW,KAAK,IAAI,YAAY,CAE/B;IAED,IAAW,uBAAuB,IAAI,uBAAuB,CAE5D;IAED,IAAW,WAAW,IAAI,WAAW,CAEpC;IAGD,SAAgB,gBAAgB,EAAE,gBAAgB,CAAC;IAEnD,SAAgB,mBAAmB,EAAE,mBAAmB,CAAC;IAGzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAA2B;IACrE;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IAEtD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAE3D,OAAO,CAAC,uBAAuB,CAAa;IAC5C,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,UAAU,CAAU;IAE5B,OAAO,CAAC,MAAM,CAAkB;IAEhC,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,oFAAoF;IACpF,IAAW,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAElD;IAED,OAAO,KAAK,oBAAoB,GAS/B;IAED,OAAO,CAAC,SAAS,CAAS;IAC1B,IAAW,QAAQ,YAA6B;IAEhD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,sBAAsB,CAAQ;IACtC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IAEjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IAExC;;;;OAIG;IACH,SAAgB,uBAAuB,EAAE,OAAO,CAAC;IACjD,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsC;IAEzE,OAAO,CAAC,MAAM,KAAK,gBAAgB,GAElC;IAED,OAAO,KAAK,UAAU,GAGrB;IAED,OAAO;IA0OA,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAyBnC,IAAW,mBAAmB,oCAQ7B;IAED,IAAW,mBAAmB,IAAI,mBAAmB,CAEpD;IAED;;;OAGG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAyB3D;;;OAGG;IACU,aAAa,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IA+CjE,OAAO,CAAC,YAAY;IAWpB;;;;;;;OAOG;YACW,iCAAiC;IAc/C;;;OAGG;IACU,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAuBvC,OAAO,CAAC,0BAA0B;IAqBlC,OAAO,CAAC,mBAAmB;IA8B3B;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAYnB;YAEY,cAAc;IAiBrB,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM;IAkBxD,OAAO,CAAC,UAAU,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO;IA6D7D,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO;IAiB/C,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,UAAO,GAAG,OAAO,CAAC,YAAY,CAAC;cAM7D,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,UAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAIrE,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAgBnC,KAAK,IAAI,IAAI;IAuBb,iBAAiB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAsBpD,OAAO,CAAC,2BAA2B;IAStB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAI9D,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAMjG,2BAA2B,CAC9B,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,EACvB,eAAe,EAAE,MAAM,GAAG,8BAA8B;IAKrD,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,8BAA8B;IAI1E,yBAAyB,CAClC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EACtB,KAAK,CAAC,EAAE,GAAG,EACX,EAAE,SAAS,EACX,MAAM,UAAQ,GACf,OAAO,CAAC,YAAY,CAAC;YASV,gBAAgB;IAQ9B,OAAO,CAAC,UAAU;IAIX,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,SAAS;IAM/B,SAAgB,qBAAqB,YAAa,gBAAgB,UAEhE;IAEF;;;OAGG;IACH,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED,OAAO,CAAC,2BAA2B;IAiBnC;;;;OAIG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;IAMvC,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;IAKjE,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,QAAQ,GAAG,IAAI;IAYtF;;;;;;OAMG;IACI,aAAa,CAAC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY;IAc9D,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAU/D,iBAAiB;IAiB/B;;OAEG;IACU,SAAS,CAAC,OAAO,EAAE;QAC5B,kDAAkD;QAClD,aAAa,EAAE,gBAAgB,CAAC;QAChC,2FAA2F;QAC3F,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,wFAAwF;QACxF,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,0EAA0E;QAC1E,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,oCAAoC;QACpC,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,sDAAsD;QACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAclC;;;;OAIG;IACU,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAIzE;;;;;OAKG;IACI,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,eAAe;IAe9D;;;OAGG;IACU,cAAc,CACvB,OAAO,EAAE;QACL,0CAA0C;QAC1C,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAC1B,sDAAsD;QACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,oCAAoC;QACpC,MAAM,CAAC,EAAE,OAAO,CAAC;KACpB,GACF,OAAO,CAAC,QAAQ,CAAC;IAIpB;;;;;;;OAOG;IACU,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA4KxF,OAAO,CAAC,2BAA2B;IAoBnC,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,wBAAwB;IAezB,iBAAiB,CACpB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,GAAG,EACb,eAAe,GAAE,OAAmB,GAAG,IAAI;IAQlC,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAKtF,OAAO,CAAC,MAAM;IAmEd,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,oBAAoB;IAgB5B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAMvB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IA4BhB,6EAA6E;IAChE,uBAAuB,CAChC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,gBAAgB;IAkBnC;;;;;OAKG;YACW,iCAAiC;YAuBjC,wBAAwB;IAkB/B,oBAAoB;IAI3B,SAAgB,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAajE;IAEF,SAAgB,gBAAgB,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAa/D;CACL"}
|