@fluidframework/container-runtime 2.0.0-internal.4.2.1 → 2.0.0-internal.4.3.1

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.
Files changed (131) hide show
  1. package/dist/connectionTelemetry.d.ts.map +1 -1
  2. package/dist/connectionTelemetry.js +1 -0
  3. package/dist/connectionTelemetry.js.map +1 -1
  4. package/dist/containerRuntime.d.ts.map +1 -1
  5. package/dist/containerRuntime.js +9 -6
  6. package/dist/containerRuntime.js.map +1 -1
  7. package/dist/dataStores.d.ts +5 -5
  8. package/dist/dataStores.d.ts.map +1 -1
  9. package/dist/dataStores.js +3 -6
  10. package/dist/dataStores.js.map +1 -1
  11. package/dist/gc/garbageCollection.d.ts +1 -27
  12. package/dist/gc/garbageCollection.d.ts.map +1 -1
  13. package/dist/gc/garbageCollection.js +30 -227
  14. package/dist/gc/garbageCollection.js.map +1 -1
  15. package/dist/gc/gcHelpers.d.ts +0 -10
  16. package/dist/gc/gcHelpers.d.ts.map +1 -1
  17. package/dist/gc/gcHelpers.js +1 -20
  18. package/dist/gc/gcHelpers.js.map +1 -1
  19. package/dist/gc/gcTelemetry.d.ts +91 -0
  20. package/dist/gc/gcTelemetry.d.ts.map +1 -0
  21. package/dist/gc/gcTelemetry.js +262 -0
  22. package/dist/gc/gcTelemetry.js.map +1 -0
  23. package/dist/gc/index.d.ts +2 -1
  24. package/dist/gc/index.d.ts.map +1 -1
  25. package/dist/gc/index.js +4 -2
  26. package/dist/gc/index.js.map +1 -1
  27. package/dist/opLifecycle/opGroupingManager.js +1 -1
  28. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  29. package/dist/opLifecycle/outbox.js +1 -1
  30. package/dist/opLifecycle/outbox.js.map +1 -1
  31. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  32. package/dist/opLifecycle/remoteMessageProcessor.js +25 -22
  33. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  34. package/dist/packageVersion.d.ts +1 -1
  35. package/dist/packageVersion.js +1 -1
  36. package/dist/packageVersion.js.map +1 -1
  37. package/dist/pendingStateManager.d.ts +1 -1
  38. package/dist/pendingStateManager.d.ts.map +1 -1
  39. package/dist/pendingStateManager.js.map +1 -1
  40. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  41. package/dist/summary/orderedClientElection.js +14 -17
  42. package/dist/summary/orderedClientElection.js.map +1 -1
  43. package/dist/summary/summarizer.d.ts +2 -0
  44. package/dist/summary/summarizer.d.ts.map +1 -1
  45. package/dist/summary/summarizer.js +9 -4
  46. package/dist/summary/summarizer.js.map +1 -1
  47. package/dist/summary/summarizerHeuristics.d.ts +8 -9
  48. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  49. package/dist/summary/summarizerHeuristics.js +15 -16
  50. package/dist/summary/summarizerHeuristics.js.map +1 -1
  51. package/dist/summary/summarizerTypes.d.ts +2 -0
  52. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  53. package/dist/summary/summarizerTypes.js.map +1 -1
  54. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  55. package/dist/summary/summaryGenerator.js +4 -3
  56. package/dist/summary/summaryGenerator.js.map +1 -1
  57. package/lib/connectionTelemetry.d.ts.map +1 -1
  58. package/lib/connectionTelemetry.js +1 -0
  59. package/lib/connectionTelemetry.js.map +1 -1
  60. package/lib/containerRuntime.d.ts.map +1 -1
  61. package/lib/containerRuntime.js +9 -6
  62. package/lib/containerRuntime.js.map +1 -1
  63. package/lib/dataStores.d.ts +5 -5
  64. package/lib/dataStores.d.ts.map +1 -1
  65. package/lib/dataStores.js +3 -6
  66. package/lib/dataStores.js.map +1 -1
  67. package/lib/gc/garbageCollection.d.ts +1 -27
  68. package/lib/gc/garbageCollection.d.ts.map +1 -1
  69. package/lib/gc/garbageCollection.js +34 -231
  70. package/lib/gc/garbageCollection.js.map +1 -1
  71. package/lib/gc/gcHelpers.d.ts +0 -10
  72. package/lib/gc/gcHelpers.d.ts.map +1 -1
  73. package/lib/gc/gcHelpers.js +0 -18
  74. package/lib/gc/gcHelpers.js.map +1 -1
  75. package/lib/gc/gcTelemetry.d.ts +91 -0
  76. package/lib/gc/gcTelemetry.d.ts.map +1 -0
  77. package/lib/gc/gcTelemetry.js +257 -0
  78. package/lib/gc/gcTelemetry.js.map +1 -0
  79. package/lib/gc/index.d.ts +2 -1
  80. package/lib/gc/index.d.ts.map +1 -1
  81. package/lib/gc/index.js +2 -1
  82. package/lib/gc/index.js.map +1 -1
  83. package/lib/opLifecycle/opGroupingManager.js +1 -1
  84. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  85. package/lib/opLifecycle/outbox.js +1 -1
  86. package/lib/opLifecycle/outbox.js.map +1 -1
  87. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  88. package/lib/opLifecycle/remoteMessageProcessor.js +25 -22
  89. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  90. package/lib/packageVersion.d.ts +1 -1
  91. package/lib/packageVersion.js +1 -1
  92. package/lib/packageVersion.js.map +1 -1
  93. package/lib/pendingStateManager.d.ts +1 -1
  94. package/lib/pendingStateManager.d.ts.map +1 -1
  95. package/lib/pendingStateManager.js.map +1 -1
  96. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  97. package/lib/summary/orderedClientElection.js +14 -17
  98. package/lib/summary/orderedClientElection.js.map +1 -1
  99. package/lib/summary/summarizer.d.ts +2 -0
  100. package/lib/summary/summarizer.d.ts.map +1 -1
  101. package/lib/summary/summarizer.js +9 -4
  102. package/lib/summary/summarizer.js.map +1 -1
  103. package/lib/summary/summarizerHeuristics.d.ts +8 -9
  104. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  105. package/lib/summary/summarizerHeuristics.js +15 -16
  106. package/lib/summary/summarizerHeuristics.js.map +1 -1
  107. package/lib/summary/summarizerTypes.d.ts +2 -0
  108. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  109. package/lib/summary/summarizerTypes.js.map +1 -1
  110. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  111. package/lib/summary/summaryGenerator.js +4 -3
  112. package/lib/summary/summaryGenerator.js.map +1 -1
  113. package/package.json +17 -17
  114. package/src/connectionTelemetry.ts +1 -0
  115. package/src/containerRuntime.ts +12 -11
  116. package/src/dataStores.ts +4 -7
  117. package/src/gc/garbageCollection.ts +53 -315
  118. package/src/gc/gcHelpers.ts +1 -38
  119. package/src/gc/gcTelemetry.ts +393 -0
  120. package/src/gc/index.ts +1 -1
  121. package/src/opLifecycle/README.md +13 -0
  122. package/src/opLifecycle/opGroupingManager.ts +1 -1
  123. package/src/opLifecycle/outbox.ts +2 -2
  124. package/src/opLifecycle/remoteMessageProcessor.ts +37 -28
  125. package/src/packageVersion.ts +1 -1
  126. package/src/pendingStateManager.ts +1 -4
  127. package/src/summary/orderedClientElection.ts +14 -17
  128. package/src/summary/summarizer.ts +17 -5
  129. package/src/summary/summarizerHeuristics.ts +15 -16
  130. package/src/summary/summarizerTypes.ts +2 -0
  131. package/src/summary/summaryGenerator.ts +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"summaryGenerator.js","sourceRoot":"","sources":["../../src/summary/summaryGenerator.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n\tassert,\n\tDeferred,\n\tIPromiseTimer,\n\tIPromiseTimerResult,\n\tTimer,\n} from \"@fluidframework/common-utils\";\nimport { MessageType } from \"@fluidframework/protocol-definitions\";\nimport { PerformanceEvent, LoggingError, ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { getRetryDelaySecondsFromError } from \"@fluidframework/driver-utils\";\nimport { DriverErrorType } from \"@fluidframework/driver-definitions\";\nimport {\n\tIAckSummaryResult,\n\tINackSummaryResult,\n\tISummarizeOptions,\n\tIBroadcastSummaryResult,\n\tISummarizeResults,\n\tISummarizeHeuristicData,\n\tISubmitSummaryOptions,\n\tSubmitSummaryResult,\n\tSummarizeResultPart,\n\tISummaryCancellationToken,\n\tISummarizeTelemetryProperties,\n\tSummaryGeneratorTelemetry,\n} from \"./summarizerTypes\";\nimport { IClientSummaryWatcher } from \"./summaryCollection\";\n\nexport type raceTimerResult<T> =\n\t| { result: \"done\"; value: T }\n\t| { result: IPromiseTimerResult[\"timerResult\"] }\n\t| { result: \"cancelled\" };\n\n/** Helper function to wait for a promise or PromiseTimer to elapse. */\nexport async function raceTimer<T>(\n\tpromise: Promise<T>,\n\ttimer: Promise<IPromiseTimerResult>,\n\tcancellationToken?: ISummaryCancellationToken,\n): Promise<raceTimerResult<T>> {\n\tconst promises: Promise<raceTimerResult<T>>[] = [\n\t\tpromise.then((value) => ({ result: \"done\", value } as const)),\n\t\ttimer.then(({ timerResult: result }) => ({ result } as const)),\n\t];\n\tif (cancellationToken !== undefined) {\n\t\tpromises.push(\n\t\t\tcancellationToken.waitCancelled.then(() => ({ result: \"cancelled\" } as const)),\n\t\t);\n\t}\n\treturn Promise.race(promises);\n}\n\n// Send some telemetry if generate summary takes too long\nconst maxSummarizeTimeoutTime = 20000; // 20 sec\nconst maxSummarizeTimeoutCount = 5; // Double and resend 5 times\n\nexport type SummarizeReason =\n\t/**\n\t * Attempt to summarize after idle timeout has elapsed.\n\t * Idle timer restarts whenever an op is received. So this\n\t * triggers only after some amount of time has passed with\n\t * no ops being received.\n\t */\n\t| \"idle\"\n\t/**\n\t * Attempt to summarize after a maximum time since last\n\t * successful summary has passed. This measures time since\n\t * last summary ack op was processed.\n\t */\n\t| \"maxTime\"\n\t/**\n\t * Attempt to summarize after a maximum number of ops have\n\t * passed since the last successful summary. This compares\n\t * op sequence numbers with the reference sequence number\n\t * of the summarize op corresponding to the last summary\n\t * ack op.\n\t */\n\t| \"maxOps\"\n\t/**\n\t * Special case to attempt to summarize one last time before the\n\t * summarizer client closes itself. This is to prevent cases where\n\t * the summarizer client never gets a chance to summarize, because\n\t * there are too many outstanding ops and/or parent client cannot\n\t * stay connected long enough for summarizer client to catch up.\n\t */\n\t| \"lastSummary\"\n\t/** On-demand summary requested with specified reason. */\n\t| `onDemand;${string}`\n\t/** Enqueue summarize attempt with specified reason. */\n\t| `enqueue;${string}`;\n\nconst summarizeErrors = {\n\t/**\n\t * Error encountered while generating the summary tree, uploading\n\t * it to storage, or submitting the op. It could be a result of\n\t * the client becoming disconnected while generating or an actual error.\n\t */\n\tsubmitSummaryFailure: \"Error while generating, uploading, or submitting summary\",\n\t/**\n\t * The summaryAckWaitTimeout time has elapsed before receiving the summarize op\n\t * sent by this summarize attempt. It is expected to be broadcast quickly.\n\t */\n\tsummaryOpWaitTimeout: \"Timeout while waiting for summarize op broadcast\",\n\t/**\n\t * The summaryAckWaitTimeout time has elapsed before receiving either a\n\t * summaryAck or summaryNack op from the server in response to this\n\t * summarize attempt. It is expected that the server should respond.\n\t */\n\tsummaryAckWaitTimeout: \"Timeout while waiting for summaryAck/summaryNack op\",\n\t/**\n\t * The server responded with a summaryNack op, thus rejecting this\n\t * summarize attempt.\n\t */\n\tsummaryNack: \"Server rejected summary via summaryNack op\",\n\n\tdisconnect: \"Summary cancelled due to summarizer or main client disconnect\",\n} as const;\n\n// Helper functions to report failures and return.\nexport const getFailMessage = (errorCode: keyof typeof summarizeErrors) =>\n\t`${errorCode}: ${summarizeErrors[errorCode]}`;\n\nexport class SummarizeResultBuilder {\n\tpublic readonly summarySubmitted = new Deferred<SummarizeResultPart<SubmitSummaryResult>>();\n\tpublic readonly summaryOpBroadcasted = new Deferred<\n\t\tSummarizeResultPart<IBroadcastSummaryResult>\n\t>();\n\tpublic readonly receivedSummaryAckOrNack = new Deferred<\n\t\tSummarizeResultPart<IAckSummaryResult, INackSummaryResult>\n\t>();\n\n\tpublic fail(\n\t\tmessage: string,\n\t\terror: any,\n\t\tnackSummaryResult?: INackSummaryResult,\n\t\tretryAfterSeconds?: number,\n\t) {\n\t\tassert(\n\t\t\t!this.receivedSummaryAckOrNack.isCompleted,\n\t\t\t0x25e /* \"no reason to call fail if all promises have been completed\" */,\n\t\t);\n\n\t\tconst result: SummarizeResultPart<undefined> = {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\tdata: undefined,\n\t\t\terror,\n\t\t\tretryAfterSeconds,\n\t\t} as const;\n\t\tthis.summarySubmitted.resolve(result);\n\t\tthis.summaryOpBroadcasted.resolve(result);\n\t\tthis.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });\n\t}\n\tpublic build(): ISummarizeResults {\n\t\treturn {\n\t\t\tsummarySubmitted: this.summarySubmitted.promise,\n\t\t\tsummaryOpBroadcasted: this.summaryOpBroadcasted.promise,\n\t\t\treceivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,\n\t\t} as const;\n\t}\n}\n\n/**\n * This class generates and tracks a summary attempt.\n */\nexport class SummaryGenerator {\n\tprivate readonly summarizeTimer: Timer;\n\tconstructor(\n\t\tprivate readonly pendingAckTimer: IPromiseTimer,\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly submitSummaryCallback: (\n\t\t\toptions: ISubmitSummaryOptions,\n\t\t) => Promise<SubmitSummaryResult>,\n\t\tprivate readonly successfulSummaryCallback: () => void,\n\t\tprivate readonly summaryWatcher: Pick<IClientSummaryWatcher, \"watchSummary\">,\n\t\tprivate readonly logger: ITelemetryLogger,\n\t) {\n\t\tthis.summarizeTimer = new Timer(maxSummarizeTimeoutTime, () =>\n\t\t\tthis.summarizeTimerHandler(maxSummarizeTimeoutTime, 1),\n\t\t);\n\t}\n\n\t/**\n\t * Generates summary and listens for broadcast and ack/nack.\n\t * Returns true for ack, false for nack, and undefined for failure or timeout.\n\t * @param reason - reason for summarizing\n\t * @param options - refreshLatestAck to fetch summary ack info from server,\n\t * fullTree to generate tree without any summary handles even if unchanged\n\t */\n\tpublic summarize(\n\t\tsummarizeProps: ISummarizeTelemetryProperties,\n\t\toptions: ISummarizeOptions,\n\t\tcancellationToken: ISummaryCancellationToken,\n\t\tresultsBuilder = new SummarizeResultBuilder(),\n\t): ISummarizeResults {\n\t\tthis.summarizeCore(summarizeProps, options, resultsBuilder, cancellationToken).catch(\n\t\t\t(error) => {\n\t\t\t\tconst message = \"UnexpectedSummarizeError\";\n\t\t\t\tthis.logger.sendErrorEvent({ eventName: message, ...summarizeProps }, error);\n\t\t\t\tresultsBuilder.fail(message, error);\n\t\t\t},\n\t\t);\n\n\t\treturn resultsBuilder.build();\n\t}\n\n\tprivate async summarizeCore(\n\t\tsummarizeProps: ISummarizeTelemetryProperties,\n\t\toptions: ISummarizeOptions,\n\t\tresultsBuilder: SummarizeResultBuilder,\n\t\tcancellationToken: ISummaryCancellationToken,\n\t): Promise<void> {\n\t\tconst { refreshLatestAck, fullTree } = options;\n\t\tconst logger = ChildLogger.create(this.logger, undefined, { all: summarizeProps });\n\n\t\t// Note: timeSinceLastAttempt and timeSinceLastSummary for the\n\t\t// first summary are basically the time since the summarizer was loaded.\n\t\tconst timeSinceLastAttempt = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\tconst timeSinceLastSummary =\n\t\t\tDate.now() - this.heuristicData.lastSuccessfulSummary.summaryTime;\n\t\tlet summarizeTelemetryProps: SummaryGeneratorTelemetry = {\n\t\t\tfullTree,\n\t\t\ttimeSinceLastAttempt,\n\t\t\ttimeSinceLastSummary,\n\t\t};\n\n\t\tconst summarizeEvent = PerformanceEvent.start(\n\t\t\tlogger,\n\t\t\t{\n\t\t\t\teventName: \"Summarize\",\n\t\t\t\trefreshLatestAck,\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t},\n\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t);\n\n\t\tconst fail = (\n\t\t\terrorCode: keyof typeof summarizeErrors,\n\t\t\terror?: any,\n\t\t\tproperties?: SummaryGeneratorTelemetry,\n\t\t\tnackSummaryResult?: INackSummaryResult,\n\t\t) => {\n\t\t\t// UploadSummary may fail with 429 and retryAfter - respect that\n\t\t\t// Summary Nack also can have retryAfter, it's parsed below and comes as a property.\n\t\t\tconst retryAfterSeconds = getRetryDelaySecondsFromError(error);\n\n\t\t\t// Report any failure as an error unless it was due to cancellation (like \"disconnected\" error)\n\t\t\t// If failure happened on upload, we may not yet realized that socket disconnected, so check\n\t\t\t// offlineError too.\n\t\t\tconst category =\n\t\t\t\tcancellationToken.cancelled || error?.errorType === DriverErrorType.offlineError\n\t\t\t\t\t? \"generic\"\n\t\t\t\t\t: \"error\";\n\n\t\t\tconst reason = getFailMessage(errorCode);\n\t\t\tsummarizeEvent.cancel(\n\t\t\t\t{\n\t\t\t\t\t...properties,\n\t\t\t\t\treason,\n\t\t\t\t\tcategory,\n\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t},\n\t\t\t\terror ?? reason,\n\t\t\t); // disconnect & summaryAckTimeout do not have proper error.\n\t\t\tresultsBuilder.fail(reason, error, nackSummaryResult, retryAfterSeconds);\n\t\t};\n\n\t\t// Wait to generate and send summary\n\t\tthis.summarizeTimer.start();\n\n\t\t// Use record type to prevent unexpected value types\n\t\tlet summaryData: SubmitSummaryResult | undefined;\n\t\ttry {\n\t\t\tsummaryData = await this.submitSummaryCallback({\n\t\t\t\tfullTree,\n\t\t\t\trefreshLatestAck,\n\t\t\t\tsummaryLogger: logger,\n\t\t\t\tcancellationToken,\n\t\t\t});\n\n\t\t\tthis.heuristicData.recordAttempt(summaryData.referenceSequenceNumber);\n\n\t\t\t// Cumulatively add telemetry properties based on how far generateSummary went.\n\t\t\tconst referenceSequenceNumber = summaryData.referenceSequenceNumber;\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\treferenceSequenceNumber,\n\t\t\t\tminimumSequenceNumber: summaryData.minimumSequenceNumber,\n\t\t\t\topsSinceLastAttempt:\n\t\t\t\t\treferenceSequenceNumber - this.heuristicData.lastAttempt.refSequenceNumber,\n\t\t\t\topsSinceLastSummary:\n\t\t\t\t\treferenceSequenceNumber -\n\t\t\t\t\tthis.heuristicData.lastSuccessfulSummary.refSequenceNumber,\n\t\t\t\tstage: summaryData.stage,\n\t\t\t};\n\t\t\tsummarizeTelemetryProps = this.addSummaryDataToTelemetryProps(\n\t\t\t\tsummaryData,\n\t\t\t\tsummarizeTelemetryProps,\n\t\t\t);\n\n\t\t\tif (summaryData.stage !== \"submit\") {\n\t\t\t\treturn fail(\"submitSummaryFailure\", summaryData.error, summarizeTelemetryProps);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * With incremental summaries, if the full tree was not summarized, only data stores that changed should\n\t\t\t * be summarized. A data store is considered changed if either or both of the following is true:\n\t\t\t * - It has received an op.\n\t\t\t * - Its reference state changed, i.e., it went from referenced to unreferenced or vice-versa.\n\t\t\t *\n\t\t\t * In the extreme case, every op can be for a different data store and each op can result in the reference\n\t\t\t * state change of multiple data stores. So, the total number of data stores that are summarized should not\n\t\t\t * exceed the number of ops since last summary + number of data store whose reference state changed.\n\t\t\t */\n\t\t\tif (!fullTree && !summaryData.forcedFullTree) {\n\t\t\t\tconst { summarizedDataStoreCount, gcStateUpdatedDataStoreCount = 0 } =\n\t\t\t\t\tsummaryData.summaryStats;\n\t\t\t\tif (\n\t\t\t\t\tsummarizedDataStoreCount >\n\t\t\t\t\tgcStateUpdatedDataStoreCount + this.heuristicData.opsSinceLastSummary\n\t\t\t\t) {\n\t\t\t\t\tlogger.sendErrorEvent({\n\t\t\t\t\t\teventName: \"IncrementalSummaryViolation\",\n\t\t\t\t\t\tsummarizedDataStoreCount,\n\t\t\t\t\t\tgcStateUpdatedDataStoreCount,\n\t\t\t\t\t\topsSinceLastSummary: this.heuristicData.opsSinceLastSummary,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log event here on summary success only, as Summarize_cancel duplicates failure logging.\n\t\t\tsummarizeEvent.reportEvent(\"generate\", { ...summarizeTelemetryProps });\n\t\t\tresultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });\n\t\t} catch (error) {\n\t\t\treturn fail(\"submitSummaryFailure\", error);\n\t\t} finally {\n\t\t\tif (summaryData === undefined) {\n\t\t\t\tthis.heuristicData.recordAttempt();\n\t\t\t}\n\t\t\tthis.summarizeTimer.clear();\n\t\t}\n\n\t\ttry {\n\t\t\tconst pendingTimeoutP = this.pendingAckTimer.start();\n\t\t\tconst summary = this.summaryWatcher.watchSummary(summaryData.clientSequenceNumber);\n\n\t\t\t// Wait for broadcast\n\t\t\tconst waitBroadcastResult = await raceTimer(\n\t\t\t\tsummary.waitBroadcast(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitBroadcastResult.result === \"cancelled\") {\n\t\t\t\treturn fail(\"disconnect\");\n\t\t\t}\n\t\t\tif (waitBroadcastResult.result !== \"done\") {\n\t\t\t\treturn fail(\"summaryOpWaitTimeout\");\n\t\t\t}\n\t\t\tconst summarizeOp = waitBroadcastResult.value;\n\n\t\t\tconst broadcastDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\t\tresultsBuilder.summaryOpBroadcasted.resolve({\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: { summarizeOp, broadcastDuration },\n\t\t\t});\n\n\t\t\tthis.heuristicData.lastAttempt.summarySequenceNumber = summarizeOp.sequenceNumber;\n\t\t\tlogger.sendTelemetryEvent({\n\t\t\t\teventName: \"Summarize_Op\",\n\t\t\t\tduration: broadcastDuration,\n\t\t\t\treferenceSequenceNumber: summarizeOp.referenceSequenceNumber,\n\t\t\t\tsummarySequenceNumber: summarizeOp.sequenceNumber,\n\t\t\t\thandle: summarizeOp.contents.handle,\n\t\t\t});\n\n\t\t\t// Wait for ack/nack\n\t\t\tconst waitAckNackResult = await raceTimer(\n\t\t\t\tsummary.waitAckNack(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitAckNackResult.result === \"cancelled\") {\n\t\t\t\treturn fail(\"disconnect\");\n\t\t\t}\n\t\t\tif (waitAckNackResult.result !== \"done\") {\n\t\t\t\treturn fail(\"summaryAckWaitTimeout\");\n\t\t\t}\n\t\t\tconst ackNackOp = waitAckNackResult.value;\n\t\t\tthis.pendingAckTimer.clear();\n\n\t\t\t// Update for success/failure\n\t\t\tconst ackNackDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\n\t\t\t// adding new properties\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\tackWaitDuration: ackNackDuration,\n\t\t\t\tackNackSequenceNumber: ackNackOp.sequenceNumber,\n\t\t\t\tsummarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber,\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t};\n\t\t\tif (ackNackOp.type === MessageType.SummaryAck) {\n\t\t\t\tthis.heuristicData.markLastAttemptAsSuccessful();\n\t\t\t\tthis.successfulSummaryCallback();\n\t\t\t\tsummarizeEvent.end({\n\t\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\t\thandle: ackNackOp.contents.handle,\n\t\t\t\t});\n\t\t\t\tresultsBuilder.receivedSummaryAckOrNack.resolve({\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsummaryAckOp: ackNackOp,\n\t\t\t\t\t\tackNackDuration,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Check for retryDelay in summaryNack response.\n\t\t\t\tassert(ackNackOp.type === MessageType.SummaryNack, 0x274 /* \"type check\" */);\n\t\t\t\tconst summaryNack = ackNackOp.contents;\n\t\t\t\tconst errorMessage = summaryNack?.message;\n\t\t\t\tconst retryAfterSeconds = summaryNack?.retryAfter;\n\n\t\t\t\t// pre-0.58 error message prefix: summaryNack\n\t\t\t\tconst error = new LoggingError(`Received summaryNack`, {\n\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\n\t\t\t\tassert(\n\t\t\t\t\tgetRetryDelaySecondsFromError(error) === retryAfterSeconds,\n\t\t\t\t\t0x25f /* \"retryAfterSeconds\" */,\n\t\t\t\t);\n\t\t\t\t// This will only set resultsBuilder.receivedSummaryAckOrNack, as other promises are already set.\n\t\t\t\treturn fail(\n\t\t\t\t\t\"summaryNack\",\n\t\t\t\t\terror,\n\t\t\t\t\t{ ...summarizeTelemetryProps, nackRetryAfter: retryAfterSeconds },\n\t\t\t\t\t{ summaryNackOp: ackNackOp, ackNackDuration },\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.pendingAckTimer.clear();\n\t\t}\n\t}\n\n\tprivate addSummaryDataToTelemetryProps(\n\t\tsummaryData: SubmitSummaryResult,\n\t\tinitialProps: SummaryGeneratorTelemetry,\n\t): SummaryGeneratorTelemetry {\n\t\tswitch (summaryData.stage) {\n\t\t\tcase \"base\":\n\t\t\t\treturn initialProps;\n\n\t\t\tcase \"generate\":\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t};\n\n\t\t\tcase \"upload\":\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t};\n\n\t\t\tcase \"submit\":\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t\tclientSequenceNumber: summaryData.clientSequenceNumber,\n\t\t\t\t\thasMissingOpData: this.heuristicData.hasMissingOpData,\n\t\t\t\t\topsSizesSinceLastSummary: this.heuristicData.totalOpsSize,\n\t\t\t\t\tnonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps,\n\t\t\t\t};\n\n\t\t\tdefault:\n\t\t\t\tassert(true, 0x397 /* Unexpected summary stage */);\n\t\t}\n\n\t\treturn initialProps;\n\t}\n\n\tprivate summarizeTimerHandler(time: number, count: number) {\n\t\tthis.logger.sendPerformanceEvent({\n\t\t\teventName: \"SummarizeTimeout\",\n\t\t\ttimeoutTime: time,\n\t\t\ttimeoutCount: count,\n\t\t});\n\t\tif (count < maxSummarizeTimeoutCount) {\n\t\t\t// Double and start a new timer\n\t\t\tconst nextTime = time * 2;\n\t\t\tthis.summarizeTimer.start(nextTime, () =>\n\t\t\t\tthis.summarizeTimerHandler(nextTime, count + 1),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic dispose() {\n\t\tthis.summarizeTimer.clear();\n\t}\n}\n"]}
1
+ {"version":3,"file":"summaryGenerator.js","sourceRoot":"","sources":["../../src/summary/summaryGenerator.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 { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport {\n\tassert,\n\tDeferred,\n\tIPromiseTimer,\n\tIPromiseTimerResult,\n\tTimer,\n} from \"@fluidframework/common-utils\";\nimport { MessageType } from \"@fluidframework/protocol-definitions\";\nimport { PerformanceEvent, LoggingError, ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { getRetryDelaySecondsFromError } from \"@fluidframework/driver-utils\";\nimport { DriverErrorType } from \"@fluidframework/driver-definitions\";\nimport {\n\tIAckSummaryResult,\n\tINackSummaryResult,\n\tISummarizeOptions,\n\tIBroadcastSummaryResult,\n\tISummarizeResults,\n\tISummarizeHeuristicData,\n\tISubmitSummaryOptions,\n\tSubmitSummaryResult,\n\tSummarizeResultPart,\n\tISummaryCancellationToken,\n\tISummarizeTelemetryProperties,\n\tSummaryGeneratorTelemetry,\n} from \"./summarizerTypes\";\nimport { IClientSummaryWatcher } from \"./summaryCollection\";\n\nexport type raceTimerResult<T> =\n\t| { result: \"done\"; value: T }\n\t| { result: IPromiseTimerResult[\"timerResult\"] }\n\t| { result: \"cancelled\" };\n\n/** Helper function to wait for a promise or PromiseTimer to elapse. */\nexport async function raceTimer<T>(\n\tpromise: Promise<T>,\n\ttimer: Promise<IPromiseTimerResult>,\n\tcancellationToken?: ISummaryCancellationToken,\n): Promise<raceTimerResult<T>> {\n\tconst promises: Promise<raceTimerResult<T>>[] = [\n\t\tpromise.then((value) => ({ result: \"done\", value } as const)),\n\t\ttimer.then(({ timerResult: result }) => ({ result } as const)),\n\t];\n\tif (cancellationToken !== undefined) {\n\t\tpromises.push(\n\t\t\tcancellationToken.waitCancelled.then(() => ({ result: \"cancelled\" } as const)),\n\t\t);\n\t}\n\treturn Promise.race(promises);\n}\n\n// Send some telemetry if generate summary takes too long\nconst maxSummarizeTimeoutTime = 20000; // 20 sec\nconst maxSummarizeTimeoutCount = 5; // Double and resend 5 times\n\nexport type SummarizeReason =\n\t/**\n\t * Attempt to summarize after idle timeout has elapsed.\n\t * Idle timer restarts whenever an op is received. So this\n\t * triggers only after some amount of time has passed with\n\t * no ops being received.\n\t */\n\t| \"idle\"\n\t/**\n\t * Attempt to summarize after a maximum time since last\n\t * successful summary has passed. This measures time since\n\t * last summary ack op was processed.\n\t */\n\t| \"maxTime\"\n\t/**\n\t * Attempt to summarize after a maximum number of ops have\n\t * passed since the last successful summary. This compares\n\t * op sequence numbers with the reference sequence number\n\t * of the summarize op corresponding to the last summary\n\t * ack op.\n\t */\n\t| \"maxOps\"\n\t/**\n\t * Special case to attempt to summarize one last time before the\n\t * summarizer client closes itself. This is to prevent cases where\n\t * the summarizer client never gets a chance to summarize, because\n\t * there are too many outstanding ops and/or parent client cannot\n\t * stay connected long enough for summarizer client to catch up.\n\t */\n\t| \"lastSummary\"\n\t/** On-demand summary requested with specified reason. */\n\t| `onDemand;${string}`\n\t/** Enqueue summarize attempt with specified reason. */\n\t| `enqueue;${string}`;\n\nconst summarizeErrors = {\n\t/**\n\t * Error encountered while generating the summary tree, uploading\n\t * it to storage, or submitting the op. It could be a result of\n\t * the client becoming disconnected while generating or an actual error.\n\t */\n\tsubmitSummaryFailure: \"Error while generating, uploading, or submitting summary\",\n\t/**\n\t * The summaryAckWaitTimeout time has elapsed before receiving the summarize op\n\t * sent by this summarize attempt. It is expected to be broadcast quickly.\n\t */\n\tsummaryOpWaitTimeout: \"Timeout while waiting for summarize op broadcast\",\n\t/**\n\t * The summaryAckWaitTimeout time has elapsed before receiving either a\n\t * summaryAck or summaryNack op from the server in response to this\n\t * summarize attempt. It is expected that the server should respond.\n\t */\n\tsummaryAckWaitTimeout: \"Timeout while waiting for summaryAck/summaryNack op\",\n\t/**\n\t * The server responded with a summaryNack op, thus rejecting this\n\t * summarize attempt.\n\t */\n\tsummaryNack: \"Server rejected summary via summaryNack op\",\n\n\tdisconnect: \"Summary cancelled due to summarizer or main client disconnect\",\n} as const;\n\n// Helper functions to report failures and return.\nexport const getFailMessage = (errorCode: keyof typeof summarizeErrors) =>\n\t`${errorCode}: ${summarizeErrors[errorCode]}`;\n\nexport class SummarizeResultBuilder {\n\tpublic readonly summarySubmitted = new Deferred<SummarizeResultPart<SubmitSummaryResult>>();\n\tpublic readonly summaryOpBroadcasted = new Deferred<\n\t\tSummarizeResultPart<IBroadcastSummaryResult>\n\t>();\n\tpublic readonly receivedSummaryAckOrNack = new Deferred<\n\t\tSummarizeResultPart<IAckSummaryResult, INackSummaryResult>\n\t>();\n\n\tpublic fail(\n\t\tmessage: string,\n\t\terror: any,\n\t\tnackSummaryResult?: INackSummaryResult,\n\t\tretryAfterSeconds?: number,\n\t) {\n\t\tassert(\n\t\t\t!this.receivedSummaryAckOrNack.isCompleted,\n\t\t\t0x25e /* \"no reason to call fail if all promises have been completed\" */,\n\t\t);\n\n\t\tconst result: SummarizeResultPart<undefined> = {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\tdata: undefined,\n\t\t\terror,\n\t\t\tretryAfterSeconds,\n\t\t} as const;\n\t\tthis.summarySubmitted.resolve(result);\n\t\tthis.summaryOpBroadcasted.resolve(result);\n\t\tthis.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });\n\t}\n\tpublic build(): ISummarizeResults {\n\t\treturn {\n\t\t\tsummarySubmitted: this.summarySubmitted.promise,\n\t\t\tsummaryOpBroadcasted: this.summaryOpBroadcasted.promise,\n\t\t\treceivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,\n\t\t} as const;\n\t}\n}\n\n/**\n * This class generates and tracks a summary attempt.\n */\nexport class SummaryGenerator {\n\tprivate readonly summarizeTimer: Timer;\n\tconstructor(\n\t\tprivate readonly pendingAckTimer: IPromiseTimer,\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly submitSummaryCallback: (\n\t\t\toptions: ISubmitSummaryOptions,\n\t\t) => Promise<SubmitSummaryResult>,\n\t\tprivate readonly successfulSummaryCallback: () => void,\n\t\tprivate readonly summaryWatcher: Pick<IClientSummaryWatcher, \"watchSummary\">,\n\t\tprivate readonly logger: ITelemetryLogger,\n\t) {\n\t\tthis.summarizeTimer = new Timer(maxSummarizeTimeoutTime, () =>\n\t\t\tthis.summarizeTimerHandler(maxSummarizeTimeoutTime, 1),\n\t\t);\n\t}\n\n\t/**\n\t * Generates summary and listens for broadcast and ack/nack.\n\t * Returns true for ack, false for nack, and undefined for failure or timeout.\n\t * @param reason - reason for summarizing\n\t * @param options - refreshLatestAck to fetch summary ack info from server,\n\t * fullTree to generate tree without any summary handles even if unchanged\n\t */\n\tpublic summarize(\n\t\tsummarizeProps: ISummarizeTelemetryProperties,\n\t\toptions: ISummarizeOptions,\n\t\tcancellationToken: ISummaryCancellationToken,\n\t\tresultsBuilder = new SummarizeResultBuilder(),\n\t): ISummarizeResults {\n\t\tthis.summarizeCore(summarizeProps, options, resultsBuilder, cancellationToken).catch(\n\t\t\t(error) => {\n\t\t\t\tconst message = \"UnexpectedSummarizeError\";\n\t\t\t\tthis.logger.sendErrorEvent({ eventName: message, ...summarizeProps }, error);\n\t\t\t\tresultsBuilder.fail(message, error);\n\t\t\t},\n\t\t);\n\n\t\treturn resultsBuilder.build();\n\t}\n\n\tprivate async summarizeCore(\n\t\tsummarizeProps: ISummarizeTelemetryProperties,\n\t\toptions: ISummarizeOptions,\n\t\tresultsBuilder: SummarizeResultBuilder,\n\t\tcancellationToken: ISummaryCancellationToken,\n\t): Promise<void> {\n\t\tconst { refreshLatestAck, fullTree } = options;\n\t\tconst logger = ChildLogger.create(this.logger, undefined, { all: summarizeProps });\n\n\t\t// Note: timeSinceLastAttempt and timeSinceLastSummary for the\n\t\t// first summary are basically the time since the summarizer was loaded.\n\t\tconst timeSinceLastAttempt = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\tconst timeSinceLastSummary =\n\t\t\tDate.now() - this.heuristicData.lastSuccessfulSummary.summaryTime;\n\t\tlet summarizeTelemetryProps: SummaryGeneratorTelemetry = {\n\t\t\tfullTree,\n\t\t\ttimeSinceLastAttempt,\n\t\t\ttimeSinceLastSummary,\n\t\t};\n\n\t\tconst summarizeEvent = PerformanceEvent.start(\n\t\t\tlogger,\n\t\t\t{\n\t\t\t\teventName: \"Summarize\",\n\t\t\t\trefreshLatestAck,\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t},\n\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t);\n\n\t\tconst fail = (\n\t\t\terrorCode: keyof typeof summarizeErrors,\n\t\t\terror?: any,\n\t\t\tproperties?: SummaryGeneratorTelemetry,\n\t\t\tnackSummaryResult?: INackSummaryResult,\n\t\t) => {\n\t\t\t// UploadSummary may fail with 429 and retryAfter - respect that\n\t\t\t// Summary Nack also can have retryAfter, it's parsed below and comes as a property.\n\t\t\tconst retryAfterSeconds = getRetryDelaySecondsFromError(error);\n\n\t\t\t// Report any failure as an error unless it was due to cancellation (like \"disconnected\" error)\n\t\t\t// If failure happened on upload, we may not yet realized that socket disconnected, so check\n\t\t\t// offlineError too.\n\t\t\tconst category =\n\t\t\t\tcancellationToken.cancelled || error?.errorType === DriverErrorType.offlineError\n\t\t\t\t\t? \"generic\"\n\t\t\t\t\t: \"error\";\n\n\t\t\tconst reason = getFailMessage(errorCode);\n\t\t\tsummarizeEvent.cancel(\n\t\t\t\t{\n\t\t\t\t\t...properties,\n\t\t\t\t\treason,\n\t\t\t\t\tcategory,\n\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t},\n\t\t\t\terror ?? reason,\n\t\t\t); // disconnect & summaryAckTimeout do not have proper error.\n\t\t\tresultsBuilder.fail(reason, error, nackSummaryResult, retryAfterSeconds);\n\t\t};\n\n\t\t// Wait to generate and send summary\n\t\tthis.summarizeTimer.start();\n\n\t\t// Use record type to prevent unexpected value types\n\t\tlet summaryData: SubmitSummaryResult | undefined;\n\t\ttry {\n\t\t\t// Need to save refSeqNum before we record new attempt (happens as part of submitSummaryCallback)\n\t\t\tconst lastAttemptRefSeqNum = this.heuristicData.lastAttempt.refSequenceNumber;\n\n\t\t\tsummaryData = await this.submitSummaryCallback({\n\t\t\t\tfullTree,\n\t\t\t\trefreshLatestAck,\n\t\t\t\tsummaryLogger: logger,\n\t\t\t\tcancellationToken,\n\t\t\t});\n\n\t\t\t// Cumulatively add telemetry properties based on how far generateSummary went.\n\t\t\tconst referenceSequenceNumber = summaryData.referenceSequenceNumber;\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\treferenceSequenceNumber,\n\t\t\t\tminimumSequenceNumber: summaryData.minimumSequenceNumber,\n\t\t\t\topsSinceLastAttempt: referenceSequenceNumber - lastAttemptRefSeqNum,\n\t\t\t\topsSinceLastSummary:\n\t\t\t\t\treferenceSequenceNumber -\n\t\t\t\t\tthis.heuristicData.lastSuccessfulSummary.refSequenceNumber,\n\t\t\t\tstage: summaryData.stage,\n\t\t\t};\n\t\t\tsummarizeTelemetryProps = this.addSummaryDataToTelemetryProps(\n\t\t\t\tsummaryData,\n\t\t\t\tsummarizeTelemetryProps,\n\t\t\t);\n\n\t\t\tif (summaryData.stage !== \"submit\") {\n\t\t\t\treturn fail(\"submitSummaryFailure\", summaryData.error, summarizeTelemetryProps);\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * With incremental summaries, if the full tree was not summarized, only data stores that changed should\n\t\t\t * be summarized. A data store is considered changed if either or both of the following is true:\n\t\t\t * - It has received an op.\n\t\t\t * - Its reference state changed, i.e., it went from referenced to unreferenced or vice-versa.\n\t\t\t *\n\t\t\t * In the extreme case, every op can be for a different data store and each op can result in the reference\n\t\t\t * state change of multiple data stores. So, the total number of data stores that are summarized should not\n\t\t\t * exceed the number of ops since last summary + number of data store whose reference state changed.\n\t\t\t */\n\t\t\tif (!fullTree && !summaryData.forcedFullTree) {\n\t\t\t\tconst { summarizedDataStoreCount, gcStateUpdatedDataStoreCount = 0 } =\n\t\t\t\t\tsummaryData.summaryStats;\n\t\t\t\tif (\n\t\t\t\t\tsummarizedDataStoreCount >\n\t\t\t\t\tgcStateUpdatedDataStoreCount + this.heuristicData.opsSinceLastSummary\n\t\t\t\t) {\n\t\t\t\t\tlogger.sendErrorEvent({\n\t\t\t\t\t\teventName: \"IncrementalSummaryViolation\",\n\t\t\t\t\t\tsummarizedDataStoreCount,\n\t\t\t\t\t\tgcStateUpdatedDataStoreCount,\n\t\t\t\t\t\topsSinceLastSummary: this.heuristicData.opsSinceLastSummary,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log event here on summary success only, as Summarize_cancel duplicates failure logging.\n\t\t\tsummarizeEvent.reportEvent(\"generate\", { ...summarizeTelemetryProps });\n\t\t\tresultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });\n\t\t} catch (error) {\n\t\t\treturn fail(\"submitSummaryFailure\", error);\n\t\t} finally {\n\t\t\tif (summaryData === undefined) {\n\t\t\t\tthis.heuristicData.recordAttempt();\n\t\t\t}\n\t\t\tthis.summarizeTimer.clear();\n\t\t}\n\n\t\ttry {\n\t\t\tconst pendingTimeoutP = this.pendingAckTimer.start();\n\t\t\tconst summary = this.summaryWatcher.watchSummary(summaryData.clientSequenceNumber);\n\n\t\t\t// Wait for broadcast\n\t\t\tconst waitBroadcastResult = await raceTimer(\n\t\t\t\tsummary.waitBroadcast(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitBroadcastResult.result === \"cancelled\") {\n\t\t\t\treturn fail(\"disconnect\");\n\t\t\t}\n\t\t\tif (waitBroadcastResult.result !== \"done\") {\n\t\t\t\treturn fail(\"summaryOpWaitTimeout\");\n\t\t\t}\n\t\t\tconst summarizeOp = waitBroadcastResult.value;\n\n\t\t\tconst broadcastDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\t\tresultsBuilder.summaryOpBroadcasted.resolve({\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: { summarizeOp, broadcastDuration },\n\t\t\t});\n\n\t\t\tthis.heuristicData.lastAttempt.summarySequenceNumber = summarizeOp.sequenceNumber;\n\t\t\tlogger.sendTelemetryEvent({\n\t\t\t\teventName: \"Summarize_Op\",\n\t\t\t\tduration: broadcastDuration,\n\t\t\t\treferenceSequenceNumber: summarizeOp.referenceSequenceNumber,\n\t\t\t\tsummarySequenceNumber: summarizeOp.sequenceNumber,\n\t\t\t\thandle: summarizeOp.contents.handle,\n\t\t\t});\n\n\t\t\t// Wait for ack/nack\n\t\t\tconst waitAckNackResult = await raceTimer(\n\t\t\t\tsummary.waitAckNack(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitAckNackResult.result === \"cancelled\") {\n\t\t\t\treturn fail(\"disconnect\");\n\t\t\t}\n\t\t\tif (waitAckNackResult.result !== \"done\") {\n\t\t\t\treturn fail(\"summaryAckWaitTimeout\");\n\t\t\t}\n\t\t\tconst ackNackOp = waitAckNackResult.value;\n\t\t\tthis.pendingAckTimer.clear();\n\n\t\t\t// Update for success/failure\n\t\t\tconst ackNackDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\n\t\t\t// adding new properties\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\tackWaitDuration: ackNackDuration,\n\t\t\t\tackNackSequenceNumber: ackNackOp.sequenceNumber,\n\t\t\t\tsummarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber,\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t};\n\t\t\tif (ackNackOp.type === MessageType.SummaryAck) {\n\t\t\t\tthis.heuristicData.markLastAttemptAsSuccessful();\n\t\t\t\tthis.successfulSummaryCallback();\n\t\t\t\tsummarizeEvent.end({\n\t\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\t\thandle: ackNackOp.contents.handle,\n\t\t\t\t});\n\t\t\t\tresultsBuilder.receivedSummaryAckOrNack.resolve({\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsummaryAckOp: ackNackOp,\n\t\t\t\t\t\tackNackDuration,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Check for retryDelay in summaryNack response.\n\t\t\t\tassert(ackNackOp.type === MessageType.SummaryNack, 0x274 /* \"type check\" */);\n\t\t\t\tconst summaryNack = ackNackOp.contents;\n\t\t\t\tconst errorMessage = summaryNack?.message;\n\t\t\t\tconst retryAfterSeconds = summaryNack?.retryAfter;\n\n\t\t\t\t// pre-0.58 error message prefix: summaryNack\n\t\t\t\tconst error = new LoggingError(`Received summaryNack`, {\n\t\t\t\t\tretryAfterSeconds,\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\n\t\t\t\tassert(\n\t\t\t\t\tgetRetryDelaySecondsFromError(error) === retryAfterSeconds,\n\t\t\t\t\t0x25f /* \"retryAfterSeconds\" */,\n\t\t\t\t);\n\t\t\t\t// This will only set resultsBuilder.receivedSummaryAckOrNack, as other promises are already set.\n\t\t\t\treturn fail(\n\t\t\t\t\t\"summaryNack\",\n\t\t\t\t\terror,\n\t\t\t\t\t{ ...summarizeTelemetryProps, nackRetryAfter: retryAfterSeconds },\n\t\t\t\t\t{ summaryNackOp: ackNackOp, ackNackDuration },\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.pendingAckTimer.clear();\n\t\t}\n\t}\n\n\tprivate addSummaryDataToTelemetryProps(\n\t\tsummaryData: SubmitSummaryResult,\n\t\tinitialProps: SummaryGeneratorTelemetry,\n\t): SummaryGeneratorTelemetry {\n\t\tswitch (summaryData.stage) {\n\t\t\tcase \"base\":\n\t\t\t\treturn initialProps;\n\n\t\t\tcase \"generate\":\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t};\n\n\t\t\tcase \"upload\":\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t};\n\n\t\t\tcase \"submit\":\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t\tclientSequenceNumber: summaryData.clientSequenceNumber,\n\t\t\t\t\thasMissingOpData: this.heuristicData.hasMissingOpData,\n\t\t\t\t\topsSizesSinceLastSummary: this.heuristicData.totalOpsSize,\n\t\t\t\t\tnonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps,\n\t\t\t\t\truntimeOpsSinceLastSummary: this.heuristicData.numRuntimeOps,\n\t\t\t\t};\n\n\t\t\tdefault:\n\t\t\t\tassert(true, 0x397 /* Unexpected summary stage */);\n\t\t}\n\n\t\treturn initialProps;\n\t}\n\n\tprivate summarizeTimerHandler(time: number, count: number) {\n\t\tthis.logger.sendPerformanceEvent({\n\t\t\teventName: \"SummarizeTimeout\",\n\t\t\ttimeoutTime: time,\n\t\t\ttimeoutCount: count,\n\t\t});\n\t\tif (count < maxSummarizeTimeoutCount) {\n\t\t\t// Double and start a new timer\n\t\t\tconst nextTime = time * 2;\n\t\t\tthis.summarizeTimer.start(nextTime, () =>\n\t\t\t\tthis.summarizeTimerHandler(nextTime, count + 1),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic dispose() {\n\t\tthis.summarizeTimer.clear();\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/container-runtime",
3
- "version": "2.0.0-internal.4.2.1",
3
+ "version": "2.0.0-internal.4.3.1",
4
4
  "description": "Fluid container runtime",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -37,19 +37,19 @@
37
37
  "dependencies": {
38
38
  "@fluidframework/common-definitions": "^0.20.1",
39
39
  "@fluidframework/common-utils": "^1.1.1",
40
- "@fluidframework/container-definitions": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
41
- "@fluidframework/container-runtime-definitions": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
42
- "@fluidframework/container-utils": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
43
- "@fluidframework/core-interfaces": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
44
- "@fluidframework/datastore": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
45
- "@fluidframework/driver-definitions": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
46
- "@fluidframework/driver-utils": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
47
- "@fluidframework/garbage-collector": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
40
+ "@fluidframework/container-definitions": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
41
+ "@fluidframework/container-runtime-definitions": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
42
+ "@fluidframework/container-utils": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
43
+ "@fluidframework/core-interfaces": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
44
+ "@fluidframework/datastore": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
45
+ "@fluidframework/driver-definitions": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
46
+ "@fluidframework/driver-utils": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
47
+ "@fluidframework/garbage-collector": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
48
48
  "@fluidframework/protocol-base": "^0.1039.1000",
49
49
  "@fluidframework/protocol-definitions": "^1.1.0",
50
- "@fluidframework/runtime-definitions": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
51
- "@fluidframework/runtime-utils": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
52
- "@fluidframework/telemetry-utils": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
50
+ "@fluidframework/runtime-definitions": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
51
+ "@fluidframework/runtime-utils": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
52
+ "@fluidframework/telemetry-utils": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
53
53
  "double-ended-queue": "^2.1.0-0",
54
54
  "events": "^3.1.0",
55
55
  "lz4js": "^0.2.0",
@@ -57,15 +57,15 @@
57
57
  "uuid": "^8.3.1"
58
58
  },
59
59
  "devDependencies": {
60
- "@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
60
+ "@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
61
61
  "@fluid-tools/benchmark": "^0.46.0",
62
- "@fluid-tools/build-cli": "^0.17.0",
62
+ "@fluid-tools/build-cli": "^0.18.2",
63
63
  "@fluidframework/build-common": "^1.1.0",
64
- "@fluidframework/build-tools": "^0.17.0",
64
+ "@fluidframework/build-tools": "^0.18.2",
65
65
  "@fluidframework/container-runtime-previous": "npm:@fluidframework/container-runtime@2.0.0-internal.4.1.0",
66
66
  "@fluidframework/eslint-config-fluid": "^2.0.0",
67
- "@fluidframework/mocha-test-setup": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
68
- "@fluidframework/test-runtime-utils": ">=2.0.0-internal.4.2.1 <2.0.0-internal.4.3.0",
67
+ "@fluidframework/mocha-test-setup": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
68
+ "@fluidframework/test-runtime-utils": ">=2.0.0-internal.4.3.1 <2.0.0-internal.4.4.0",
69
69
  "@microsoft/api-extractor": "^7.34.4",
70
70
  "@types/double-ended-queue": "^2.1.0",
71
71
  "@types/events": "^3.0.0",
@@ -285,6 +285,7 @@ class OpPerfTelemetry {
285
285
  });
286
286
  this.clientSequenceNumberForLatencyStatistics = undefined;
287
287
  this.opPerfData = {};
288
+ this.opProcessingTimes = {};
288
289
  }
289
290
  }
290
291
  }
@@ -89,7 +89,6 @@ import {
89
89
  CreateChildSummarizerNodeParam,
90
90
  SummarizeInternalFn,
91
91
  channelsTreeName,
92
- IAttachMessage,
93
92
  IDataStore,
94
93
  ITelemetryContext,
95
94
  SerializedIdCompressorWithNoSession,
@@ -97,6 +96,7 @@ import {
97
96
  IIdCompressorCore,
98
97
  IdCreationRange,
99
98
  IdCreationRangeWithStashedState,
99
+ IAttachMessage,
100
100
  } from "@fluidframework/runtime-definitions";
101
101
  import {
102
102
  addBlobToSummary,
@@ -1812,23 +1812,18 @@ export class ContainerRuntime
1812
1812
  this.idCompressor = IdCompressor.deserialize(op.stashedState);
1813
1813
  }
1814
1814
 
1815
- private async applyStashedOp(
1816
- type: ContainerMessageType,
1817
- op: ISequencedDocumentMessage,
1818
- ): Promise<unknown> {
1815
+ private async applyStashedOp(type: ContainerMessageType, contents: unknown): Promise<unknown> {
1819
1816
  switch (type) {
1820
1817
  case ContainerMessageType.FluidDataStoreOp:
1821
- return this.dataStores.applyStashedOp(op);
1818
+ return this.dataStores.applyStashedOp(contents as IEnvelope);
1822
1819
  case ContainerMessageType.Attach:
1823
- return this.dataStores.applyStashedAttachOp(op as unknown as IAttachMessage);
1820
+ return this.dataStores.applyStashedAttachOp(contents as IAttachMessage);
1824
1821
  case ContainerMessageType.IdAllocation:
1825
1822
  assert(
1826
1823
  this.idCompressor !== undefined,
1827
1824
  0x67b /* IdCompressor should be defined if enabled */,
1828
1825
  );
1829
- return this.applyStashedIdAllocationOp(
1830
- op as unknown as IdCreationRangeWithStashedState,
1831
- );
1826
+ return this.applyStashedIdAllocationOp(contents as IdCreationRangeWithStashedState);
1832
1827
  case ContainerMessageType.Alias:
1833
1828
  case ContainerMessageType.BlobAttach:
1834
1829
  return;
@@ -2690,13 +2685,16 @@ export class ContainerRuntime
2690
2685
  this.mc.config.getBoolean(
2691
2686
  "Fluid.ContainerRuntime.SubmitSummary.disableInboundSignalPause",
2692
2687
  ) !== true;
2688
+
2689
+ let summaryRefSeqNum: number | undefined;
2690
+
2693
2691
  try {
2694
2692
  await this.deltaManager.inbound.pause();
2695
2693
  if (shouldPauseInboundSignal) {
2696
2694
  await this.deltaManager.inboundSignal.pause();
2697
2695
  }
2698
2696
 
2699
- const summaryRefSeqNum = this.deltaManager.lastSequenceNumber;
2697
+ summaryRefSeqNum = this.deltaManager.lastSequenceNumber;
2700
2698
  const minimumSequenceNumber = this.deltaManager.minimumSequenceNumber;
2701
2699
  const message = `Summary @${summaryRefSeqNum}:${this.deltaManager.minimumSequenceNumber}`;
2702
2700
  const lastAck = this.summaryCollection.latestAck;
@@ -2891,6 +2889,9 @@ export class ContainerRuntime
2891
2889
  // Cleanup wip summary in case of failure
2892
2890
  this.summarizerNode.clearSummary();
2893
2891
 
2892
+ // ! This needs to happen before we resume inbound queues to ensure heuristics are tracked correctly
2893
+ this._summarizer?.recordSummaryAttempt?.(summaryRefSeqNum);
2894
+
2894
2895
  // Restart the delta manager
2895
2896
  this.deltaManager.inbound.resume();
2896
2897
  if (shouldPauseInboundSignal) {
package/src/dataStores.ts CHANGED
@@ -116,7 +116,7 @@ export class DataStores implements IDisposable {
116
116
  constructor(
117
117
  private readonly baseSnapshot: ISnapshotTree | undefined,
118
118
  private readonly runtime: ContainerRuntime,
119
- private readonly submitAttachFn: (attachContent: any) => void,
119
+ private readonly submitAttachFn: (attachContent: IAttachMessage) => void,
120
120
  private readonly getCreateChildSummarizerNodeFn: (
121
121
  id: string,
122
122
  createParam: CreateChildSummarizerNodeParam,
@@ -399,22 +399,19 @@ export class DataStores implements IDisposable {
399
399
  }
400
400
  public readonly dispose = () => this.disposeOnce.value;
401
401
 
402
- public resubmitDataStoreOp(content: any, localOpMetadata: unknown) {
403
- const envelope = content as IEnvelope;
402
+ public resubmitDataStoreOp(envelope: IEnvelope, localOpMetadata: unknown) {
404
403
  const context = this.contexts.get(envelope.address);
405
404
  assert(!!context, 0x160 /* "There should be a store context for the op" */);
406
405
  context.reSubmit(envelope.contents, localOpMetadata);
407
406
  }
408
407
 
409
- public rollbackDataStoreOp(content: any, localOpMetadata: unknown) {
410
- const envelope = content as IEnvelope;
408
+ public rollbackDataStoreOp(envelope: IEnvelope, localOpMetadata: unknown) {
411
409
  const context = this.contexts.get(envelope.address);
412
410
  assert(!!context, 0x2e8 /* "There should be a store context for the op" */);
413
411
  context.rollback(envelope.contents, localOpMetadata);
414
412
  }
415
413
 
416
- public async applyStashedOp(content: any): Promise<unknown> {
417
- const envelope = content as IEnvelope;
414
+ public async applyStashedOp(envelope: IEnvelope): Promise<unknown> {
418
415
  const context = this.contexts.get(envelope.address);
419
416
  assert(!!context, 0x161 /* "There should be a store context for the op" */);
420
417
  return context.applyStashedOp(envelope.contents);