@fluidframework/container-runtime 0.52.1 → 0.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/containerHandleContext.d.ts +0 -1
  2. package/dist/containerHandleContext.d.ts.map +1 -1
  3. package/dist/containerHandleContext.js +0 -1
  4. package/dist/containerHandleContext.js.map +1 -1
  5. package/dist/containerRuntime.d.ts +43 -19
  6. package/dist/containerRuntime.d.ts.map +1 -1
  7. package/dist/containerRuntime.js +201 -111
  8. package/dist/containerRuntime.js.map +1 -1
  9. package/dist/dataStoreContext.d.ts +33 -4
  10. package/dist/dataStoreContext.d.ts.map +1 -1
  11. package/dist/dataStoreContext.js +45 -17
  12. package/dist/dataStoreContext.js.map +1 -1
  13. package/dist/dataStores.d.ts +14 -10
  14. package/dist/dataStores.d.ts.map +1 -1
  15. package/dist/dataStores.js +73 -41
  16. package/dist/dataStores.js.map +1 -1
  17. package/dist/garbageCollection.d.ts +82 -15
  18. package/dist/garbageCollection.d.ts.map +1 -1
  19. package/dist/garbageCollection.js +359 -26
  20. package/dist/garbageCollection.js.map +1 -1
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +11 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/packageVersion.d.ts +1 -1
  26. package/dist/packageVersion.js +1 -1
  27. package/dist/packageVersion.js.map +1 -1
  28. package/dist/runningSummarizer.d.ts +3 -2
  29. package/dist/runningSummarizer.d.ts.map +1 -1
  30. package/dist/runningSummarizer.js +6 -6
  31. package/dist/runningSummarizer.js.map +1 -1
  32. package/dist/summarizer.d.ts +23 -3
  33. package/dist/summarizer.d.ts.map +1 -1
  34. package/dist/summarizer.js +135 -45
  35. package/dist/summarizer.js.map +1 -1
  36. package/dist/summarizerTypes.d.ts +3 -10
  37. package/dist/summarizerTypes.d.ts.map +1 -1
  38. package/dist/summarizerTypes.js.map +1 -1
  39. package/dist/summaryFormat.d.ts +10 -1
  40. package/dist/summaryFormat.d.ts.map +1 -1
  41. package/dist/summaryFormat.js +2 -1
  42. package/dist/summaryFormat.js.map +1 -1
  43. package/dist/summaryGenerator.d.ts.map +1 -1
  44. package/dist/summaryGenerator.js +1 -3
  45. package/dist/summaryGenerator.js.map +1 -1
  46. package/dist/summaryManager.d.ts +0 -15
  47. package/dist/summaryManager.d.ts.map +1 -1
  48. package/dist/summaryManager.js +1 -35
  49. package/dist/summaryManager.js.map +1 -1
  50. package/lib/containerHandleContext.d.ts +0 -1
  51. package/lib/containerHandleContext.d.ts.map +1 -1
  52. package/lib/containerHandleContext.js +0 -1
  53. package/lib/containerHandleContext.js.map +1 -1
  54. package/lib/containerRuntime.d.ts +43 -19
  55. package/lib/containerRuntime.d.ts.map +1 -1
  56. package/lib/containerRuntime.js +206 -117
  57. package/lib/containerRuntime.js.map +1 -1
  58. package/lib/dataStoreContext.d.ts +33 -4
  59. package/lib/dataStoreContext.d.ts.map +1 -1
  60. package/lib/dataStoreContext.js +45 -17
  61. package/lib/dataStoreContext.js.map +1 -1
  62. package/lib/dataStores.d.ts +14 -10
  63. package/lib/dataStores.d.ts.map +1 -1
  64. package/lib/dataStores.js +76 -44
  65. package/lib/dataStores.js.map +1 -1
  66. package/lib/garbageCollection.d.ts +82 -15
  67. package/lib/garbageCollection.d.ts.map +1 -1
  68. package/lib/garbageCollection.js +361 -28
  69. package/lib/garbageCollection.js.map +1 -1
  70. package/lib/index.d.ts +2 -2
  71. package/lib/index.d.ts.map +1 -1
  72. package/lib/index.js +2 -1
  73. package/lib/index.js.map +1 -1
  74. package/lib/packageVersion.d.ts +1 -1
  75. package/lib/packageVersion.js +1 -1
  76. package/lib/packageVersion.js.map +1 -1
  77. package/lib/runningSummarizer.d.ts +3 -2
  78. package/lib/runningSummarizer.d.ts.map +1 -1
  79. package/lib/runningSummarizer.js +6 -6
  80. package/lib/runningSummarizer.js.map +1 -1
  81. package/lib/summarizer.d.ts +23 -3
  82. package/lib/summarizer.d.ts.map +1 -1
  83. package/lib/summarizer.js +135 -45
  84. package/lib/summarizer.js.map +1 -1
  85. package/lib/summarizerTypes.d.ts +3 -10
  86. package/lib/summarizerTypes.d.ts.map +1 -1
  87. package/lib/summarizerTypes.js.map +1 -1
  88. package/lib/summaryFormat.d.ts +10 -1
  89. package/lib/summaryFormat.d.ts.map +1 -1
  90. package/lib/summaryFormat.js +1 -0
  91. package/lib/summaryFormat.js.map +1 -1
  92. package/lib/summaryGenerator.d.ts.map +1 -1
  93. package/lib/summaryGenerator.js +1 -3
  94. package/lib/summaryGenerator.js.map +1 -1
  95. package/lib/summaryManager.d.ts +0 -15
  96. package/lib/summaryManager.d.ts.map +1 -1
  97. package/lib/summaryManager.js +1 -34
  98. package/lib/summaryManager.js.map +1 -1
  99. package/package.json +14 -14
  100. package/src/containerHandleContext.ts +0 -1
  101. package/src/containerRuntime.ts +280 -140
  102. package/src/dataStoreContext.ts +59 -20
  103. package/src/dataStores.ts +116 -54
  104. package/src/garbageCollection.ts +492 -29
  105. package/src/index.ts +20 -2
  106. package/src/packageVersion.ts +1 -1
  107. package/src/runningSummarizer.ts +12 -10
  108. package/src/summarizer.ts +154 -53
  109. package/src/summarizerTypes.ts +3 -11
  110. package/src/summaryFormat.ts +11 -1
  111. package/src/summaryGenerator.ts +2 -3
  112. package/src/summaryManager.ts +2 -49
  113. package/dist/localStorageFeatureGates.d.ts +0 -13
  114. package/dist/localStorageFeatureGates.d.ts.map +0 -1
  115. package/dist/localStorageFeatureGates.js +0 -31
  116. package/dist/localStorageFeatureGates.js.map +0 -1
  117. package/lib/localStorageFeatureGates.d.ts +0 -13
  118. package/lib/localStorageFeatureGates.d.ts.map +0 -1
  119. package/lib/localStorageFeatureGates.js +0 -27
  120. package/lib/localStorageFeatureGates.js.map +0 -1
  121. package/src/localStorageFeatureGates.ts +0 -27
package/lib/index.d.ts CHANGED
@@ -2,10 +2,10 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export * from "./containerRuntime";
5
+ export { ContainerMessageType, IChunkedOp, ContainerRuntimeMessage, IGCRuntimeOptions, ISummaryRuntimeOptions, IContainerRuntimeOptions, isRuntimeMessage, unpackRuntimeMessage, ScheduleManager, agentSchedulerId, ContainerRuntime, } from "./containerRuntime";
6
6
  export * from "./deltaScheduler";
7
7
  export * from "./dataStoreRegistry";
8
- export { IGarbageCollectionRuntime, IGCStats, IUsedStateStats } from "./garbageCollection";
8
+ export { gcBlobPrefix, gcTreeKey, IGarbageCollectionRuntime, IGCStats, IUsedStateStats, } from "./garbageCollection";
9
9
  export * from "./pendingStateManager";
10
10
  export * from "./summarizer";
11
11
  export * from "./summarizerTypes";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3F,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,gCAAgC,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,oBAAoB,EACpB,UAAU,EACV,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACH,YAAY,EACZ,SAAS,EACT,yBAAyB,EACzB,QAAQ,EACR,eAAe,GAClB,MAAM,qBAAqB,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,gCAAgC,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC"}
package/lib/index.js CHANGED
@@ -2,9 +2,10 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- export * from "./containerRuntime";
5
+ export { ContainerMessageType, isRuntimeMessage, unpackRuntimeMessage, ScheduleManager, agentSchedulerId, ContainerRuntime, } from "./containerRuntime";
6
6
  export * from "./deltaScheduler";
7
7
  export * from "./dataStoreRegistry";
8
+ export { gcBlobPrefix, gcTreeKey, } from "./garbageCollection";
8
9
  export * from "./pendingStateManager";
9
10
  export * from "./summarizer";
10
11
  export * from "./summarizerTypes";
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAoC,0BAA0B,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport * from \"./containerRuntime\";\nexport * from \"./deltaScheduler\";\nexport * from \"./dataStoreRegistry\";\nexport { IGarbageCollectionRuntime, IGCStats, IUsedStateStats } from \"./garbageCollection\";\nexport * from \"./pendingStateManager\";\nexport * from \"./summarizer\";\nexport * from \"./summarizerTypes\";\nexport * from \"./summaryCollection\";\nexport { ICancellableSummarizerController, neverCancelledSummaryToken } from \"./runWhileConnectedCoordinator\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,oBAAoB,EAMpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACH,YAAY,EACZ,SAAS,GAIZ,MAAM,qBAAqB,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAoC,0BAA0B,EAAE,MAAM,gCAAgC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n ContainerMessageType,\n IChunkedOp,\n ContainerRuntimeMessage,\n IGCRuntimeOptions,\n ISummaryRuntimeOptions,\n IContainerRuntimeOptions,\n isRuntimeMessage,\n unpackRuntimeMessage,\n ScheduleManager,\n agentSchedulerId,\n ContainerRuntime,\n} from \"./containerRuntime\";\nexport * from \"./deltaScheduler\";\nexport * from \"./dataStoreRegistry\";\nexport {\n gcBlobPrefix,\n gcTreeKey,\n IGarbageCollectionRuntime,\n IGCStats,\n IUsedStateStats,\n} from \"./garbageCollection\";\nexport * from \"./pendingStateManager\";\nexport * from \"./summarizer\";\nexport * from \"./summarizerTypes\";\nexport * from \"./summaryCollection\";\nexport { ICancellableSummarizerController, neverCancelledSummaryToken } from \"./runWhileConnectedCoordinator\";\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/container-runtime";
8
- export declare const pkgVersion = "0.52.1";
8
+ export declare const pkgVersion = "0.54.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/container-runtime";
8
- export const pkgVersion = "0.52.1";
8
+ export const pkgVersion = "0.54.0";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-runtime\";\nexport const pkgVersion = \"0.52.1\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-runtime\";\nexport const pkgVersion = \"0.54.0\";\n"]}
@@ -4,8 +4,9 @@
4
4
  */
5
5
  import { IDisposable, ITelemetryLogger } from "@fluidframework/common-definitions";
6
6
  import { ISequencedDocumentMessage, ISummaryConfiguration } from "@fluidframework/protocol-definitions";
7
- import { IEnqueueSummarizeOptions, ISummarizeHeuristicData, ISummarizerOptions, OnDemandSummarizeResult, IOnDemandSummarizeOptions, EnqueueSummarizeResult, SummarizerStopReason, ISubmitSummaryOptions, SubmitSummaryResult, ISummaryCancellationToken } from "./summarizerTypes";
7
+ import { IEnqueueSummarizeOptions, ISummarizeHeuristicData, ISummarizerOptions, IOnDemandSummarizeOptions, EnqueueSummarizeResult, SummarizerStopReason, ISubmitSummaryOptions, SubmitSummaryResult, ISummaryCancellationToken, ISummarizeResults } from "./summarizerTypes";
8
8
  import { IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
9
+ import { SummarizeResultBuilder } from "./summaryGenerator";
9
10
  /**
10
11
  * An instance of RunningSummarizer manages the heuristics for summarizing.
11
12
  * Until disposed, the instance of RunningSummarizer can assume that it is
@@ -67,7 +68,7 @@ export declare class RunningSummarizer implements IDisposable {
67
68
  /** Heuristics summarize attempt. */
68
69
  private trySummarize;
69
70
  /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
70
- summarizeOnDemand({ reason, ...options }: IOnDemandSummarizeOptions): OnDemandSummarizeResult;
71
+ summarizeOnDemand(resultsBuilder: SummarizeResultBuilder | undefined, { reason, ...options }: IOnDemandSummarizeOptions): ISummarizeResults;
71
72
  /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
72
73
  enqueueSummarize({ reason, afterSequenceNumber, override, ...options }: IEnqueueSummarizeOptions): EnqueueSummarizeResult;
73
74
  private tryRunEnqueuedSummary;
@@ -1 +1 @@
1
- {"version":3,"file":"runningSummarizer.d.ts","sourceRoot":"","sources":["../src/runningSummarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAwB,MAAM,oCAAoC,CAAC;AAEzG,OAAO,EACH,yBAAyB,EACzB,qBAAqB,EAExB,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EACH,wBAAwB,EAExB,uBAAuB,EAEvB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EAE5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAU/E;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IAoD7C,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;WA1DvB,KAAK,CACrB,MAAM,EAAE,gBAAgB,EACxB,cAAc,EAAE,qBAAqB,EACrC,aAAa,EAAE,qBAAqB,EACpC,qBAAqB,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,mBAAmB,CAAC,EACvF,aAAa,EAAE,uBAAuB,EACtC,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EAClD,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,yBAAyB,EAC5C,sBAAsB,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,EAC9D,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAChD,OAAO,CAAC,iBAAiB,CAAC;IAoB7B,IAAW,QAAQ,YAA6B;IAEhD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,eAAe,CAAC,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,eAAe,CAKT;IACd,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO;IA+DA,OAAO,IAAI,IAAI;IAWtB;;;;;OAKG;IACI,sBAAsB,yDAGT;IAEb,cAAc,CAAC,EAAE,EAAE,yBAAyB;IAgB5C,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,yBAAyB;IAiBtF,QAAQ,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BjD,SAAS;IAqBvB;;;;;;OAMG;YACW,mBAAmB;IAuBjC;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAwBxB,oCAAoC;IACpC,OAAO,CAAC,YAAY;IAmFpB,8DAA8D;IACvD,iBAAiB,CAAC,EACrB,MAAM,EACN,GAAG,OAAO,EACb,EAAE,yBAAyB,GAAG,uBAAuB;IAmBtD,6DAA6D;IACtD,gBAAgB,CAAC,EACpB,MAAM,EACN,mBAAuB,EACvB,QAAgB,EAChB,GAAG,OAAO,EACb,EAAE,wBAAwB,GAAG,sBAAsB;IA8BpD,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,sBAAsB;CAMjC"}
1
+ {"version":3,"file":"runningSummarizer.d.ts","sourceRoot":"","sources":["../src/runningSummarizer.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ var __rest = (this && this.__rest) || function (s, e) {
14
14
  return t;
15
15
  };
16
16
  import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/common-utils";
17
+ import { UsageError } from "@fluidframework/container-utils";
17
18
  import { MessageType, } from "@fluidframework/protocol-definitions";
18
19
  import { ChildLogger } from "@fluidframework/telemetry-utils";
19
20
  import { SummarizeHeuristicRunner } from "./summarizerHeuristics";
@@ -280,20 +281,19 @@ export class RunningSummarizer {
280
281
  });
281
282
  }
282
283
  /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
283
- summarizeOnDemand(_a) {
284
+ summarizeOnDemand(resultsBuilder = new SummarizeResultBuilder(), _a) {
284
285
  var { reason } = _a, options = __rest(_a, ["reason"]);
285
286
  if (this.stopping) {
286
- const failBuilder = new SummarizeResultBuilder();
287
- failBuilder.fail("RunningSummarizer stopped or disposed", undefined);
288
- return failBuilder.build();
287
+ resultsBuilder.fail("RunningSummarizer stopped or disposed", undefined);
288
+ return resultsBuilder.build();
289
289
  }
290
290
  // Check for concurrent summary attempts. If one is found,
291
291
  // return a promise that caller can await before trying again.
292
292
  if (this.summarizingLock !== undefined) {
293
293
  // The heuristics are blocking concurrent summarize attempts.
294
- return { alreadyRunning: this.summarizingLock };
294
+ throw new UsageError("Attempted to run an already-running summarizer on demand");
295
295
  }
296
- const result = this.trySummarizeOnce({ summarizeReason: `onDemand/${reason}` }, options, this.cancellationToken);
296
+ const result = this.trySummarizeOnce({ summarizeReason: `onDemand/${reason}` }, options, this.cancellationToken, resultsBuilder);
297
297
  return result;
298
298
  }
299
299
  /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
@@ -1 +1 @@
1
- {"version":3,"file":"runningSummarizer.js","sourceRoot":"","sources":["../src/runningSummarizer.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, ITelemetryLogger, ITelemetryProperties } from \"@fluidframework/common-definitions\";\nimport { assert, delay, Deferred, PromiseTimer } from \"@fluidframework/common-utils\";\nimport {\n ISequencedDocumentMessage,\n ISummaryConfiguration,\n MessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { SummarizeHeuristicRunner } from \"./summarizerHeuristics\";\nimport {\n IEnqueueSummarizeOptions,\n ISummarizeOptions,\n ISummarizeHeuristicData,\n ISummarizeHeuristicRunner,\n ISummarizerOptions,\n OnDemandSummarizeResult,\n IOnDemandSummarizeOptions,\n EnqueueSummarizeResult,\n SummarizerStopReason,\n ISubmitSummaryOptions,\n SubmitSummaryResult,\n ISummaryCancellationToken,\n ISummarizeResults,\n} from \"./summarizerTypes\";\nimport { IClientSummaryWatcher, SummaryCollection } from \"./summaryCollection\";\nimport {\n raceTimer,\n SummarizeReason,\n SummarizeResultBuilder,\n SummaryGenerator,\n} from \"./summaryGenerator\";\n\nconst maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes\n\n/**\n * An instance of RunningSummarizer manages the heuristics for summarizing.\n * Until disposed, the instance of RunningSummarizer can assume that it is\n * in a state of running, meaning it is connected and initialized. It keeps\n * track of summaries that it is generating as they are broadcast and acked/nacked.\n * This object is created and controlled by Summarizer object.\n */\nexport class RunningSummarizer implements IDisposable {\n public static async start(\n logger: ITelemetryLogger,\n summaryWatcher: IClientSummaryWatcher,\n configuration: ISummaryConfiguration,\n submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,\n heuristicData: ISummarizeHeuristicData,\n raiseSummarizingError: (errorCode: string) => void,\n summaryCollection: SummaryCollection,\n cancellationToken: ISummaryCancellationToken,\n stopSummarizerCallback: (reason: SummarizerStopReason) => void,\n options?: Readonly<Partial<ISummarizerOptions>>,\n ): Promise<RunningSummarizer> {\n const summarizer = new RunningSummarizer(\n logger,\n summaryWatcher,\n configuration,\n submitSummaryCallback,\n heuristicData,\n raiseSummarizingError,\n summaryCollection,\n cancellationToken,\n stopSummarizerCallback,\n options);\n\n await summarizer.waitStart();\n\n // Run the heuristics after starting\n summarizer.heuristicRunner?.run();\n return summarizer;\n }\n\n public get disposed() { return this._disposed; }\n\n private stopping = false;\n private _disposed = false;\n private summarizingLock: Promise<void> | undefined;\n private tryWhileSummarizing = false;\n private readonly pendingAckTimer: PromiseTimer;\n private heuristicRunner?: ISummarizeHeuristicRunner;\n private readonly generator: SummaryGenerator;\n private readonly logger: ITelemetryLogger;\n private enqueuedSummary: {\n reason: SummarizeReason;\n afterSequenceNumber: number;\n options: ISummarizeOptions;\n readonly resultsBuilder: SummarizeResultBuilder;\n } | undefined;\n private summarizeCount = 0;\n\n private constructor(\n baseLogger: ITelemetryLogger,\n private readonly summaryWatcher: IClientSummaryWatcher,\n private readonly configuration: ISummaryConfiguration,\n private readonly submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,\n private readonly heuristicData: ISummarizeHeuristicData,\n private readonly raiseSummarizingError: (errorCode: string) => void,\n private readonly summaryCollection: SummaryCollection,\n private readonly cancellationToken: ISummaryCancellationToken,\n private readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,\n { disableHeuristics = false }: Readonly<Partial<ISummarizerOptions>> = {},\n ) {\n this.logger = ChildLogger.create(\n baseLogger, \"Running\", { all: { summaryGenTag: () => this.summarizeCount } });\n\n if (!disableHeuristics) {\n this.heuristicRunner = new SummarizeHeuristicRunner(\n heuristicData,\n configuration,\n (reason) => this.trySummarize(reason));\n }\n\n // Cap the maximum amount of time client will wait for a summarize op ack to maxSummarizeAckWaitTime\n // configuration.maxAckWaitTime is composed from defaults, server values, and runtime overrides\n const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);\n\n this.pendingAckTimer = new PromiseTimer(\n maxAckWaitTime,\n () => {\n this.raiseSummarizingError(\"summaryAckWaitTimeout\");\n // Note: summaryGenTag (from ChildLogger definition) may be 0,\n // since this code path is hit when RunningSummarizer first starts up,\n // before this instance has kicked off a new summarize run.\n this.logger.sendErrorEvent({\n eventName: \"SummaryAckWaitTimeout\",\n maxAckWaitTime,\n referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,\n summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,\n timePending: Date.now() - this.heuristicData.lastAttempt.summaryTime,\n });\n });\n // Set up pending ack timeout by op timestamp differences for previous summaries.\n summaryCollection.setPendingAckTimerTimeoutCallback(maxAckWaitTime, () => {\n if (this.pendingAckTimer.hasTimer) {\n this.logger.sendTelemetryEvent({\n eventName: \"MissingSummaryAckFoundByOps\",\n referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,\n summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,\n });\n this.pendingAckTimer.clear();\n }\n });\n\n this.generator = new SummaryGenerator(\n this.pendingAckTimer,\n this.heuristicData,\n this.submitSummaryCallback,\n this.raiseSummarizingError,\n this.summaryWatcher,\n this.logger,\n );\n }\n\n public dispose(): void {\n this.summaryWatcher.dispose();\n this.heuristicRunner?.dispose();\n this.heuristicRunner = undefined;\n this.generator.dispose();\n this.pendingAckTimer.clear();\n this.disposeEnqueuedSummary();\n this._disposed = true;\n this.stopping = true;\n }\n\n /**\n * RunningSummarizer's logger includes the sequenced index of the current summary on each event.\n * If some other Summarizer code wants that event on their logs they can get it here,\n * but only if they're logging about that same summary.\n * @param summaryOpRefSeq - RefSeq number of the summary op, to ensure the log correlation will be correct\n */\n public tryGetCorrelatedLogger = (summaryOpRefSeq) =>\n this.heuristicData.lastAttempt.refSequenceNumber === summaryOpRefSeq\n ? this.logger\n : undefined;\n\n public handleSystemOp(op: ISequencedDocumentMessage) {\n switch (op.type) {\n case MessageType.ClientLeave:\n case MessageType.ClientJoin:\n case MessageType.Propose:\n case MessageType.Reject: {\n // Synchronously handle quorum ops like regular ops\n this.handleOp(undefined, op);\n return;\n }\n default: {\n return;\n }\n }\n }\n\n public handleOp(error: any, { sequenceNumber, type, clientId, contents }: ISequencedDocumentMessage) {\n if (error !== undefined) {\n return;\n }\n this.heuristicData.lastOpSequenceNumber = sequenceNumber;\n\n if (this.tryRunEnqueuedSummary()) {\n // Intentionally do nothing; check for enqueued on-demand summaries\n } else if (type === MessageType.Save) {\n // Check for ops requesting summary\n // Note: as const is only required until TypeScript version 4.3\n this.trySummarize(`save;${clientId}: ${contents}` as const);\n } else {\n this.heuristicRunner?.run();\n }\n }\n\n public async waitStop(allowLastSummary: boolean): Promise<void> {\n if (this.stopping) {\n return;\n }\n\n this.stopping = true;\n\n this.disposeEnqueuedSummary();\n\n // This will try to run lastSummary if needed.\n if (allowLastSummary && this.heuristicRunner?.shouldRunLastSummary()) {\n if (this.summarizingLock === undefined) {\n this.trySummarizeOnce(\n // summarizeProps\n { summarizeReason: \"lastSummary\" },\n // ISummarizeOptions, using defaults: { refreshLatestAck: false, fullTree: false }\n {});\n }\n }\n\n // Note that trySummarizeOnce() call above returns right away, without waiting.\n // So we need to wait for its completion, otherwise it would be destroyed right away.\n // That said, if summary lock was taken upfront, this wait might wait on multiple retries to\n // submit summary. We should reconsider this flow and make summarizer move to exit faster.\n // This resolves when the current pending summary gets an ack or fails.\n await this.summarizingLock;\n }\n\n private async waitStart() {\n // Wait no longer than ack timeout for all pending\n const waitStartResult = await raceTimer(\n this.summaryWatcher.waitFlushed(),\n this.pendingAckTimer.start(),\n );\n this.pendingAckTimer.clear();\n\n // Remove pending ack wait timeout by op timestamp comparison, because\n // it has race conditions with summaries submitted by this same client.\n this.summaryCollection.unsetPendingAckTimerTimeoutCallback();\n\n if (waitStartResult.result === \"done\" && waitStartResult.value !== undefined) {\n this.heuristicData.initialize({\n refSequenceNumber: waitStartResult.value.summaryOp.referenceSequenceNumber,\n summaryTime: waitStartResult.value.summaryOp.timestamp,\n summarySequenceNumber: waitStartResult.value.summaryOp.sequenceNumber,\n });\n }\n }\n\n /**\n * Runs single summary action that prevents any other concurrent actions.\n * Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)\n * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.\n * @param action - action to perform.\n * @returns - result of action.\n */\n private async lockedSummaryAction<T>(action: () => Promise<T>) {\n assert (this.summarizingLock === undefined, 0x25b /* \"Caller is responsible for checking lock\" */);\n\n const summarizingLock = new Deferred<void>();\n this.summarizingLock = summarizingLock.promise;\n\n this.summarizeCount++;\n\n return action().finally(() => {\n summarizingLock.resolve();\n this.summarizingLock = undefined;\n\n const retry = this.tryWhileSummarizing;\n this.tryWhileSummarizing = false;\n\n // After summarizing, we should check to see if we need to summarize again.\n // Rerun the heuristics and check for enqueued summaries.\n if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {\n this.heuristicRunner?.run();\n }\n });\n }\n\n /**\n * Runs single summarize attempt\n * @param summarizeProps - props to log with each telemetry event associated with this attempt\n * @param options - summary options\n * @param cancellationToken - cancellation token to use to be able to cancel this summary, if needed\n * @param resultsBuilder - optional, result builder to use.\n * @returns ISummarizeResult - result of running a summary.\n */\n private trySummarizeOnce(\n summarizeProps: ITelemetryProperties,\n options: ISummarizeOptions,\n cancellationToken = this.cancellationToken,\n resultsBuilder = new SummarizeResultBuilder()): ISummarizeResults\n {\n this.lockedSummaryAction(async () => {\n const summarizeResult = this.generator.summarize(\n summarizeProps,\n options,\n cancellationToken,\n resultsBuilder);\n // ensure we wait till the end of the process\n return summarizeResult.receivedSummaryAckOrNack;\n }).catch((error) => {\n // SummaryGenerator.summarize() does not throw exceptions - it converts them to failed result\n // on resultsBuilder\n // We do not care about exceptions on receivedSummaryAckOrNack - caller should check results\n // and take a appropriate action.\n });\n\n return resultsBuilder.build();\n }\n\n /** Heuristics summarize attempt. */\n private trySummarize(\n summarizeReason: SummarizeReason,\n cancellationToken = this.cancellationToken): void\n {\n if (this.summarizingLock !== undefined) {\n // lockedSummaryAction() will retry heuristic-based summary at the end of current attempt\n // if it's still needed\n this.tryWhileSummarizing = true;\n return;\n }\n\n this.lockedSummaryAction(async () => {\n const attempts: (ISummarizeOptions & { delaySeconds?: number })[] = [\n { refreshLatestAck: false, fullTree: false },\n { refreshLatestAck: true, fullTree: false },\n { refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },\n { refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },\n ];\n let overrideDelaySeconds: number | undefined;\n let totalAttempts = 0;\n let attemptPerPhase = 0;\n\n let lastResult: { message: string; error: any; } | undefined;\n\n for (let attemptPhase = 0; attemptPhase < attempts.length;) {\n if (this.cancellationToken.cancelled) {\n return;\n }\n\n totalAttempts++;\n attemptPerPhase++;\n\n const { delaySeconds: regularDelaySeconds = 0, ...options } = attempts[attemptPhase];\n const delaySeconds = overrideDelaySeconds ?? regularDelaySeconds;\n\n const summarizeProps: ITelemetryProperties = {\n summarizeReason,\n summarizeTotalAttempts: totalAttempts,\n summarizeAttemptsPerPhase: attemptPerPhase,\n summarizeAttemptPhase: attemptPhase + 1, // make everything 1-based\n ...options,\n };\n\n if (delaySeconds > 0) {\n this.logger.sendPerformanceEvent({\n eventName: \"SummarizeAttemptDelay\",\n duration: delaySeconds,\n reason: overrideDelaySeconds !== undefined ? \"nack with retryAfter\" : undefined,\n ...summarizeProps,\n });\n await delay(delaySeconds * 1000);\n }\n // Note: no need to account for cancellationToken.waitCancelled here, as\n // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.\n const resultSummarize = this.generator.summarize(summarizeProps, options, cancellationToken);\n const result = await resultSummarize.receivedSummaryAckOrNack;\n\n if (result.success) {\n return;\n }\n // Check for retryDelay that can come from summaryNack or upload summary flow.\n // Retry the same step only once per retryAfter response.\n overrideDelaySeconds = result.retryAfterSeconds;\n if (overrideDelaySeconds === undefined || attemptPerPhase > 1) {\n attemptPhase++;\n attemptPerPhase = 0;\n }\n lastResult = result;\n }\n\n // If all attempts failed, log error (with last attempt info) and close the summarizer container\n this.logger.sendErrorEvent({\n eventName: \"FailToSummarize\",\n summarizeReason,\n message: lastResult?.message,\n }, lastResult?.error);\n\n this.stopSummarizerCallback(\"failToSummarize\");\n }).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"UnexpectedSummarizeError\" }, error);\n });\n }\n\n /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */\n public summarizeOnDemand({\n reason,\n ...options\n }: IOnDemandSummarizeOptions): OnDemandSummarizeResult {\n if (this.stopping) {\n const failBuilder = new SummarizeResultBuilder();\n failBuilder.fail(\"RunningSummarizer stopped or disposed\", undefined);\n return failBuilder.build();\n }\n // Check for concurrent summary attempts. If one is found,\n // return a promise that caller can await before trying again.\n if (this.summarizingLock !== undefined) {\n // The heuristics are blocking concurrent summarize attempts.\n return { alreadyRunning: this.summarizingLock };\n }\n const result = this.trySummarizeOnce(\n { summarizeReason: `onDemand/${reason}` },\n options,\n this.cancellationToken);\n return result;\n }\n\n /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */\n public enqueueSummarize({\n reason,\n afterSequenceNumber = 0,\n override = false,\n ...options\n }: IEnqueueSummarizeOptions): EnqueueSummarizeResult {\n const onDemandReason = `enqueue;${reason}` as const;\n let overridden = false;\n if (this.enqueuedSummary !== undefined) {\n if (!override) {\n return { alreadyEnqueued: true };\n }\n // Override existing enqueued summarize attempt.\n this.enqueuedSummary.resultsBuilder.fail(\n \"Aborted; overridden by another enqueue summarize attempt\",\n undefined,\n );\n this.enqueuedSummary = undefined;\n overridden = true;\n }\n this.enqueuedSummary = {\n reason: onDemandReason,\n afterSequenceNumber,\n options,\n resultsBuilder: new SummarizeResultBuilder(),\n };\n const results = this.enqueuedSummary.resultsBuilder.build();\n this.tryRunEnqueuedSummary();\n return overridden ? {\n ...results,\n alreadyEnqueued: true,\n overridden: true,\n } : results;\n }\n\n private tryRunEnqueuedSummary() {\n if (this.stopping) {\n this.disposeEnqueuedSummary();\n return false;\n }\n if (\n this.enqueuedSummary === undefined\n || this.heuristicData.lastOpSequenceNumber < this.enqueuedSummary.afterSequenceNumber\n || this.summarizingLock !== undefined\n ) {\n // If no enqueued summary is ready or a summary is already in progress, take no action.\n return false;\n }\n const { reason, resultsBuilder, options } = this.enqueuedSummary;\n // Set to undefined first, so that subsequent enqueue attempt while summarize will occur later.\n this.enqueuedSummary = undefined;\n this.trySummarizeOnce(\n { summarizeReason: `enqueuedSummary/${reason}` },\n options,\n this.cancellationToken,\n resultsBuilder);\n return true;\n }\n\n private disposeEnqueuedSummary() {\n if (this.enqueuedSummary !== undefined) {\n this.enqueuedSummary.resultsBuilder.fail(\"RunningSummarizer stopped or disposed\", undefined);\n this.enqueuedSummary = undefined;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"runningSummarizer.js","sourceRoot":"","sources":["../src/runningSummarizer.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, ITelemetryLogger, ITelemetryProperties } from \"@fluidframework/common-definitions\";\nimport { assert, delay, Deferred, PromiseTimer } from \"@fluidframework/common-utils\";\nimport { UsageError } from \"@fluidframework/container-utils\";\nimport {\n ISequencedDocumentMessage,\n ISummaryConfiguration,\n MessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { SummarizeHeuristicRunner } from \"./summarizerHeuristics\";\nimport {\n IEnqueueSummarizeOptions,\n ISummarizeOptions,\n ISummarizeHeuristicData,\n ISummarizeHeuristicRunner,\n ISummarizerOptions,\n IOnDemandSummarizeOptions,\n EnqueueSummarizeResult,\n SummarizerStopReason,\n ISubmitSummaryOptions,\n SubmitSummaryResult,\n ISummaryCancellationToken,\n ISummarizeResults,\n} from \"./summarizerTypes\";\nimport { IClientSummaryWatcher, SummaryCollection } from \"./summaryCollection\";\nimport {\n raceTimer,\n SummarizeReason,\n SummarizeResultBuilder,\n SummaryGenerator,\n} from \"./summaryGenerator\";\n\nconst maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes\n\n/**\n * An instance of RunningSummarizer manages the heuristics for summarizing.\n * Until disposed, the instance of RunningSummarizer can assume that it is\n * in a state of running, meaning it is connected and initialized. It keeps\n * track of summaries that it is generating as they are broadcast and acked/nacked.\n * This object is created and controlled by Summarizer object.\n */\nexport class RunningSummarizer implements IDisposable {\n public static async start(\n logger: ITelemetryLogger,\n summaryWatcher: IClientSummaryWatcher,\n configuration: ISummaryConfiguration,\n submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,\n heuristicData: ISummarizeHeuristicData,\n raiseSummarizingError: (errorCode: string) => void,\n summaryCollection: SummaryCollection,\n cancellationToken: ISummaryCancellationToken,\n stopSummarizerCallback: (reason: SummarizerStopReason) => void,\n options?: Readonly<Partial<ISummarizerOptions>>,\n ): Promise<RunningSummarizer> {\n const summarizer = new RunningSummarizer(\n logger,\n summaryWatcher,\n configuration,\n submitSummaryCallback,\n heuristicData,\n raiseSummarizingError,\n summaryCollection,\n cancellationToken,\n stopSummarizerCallback,\n options);\n\n await summarizer.waitStart();\n\n // Run the heuristics after starting\n summarizer.heuristicRunner?.run();\n return summarizer;\n }\n\n public get disposed() { return this._disposed; }\n\n private stopping = false;\n private _disposed = false;\n private summarizingLock: Promise<void> | undefined;\n private tryWhileSummarizing = false;\n private readonly pendingAckTimer: PromiseTimer;\n private heuristicRunner?: ISummarizeHeuristicRunner;\n private readonly generator: SummaryGenerator;\n private readonly logger: ITelemetryLogger;\n private enqueuedSummary: {\n reason: SummarizeReason;\n afterSequenceNumber: number;\n options: ISummarizeOptions;\n readonly resultsBuilder: SummarizeResultBuilder;\n } | undefined;\n private summarizeCount = 0;\n\n private constructor(\n baseLogger: ITelemetryLogger,\n private readonly summaryWatcher: IClientSummaryWatcher,\n private readonly configuration: ISummaryConfiguration,\n private readonly submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,\n private readonly heuristicData: ISummarizeHeuristicData,\n private readonly raiseSummarizingError: (errorCode: string) => void,\n private readonly summaryCollection: SummaryCollection,\n private readonly cancellationToken: ISummaryCancellationToken,\n private readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,\n { disableHeuristics = false }: Readonly<Partial<ISummarizerOptions>> = {},\n ) {\n this.logger = ChildLogger.create(\n baseLogger, \"Running\", { all: { summaryGenTag: () => this.summarizeCount } });\n\n if (!disableHeuristics) {\n this.heuristicRunner = new SummarizeHeuristicRunner(\n heuristicData,\n configuration,\n (reason) => this.trySummarize(reason));\n }\n\n // Cap the maximum amount of time client will wait for a summarize op ack to maxSummarizeAckWaitTime\n // configuration.maxAckWaitTime is composed from defaults, server values, and runtime overrides\n const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);\n\n this.pendingAckTimer = new PromiseTimer(\n maxAckWaitTime,\n () => {\n this.raiseSummarizingError(\"summaryAckWaitTimeout\");\n // Note: summaryGenTag (from ChildLogger definition) may be 0,\n // since this code path is hit when RunningSummarizer first starts up,\n // before this instance has kicked off a new summarize run.\n this.logger.sendErrorEvent({\n eventName: \"SummaryAckWaitTimeout\",\n maxAckWaitTime,\n referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,\n summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,\n timePending: Date.now() - this.heuristicData.lastAttempt.summaryTime,\n });\n });\n // Set up pending ack timeout by op timestamp differences for previous summaries.\n summaryCollection.setPendingAckTimerTimeoutCallback(maxAckWaitTime, () => {\n if (this.pendingAckTimer.hasTimer) {\n this.logger.sendTelemetryEvent({\n eventName: \"MissingSummaryAckFoundByOps\",\n referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,\n summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,\n });\n this.pendingAckTimer.clear();\n }\n });\n\n this.generator = new SummaryGenerator(\n this.pendingAckTimer,\n this.heuristicData,\n this.submitSummaryCallback,\n this.raiseSummarizingError,\n this.summaryWatcher,\n this.logger,\n );\n }\n\n public dispose(): void {\n this.summaryWatcher.dispose();\n this.heuristicRunner?.dispose();\n this.heuristicRunner = undefined;\n this.generator.dispose();\n this.pendingAckTimer.clear();\n this.disposeEnqueuedSummary();\n this._disposed = true;\n this.stopping = true;\n }\n\n /**\n * RunningSummarizer's logger includes the sequenced index of the current summary on each event.\n * If some other Summarizer code wants that event on their logs they can get it here,\n * but only if they're logging about that same summary.\n * @param summaryOpRefSeq - RefSeq number of the summary op, to ensure the log correlation will be correct\n */\n public tryGetCorrelatedLogger = (summaryOpRefSeq) =>\n this.heuristicData.lastAttempt.refSequenceNumber === summaryOpRefSeq\n ? this.logger\n : undefined;\n\n public handleSystemOp(op: ISequencedDocumentMessage) {\n switch (op.type) {\n case MessageType.ClientLeave:\n case MessageType.ClientJoin:\n case MessageType.Propose:\n case MessageType.Reject: {\n // Synchronously handle quorum ops like regular ops\n this.handleOp(undefined, op);\n return;\n }\n default: {\n return;\n }\n }\n }\n\n public handleOp(error: any, { sequenceNumber, type, clientId, contents }: ISequencedDocumentMessage) {\n if (error !== undefined) {\n return;\n }\n this.heuristicData.lastOpSequenceNumber = sequenceNumber;\n\n if (this.tryRunEnqueuedSummary()) {\n // Intentionally do nothing; check for enqueued on-demand summaries\n } else if (type === MessageType.Save) {\n // Check for ops requesting summary\n // Note: as const is only required until TypeScript version 4.3\n this.trySummarize(`save;${clientId}: ${contents}` as const);\n } else {\n this.heuristicRunner?.run();\n }\n }\n\n public async waitStop(allowLastSummary: boolean): Promise<void> {\n if (this.stopping) {\n return;\n }\n\n this.stopping = true;\n\n this.disposeEnqueuedSummary();\n\n // This will try to run lastSummary if needed.\n if (allowLastSummary && this.heuristicRunner?.shouldRunLastSummary()) {\n if (this.summarizingLock === undefined) {\n this.trySummarizeOnce(\n // summarizeProps\n { summarizeReason: \"lastSummary\" },\n // ISummarizeOptions, using defaults: { refreshLatestAck: false, fullTree: false }\n {});\n }\n }\n\n // Note that trySummarizeOnce() call above returns right away, without waiting.\n // So we need to wait for its completion, otherwise it would be destroyed right away.\n // That said, if summary lock was taken upfront, this wait might wait on multiple retries to\n // submit summary. We should reconsider this flow and make summarizer move to exit faster.\n // This resolves when the current pending summary gets an ack or fails.\n await this.summarizingLock;\n }\n\n private async waitStart() {\n // Wait no longer than ack timeout for all pending\n const waitStartResult = await raceTimer(\n this.summaryWatcher.waitFlushed(),\n this.pendingAckTimer.start(),\n );\n this.pendingAckTimer.clear();\n\n // Remove pending ack wait timeout by op timestamp comparison, because\n // it has race conditions with summaries submitted by this same client.\n this.summaryCollection.unsetPendingAckTimerTimeoutCallback();\n\n if (waitStartResult.result === \"done\" && waitStartResult.value !== undefined) {\n this.heuristicData.initialize({\n refSequenceNumber: waitStartResult.value.summaryOp.referenceSequenceNumber,\n summaryTime: waitStartResult.value.summaryOp.timestamp,\n summarySequenceNumber: waitStartResult.value.summaryOp.sequenceNumber,\n });\n }\n }\n\n /**\n * Runs single summary action that prevents any other concurrent actions.\n * Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)\n * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.\n * @param action - action to perform.\n * @returns - result of action.\n */\n private async lockedSummaryAction<T>(action: () => Promise<T>) {\n assert (this.summarizingLock === undefined, 0x25b /* \"Caller is responsible for checking lock\" */);\n\n const summarizingLock = new Deferred<void>();\n this.summarizingLock = summarizingLock.promise;\n\n this.summarizeCount++;\n\n return action().finally(() => {\n summarizingLock.resolve();\n this.summarizingLock = undefined;\n\n const retry = this.tryWhileSummarizing;\n this.tryWhileSummarizing = false;\n\n // After summarizing, we should check to see if we need to summarize again.\n // Rerun the heuristics and check for enqueued summaries.\n if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {\n this.heuristicRunner?.run();\n }\n });\n }\n\n /**\n * Runs single summarize attempt\n * @param summarizeProps - props to log with each telemetry event associated with this attempt\n * @param options - summary options\n * @param cancellationToken - cancellation token to use to be able to cancel this summary, if needed\n * @param resultsBuilder - optional, result builder to use.\n * @returns ISummarizeResult - result of running a summary.\n */\n private trySummarizeOnce(\n summarizeProps: ITelemetryProperties,\n options: ISummarizeOptions,\n cancellationToken = this.cancellationToken,\n resultsBuilder = new SummarizeResultBuilder()): ISummarizeResults\n {\n this.lockedSummaryAction(async () => {\n const summarizeResult = this.generator.summarize(\n summarizeProps,\n options,\n cancellationToken,\n resultsBuilder);\n // ensure we wait till the end of the process\n return summarizeResult.receivedSummaryAckOrNack;\n }).catch((error) => {\n // SummaryGenerator.summarize() does not throw exceptions - it converts them to failed result\n // on resultsBuilder\n // We do not care about exceptions on receivedSummaryAckOrNack - caller should check results\n // and take a appropriate action.\n });\n\n return resultsBuilder.build();\n }\n\n /** Heuristics summarize attempt. */\n private trySummarize(\n summarizeReason: SummarizeReason,\n cancellationToken = this.cancellationToken): void\n {\n if (this.summarizingLock !== undefined) {\n // lockedSummaryAction() will retry heuristic-based summary at the end of current attempt\n // if it's still needed\n this.tryWhileSummarizing = true;\n return;\n }\n\n this.lockedSummaryAction(async () => {\n const attempts: (ISummarizeOptions & { delaySeconds?: number })[] = [\n { refreshLatestAck: false, fullTree: false },\n { refreshLatestAck: true, fullTree: false },\n { refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },\n { refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },\n ];\n let overrideDelaySeconds: number | undefined;\n let totalAttempts = 0;\n let attemptPerPhase = 0;\n\n let lastResult: { message: string; error: any; } | undefined;\n\n for (let attemptPhase = 0; attemptPhase < attempts.length;) {\n if (this.cancellationToken.cancelled) {\n return;\n }\n\n totalAttempts++;\n attemptPerPhase++;\n\n const { delaySeconds: regularDelaySeconds = 0, ...options } = attempts[attemptPhase];\n const delaySeconds = overrideDelaySeconds ?? regularDelaySeconds;\n\n const summarizeProps: ITelemetryProperties = {\n summarizeReason,\n summarizeTotalAttempts: totalAttempts,\n summarizeAttemptsPerPhase: attemptPerPhase,\n summarizeAttemptPhase: attemptPhase + 1, // make everything 1-based\n ...options,\n };\n\n if (delaySeconds > 0) {\n this.logger.sendPerformanceEvent({\n eventName: \"SummarizeAttemptDelay\",\n duration: delaySeconds,\n reason: overrideDelaySeconds !== undefined ? \"nack with retryAfter\" : undefined,\n ...summarizeProps,\n });\n await delay(delaySeconds * 1000);\n }\n // Note: no need to account for cancellationToken.waitCancelled here, as\n // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.\n const resultSummarize = this.generator.summarize(summarizeProps, options, cancellationToken);\n const result = await resultSummarize.receivedSummaryAckOrNack;\n\n if (result.success) {\n return;\n }\n // Check for retryDelay that can come from summaryNack or upload summary flow.\n // Retry the same step only once per retryAfter response.\n overrideDelaySeconds = result.retryAfterSeconds;\n if (overrideDelaySeconds === undefined || attemptPerPhase > 1) {\n attemptPhase++;\n attemptPerPhase = 0;\n }\n lastResult = result;\n }\n\n // If all attempts failed, log error (with last attempt info) and close the summarizer container\n this.logger.sendErrorEvent({\n eventName: \"FailToSummarize\",\n summarizeReason,\n message: lastResult?.message,\n }, lastResult?.error);\n\n this.stopSummarizerCallback(\"failToSummarize\");\n }).catch((error) => {\n this.logger.sendErrorEvent({ eventName: \"UnexpectedSummarizeError\" }, error);\n });\n }\n\n /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */\n public summarizeOnDemand(\n resultsBuilder: SummarizeResultBuilder = new SummarizeResultBuilder(),\n {\n reason,\n ...options\n }: IOnDemandSummarizeOptions): ISummarizeResults {\n if (this.stopping) {\n resultsBuilder.fail(\"RunningSummarizer stopped or disposed\", undefined);\n return resultsBuilder.build();\n }\n // Check for concurrent summary attempts. If one is found,\n // return a promise that caller can await before trying again.\n if (this.summarizingLock !== undefined) {\n // The heuristics are blocking concurrent summarize attempts.\n throw new UsageError(\"Attempted to run an already-running summarizer on demand\");\n }\n const result = this.trySummarizeOnce(\n { summarizeReason: `onDemand/${reason}` },\n options,\n this.cancellationToken,\n resultsBuilder);\n return result;\n }\n\n /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */\n public enqueueSummarize({\n reason,\n afterSequenceNumber = 0,\n override = false,\n ...options\n }: IEnqueueSummarizeOptions): EnqueueSummarizeResult {\n const onDemandReason = `enqueue;${reason}` as const;\n let overridden = false;\n if (this.enqueuedSummary !== undefined) {\n if (!override) {\n return { alreadyEnqueued: true };\n }\n // Override existing enqueued summarize attempt.\n this.enqueuedSummary.resultsBuilder.fail(\n \"Aborted; overridden by another enqueue summarize attempt\",\n undefined,\n );\n this.enqueuedSummary = undefined;\n overridden = true;\n }\n this.enqueuedSummary = {\n reason: onDemandReason,\n afterSequenceNumber,\n options,\n resultsBuilder: new SummarizeResultBuilder(),\n };\n const results = this.enqueuedSummary.resultsBuilder.build();\n this.tryRunEnqueuedSummary();\n return overridden ? {\n ...results,\n alreadyEnqueued: true,\n overridden: true,\n } : results;\n }\n\n private tryRunEnqueuedSummary() {\n if (this.stopping) {\n this.disposeEnqueuedSummary();\n return false;\n }\n if (\n this.enqueuedSummary === undefined\n || this.heuristicData.lastOpSequenceNumber < this.enqueuedSummary.afterSequenceNumber\n || this.summarizingLock !== undefined\n ) {\n // If no enqueued summary is ready or a summary is already in progress, take no action.\n return false;\n }\n const { reason, resultsBuilder, options } = this.enqueuedSummary;\n // Set to undefined first, so that subsequent enqueue attempt while summarize will occur later.\n this.enqueuedSummary = undefined;\n this.trySummarizeOnce(\n { summarizeReason: `enqueuedSummary/${reason}` },\n options,\n this.cancellationToken,\n resultsBuilder);\n return true;\n }\n\n private disposeEnqueuedSummary() {\n if (this.enqueuedSummary !== undefined) {\n this.enqueuedSummary.resultsBuilder.fail(\"RunningSummarizer stopped or disposed\", undefined);\n this.enqueuedSummary = undefined;\n }\n }\n}\n"]}
@@ -5,8 +5,9 @@
5
5
  /// <reference types="node" />
6
6
  import { EventEmitter } from "events";
7
7
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
8
+ import { ILoader } from "@fluidframework/container-definitions";
8
9
  import { IFluidErrorBase, LoggingError } from "@fluidframework/telemetry-utils";
9
- import { IRequest, IResponse, IFluidHandleContext, IFluidHandle } from "@fluidframework/core-interfaces";
10
+ import { IFluidHandleContext, IFluidHandle } from "@fluidframework/core-interfaces";
10
11
  import { ISummaryConfiguration } from "@fluidframework/protocol-definitions";
11
12
  import { ICancellableSummarizerController } from "./runWhileConnectedCoordinator";
12
13
  import { SummaryCollection } from "./summaryCollection";
@@ -39,13 +40,13 @@ export declare class Summarizer extends EventEmitter implements ISummarizer {
39
40
  readonly summaryCollection: SummaryCollection;
40
41
  private readonly runCoordinatorCreateFn;
41
42
  get IFluidLoadable(): this;
42
- get IFluidRouter(): this;
43
43
  get ISummarizer(): this;
44
44
  private readonly logger;
45
45
  private runningSummarizer?;
46
46
  private systemOpListener?;
47
47
  private opListener?;
48
48
  private _disposed;
49
+ private starting;
49
50
  private readonly innerHandle;
50
51
  get handle(): IFluidHandle<this>;
51
52
  private readonly stopDeferred;
@@ -58,6 +59,16 @@ export declare class Summarizer extends EventEmitter implements ISummarizer {
58
59
  * In practical terms, it's same runtime (this.runtime) with clientType === "summarizer".
59
60
  */
60
61
  internalsProvider: ISummarizerInternalsProvider, handleContext: IFluidHandleContext, summaryCollection: SummaryCollection, runCoordinatorCreateFn: (runtime: IConnectableRuntime) => Promise<ICancellableSummarizerController>);
62
+ /**
63
+ * Creates a Summarizer and its underlying client.
64
+ * Note that different implementations of ILoader will handle the URL differently.
65
+ * ILoader provided by a ContainerRuntime is a RelativeLoader, which will treat URL's
66
+ * starting with "/" as relative to the Container. The general ILoader
67
+ * interface will expect an absolute URL and will not handle "/".
68
+ * @param loader - the loader that resolves the request
69
+ * @param url - the URL used to resolve the container
70
+ */
71
+ static create(loader: ILoader, url: string): Promise<ISummarizer>;
61
72
  run(onBehalfOf: string, options?: Readonly<Partial<ISummarizerOptions>>): Promise<SummarizerStopReason>;
62
73
  /**
63
74
  * Stops the summarizer from running. This will complete
@@ -65,8 +76,17 @@ export declare class Summarizer extends EventEmitter implements ISummarizer {
65
76
  * @param reason - reason code for stopping
66
77
  */
67
78
  stop(reason: SummarizerStopReason): void;
68
- request(request: IRequest): Promise<IResponse>;
69
79
  private runCore;
80
+ /**
81
+ * Put the summarizer in a started state, including creating and initializing the RunningSummarizer.
82
+ * The start request can come either from the SummaryManager (in the auto-summarize case) or from the user
83
+ * (in the on-demand case).
84
+ * @param onBehalfOf - ID of the client that requested that the summarizer start
85
+ * @param runCoordinator - cancellation token
86
+ * @param options - options to forward to the RunningSummarizer
87
+ * @returns - Promise that is fulfilled when the RunningSummarizer is ready
88
+ */
89
+ private start;
70
90
  /**
71
91
  * Disposes of resources after running. This cleanup will
72
92
  * clear any outstanding timers and reset some of the state
@@ -1 +1 @@
1
- {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,OAAO,EAAgB,MAAM,uCAAuC,CAAC;AAI9E,OAAO,EAAe,eAAe,EAAE,YAAY,EAAmB,MAAM,iCAAiC,CAAC;AAC9G,OAAO,EAEH,mBAAmB,EACnB,YAAY,EAEf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEH,qBAAqB,EACxB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EACH,WAAW,EACX,4BAA4B,EAC5B,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,GAAG,CAAC;AAIxC,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,mBAAmB,EAAE,eAAe;IAM5F,QAAQ,CAAC,cAAc,EAAE,MAAM;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO;IAN5B,QAAQ,CAAC,SAAS,sBAAoB;IACtC,QAAQ,CAAC,QAAQ,QAAQ;gBAGrB,YAAY,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,EACtB,MAAM,GAAE,OAAe;IAKpC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAiB,EAAE,MAAM,EAAE,gBAAgB;CAI/F;AAED,eAAO,MAAM,wBAAwB,cACrB,MAAM,UAAU,OAAO,uBAAyD,CAAC;AAEjG;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,YAAa,YAAW,WAAW;IAkB3D;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC;;MAEE;IACF,OAAO,CAAC,QAAQ,CAAC,iBAAiB;aAElB,iBAAiB,EAAE,iBAAiB;IACpD,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IA5B3C,IAAW,cAAc,SAAmB;IAC5C,IAAW,WAAW,SAAmB;IAEzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,gBAAgB,CAAC,CAA0C;IACnE,OAAO,CAAC,UAAU,CAAC,CAAsD;IACzE,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAkB;IAElC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD,IAAW,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,CAA6B;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;gBAGjE,GAAG,EAAE,MAAM;IACX;;OAEG;IACc,OAAO,EAAE,kBAAkB,EAC3B,mBAAmB,EAAE,MAAM,qBAAqB;IACjE;;MAEE;IACe,iBAAiB,EAAE,4BAA4B,EAChE,aAAa,EAAE,mBAAmB,EAClB,iBAAiB,EAAE,iBAAiB,EACnC,sBAAsB,EACnC,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,gCAAgC,CAAC;IAOnF;;;;;;;;OAQG;WACiB,MAAM,CACtB,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBzB,GAAG,CACZ,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAYnF;;;;OAIG;IACI,IAAI,CAAC,MAAM,EAAE,oBAAoB;YAI1B,OAAO;IAiDrB;;;;;;;;OAQG;YACW,KAAK;IAoEnB;;;;;OAKG;IACI,OAAO;IAiBd,SAAgB,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAiDjE;IAEF,SAAgB,gBAAgB,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAK/D;YAEY,iBAAiB;CAuBlC"}
package/lib/summarizer.js CHANGED
@@ -4,11 +4,16 @@
4
4
  */
5
5
  import { EventEmitter } from "events";
6
6
  import { Deferred } from "@fluidframework/common-utils";
7
+ import { LoaderHeader } from "@fluidframework/container-definitions";
8
+ import { UsageError } from "@fluidframework/container-utils";
9
+ import { DriverHeader } from "@fluidframework/driver-definitions";
10
+ import { requestFluidObject } from "@fluidframework/runtime-utils";
7
11
  import { ChildLogger, LoggingError, wrapErrorAndLog } from "@fluidframework/telemetry-utils";
8
- import { create404Response } from "@fluidframework/runtime-utils";
12
+ import { summarizerClientType } from "./summarizerClientElection";
9
13
  import { SummarizerHandle } from "./summarizerHandle";
10
14
  import { RunningSummarizer } from "./runningSummarizer";
11
15
  import { SummarizeHeuristicData } from "./summarizerHeuristics";
16
+ import { SummarizeResultBuilder } from "./summaryGenerator";
12
17
  const summarizingError = "summarizingError";
13
18
  export class SummarizingWarning extends LoggingError {
14
19
  constructor(errorMessage, fluidErrorCode, logged = false) {
@@ -46,16 +51,59 @@ export class Summarizer extends EventEmitter {
46
51
  this.summaryCollection = summaryCollection;
47
52
  this.runCoordinatorCreateFn = runCoordinatorCreateFn;
48
53
  this._disposed = false;
54
+ this.starting = false;
49
55
  this.stopDeferred = new Deferred();
50
56
  this.summarizeOnDemand = (...args) => {
51
- if (this._disposed || this.runningSummarizer === undefined || this.runningSummarizer.disposed) {
52
- throw Error("Summarizer is not running or already disposed.");
57
+ var _a;
58
+ try {
59
+ if (this._disposed || ((_a = this.runningSummarizer) === null || _a === void 0 ? void 0 : _a.disposed)) {
60
+ throw new UsageError("Summarizer is already disposed.");
61
+ }
62
+ if (this.runtime.summarizerClientId !== undefined &&
63
+ this.runtime.summarizerClientId !== this.runtime.clientId) {
64
+ // If there is an elected summarizer, and it's not this one, don't allow on-demand summary.
65
+ // This is to prevent the on-demand summary and heuristic-based summary from stepping on
66
+ // each other.
67
+ throw new UsageError("On-demand summary attempted while an elected summarizer is present");
68
+ }
69
+ const builder = new SummarizeResultBuilder();
70
+ if (this.runningSummarizer) {
71
+ // Summarizer is already running. Go ahead and start.
72
+ return this.runningSummarizer.summarizeOnDemand(builder, ...args);
73
+ }
74
+ // Summarizer isn't running, so we need to start it, which is an async operation.
75
+ // Manage the promise related to creating the cancellation token here.
76
+ // The promises related to starting, summarizing,
77
+ // and submitting are communicated to the caller through the results builder.
78
+ const coordinatorCreateP = this.runCoordinatorCreateFn(this.runtime);
79
+ coordinatorCreateP.then((runCoordinator) => {
80
+ // Successully created the cancellation token. Start the summarizer.
81
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
82
+ const startP = this.start(this.runtime.clientId, runCoordinator, { disableHeuristics: true });
83
+ startP.then(async (runningSummarizer) => {
84
+ // Successfully started the summarizer. Run it.
85
+ runningSummarizer.summarizeOnDemand(builder, ...args);
86
+ // Wait for a command to stop or loss of connectivity before tearing down the summarizer and client.
87
+ const stopReason = await Promise.race([this.stopDeferred.promise, runCoordinator.waitCancelled]);
88
+ await runningSummarizer.waitStop(false);
89
+ runCoordinator.stop(stopReason);
90
+ this.dispose();
91
+ this.runtime.closeFn();
92
+ }).catch((reason) => {
93
+ builder.fail("Failed to start summarizer", reason);
94
+ });
95
+ }).catch((reason) => {
96
+ builder.fail("Failed to create cancellation token", reason);
97
+ });
98
+ return builder.build();
99
+ }
100
+ catch (error) {
101
+ throw SummarizingWarning.wrap(error, "summarizerRun", false /* logged */, this.logger);
53
102
  }
54
- return this.runningSummarizer.summarizeOnDemand(...args);
55
103
  };
56
104
  this.enqueueSummarize = (...args) => {
57
105
  if (this._disposed || this.runningSummarizer === undefined || this.runningSummarizer.disposed) {
58
- throw Error("Summarizer is not running or already disposed.");
106
+ throw new UsageError("Summarizer is not running or already disposed.");
59
107
  }
60
108
  return this.runningSummarizer.enqueueSummarize(...args);
61
109
  };
@@ -63,9 +111,37 @@ export class Summarizer extends EventEmitter {
63
111
  this.innerHandle = new SummarizerHandle(this, url, handleContext);
64
112
  }
65
113
  get IFluidLoadable() { return this; }
66
- get IFluidRouter() { return this; }
67
114
  get ISummarizer() { return this; }
68
115
  get handle() { return this.innerHandle; }
116
+ /**
117
+ * Creates a Summarizer and its underlying client.
118
+ * Note that different implementations of ILoader will handle the URL differently.
119
+ * ILoader provided by a ContainerRuntime is a RelativeLoader, which will treat URL's
120
+ * starting with "/" as relative to the Container. The general ILoader
121
+ * interface will expect an absolute URL and will not handle "/".
122
+ * @param loader - the loader that resolves the request
123
+ * @param url - the URL used to resolve the container
124
+ */
125
+ static async create(loader, url) {
126
+ const request = {
127
+ headers: {
128
+ [LoaderHeader.cache]: false,
129
+ [LoaderHeader.clientDetails]: {
130
+ capabilities: { interactive: false },
131
+ type: summarizerClientType,
132
+ },
133
+ [DriverHeader.summarizingClient]: true,
134
+ [LoaderHeader.reconnect]: false,
135
+ },
136
+ url,
137
+ };
138
+ const resolvedContainer = await loader.resolve(request);
139
+ const fluidObject = await requestFluidObject(resolvedContainer, { url: "_summarizer" });
140
+ if (fluidObject.ISummarizer === undefined) {
141
+ throw new UsageError("Fluid object does not implement ISummarizer");
142
+ }
143
+ return fluidObject.ISummarizer;
144
+ }
69
145
  async run(onBehalfOf, options) {
70
146
  try {
71
147
  return await this.runCore(onBehalfOf, options);
@@ -87,23 +163,7 @@ export class Summarizer extends EventEmitter {
87
163
  stop(reason) {
88
164
  this.stopDeferred.resolve(reason);
89
165
  }
90
- async request(request) {
91
- if (request.url === "/" || request.url === "") {
92
- return {
93
- mimeType: "fluid/object",
94
- status: 200,
95
- value: this,
96
- };
97
- }
98
- return create404Response(request);
99
- }
100
166
  async runCore(onBehalfOf, options) {
101
- // Initialize values and first ack (time is not exact)
102
- this.logger.sendTelemetryEvent({
103
- eventName: "RunningSummarizer",
104
- onBehalfOf,
105
- initSummarySeqNumber: this.runtime.deltaManager.initialSequenceNumber,
106
- });
107
167
  const runCoordinator = await this.runCoordinatorCreateFn(this.runtime);
108
168
  // Wait for either external signal to cancel, or loss of connectivity.
109
169
  const stopP = Promise.race([runCoordinator.waitCancelled, this.stopDeferred.promise]);
@@ -117,10 +177,60 @@ export class Summarizer extends EventEmitter {
117
177
  if (runCoordinator.cancelled) {
118
178
  return runCoordinator.waitCancelled;
119
179
  }
180
+ const runningSummarizer = await this.start(onBehalfOf, runCoordinator, options);
181
+ // Wait for either external signal to cancel, or loss of connectivity.
182
+ const stopReason = await stopP;
183
+ // There are two possible approaches here:
184
+ // 1. Propagate cancellation from this.stopDeferred to runCoordinator. This will ensure that we move to the exit
185
+ // faster, including breaking out of the RunningSummarizer.trySummarize() faster.
186
+ // We could create new coordinator and pass it to waitStop() -> trySummarizeOnce("lastSummary") flow.
187
+ // The con of this approach is that we might cancel active summary, and lastSummary will fail because it
188
+ // did not wait for ack/nack from previous summary. Plus we disregard any 429 kind of info from service
189
+ // that way (i.e. trySummarize() loop might have been waiting for 5 min because storage told us so).
190
+ // In general, it's more wasted resources.
191
+ // 2. We can not do it and make waitStop() do last summary only if there was no active summary. This ensures
192
+ // that client behaves properly (from server POV) and we do not waste resources. But, it may mean we wait
193
+ // substantially longer for trySummarize() retries to play out and thus this summary loop may run into
194
+ // conflict with new summarizer client starting on different client.
195
+ // As of now, #2 is implemented. It's more forward looking, as issue #7279 suggests changing design for new
196
+ // summarizer client to not be created until current summarizer fully moves to exit, and that would reduce
197
+ // cons of #2 substantially.
198
+ // Cleanup after running
199
+ await runningSummarizer.waitStop(!runCoordinator.cancelled /* allowLastSummary */);
200
+ // Propagate reason and ensure that if someone is waiting for cancellation token, they are moving to exit
201
+ runCoordinator.stop(stopReason);
202
+ return stopReason;
203
+ }
204
+ /**
205
+ * Put the summarizer in a started state, including creating and initializing the RunningSummarizer.
206
+ * The start request can come either from the SummaryManager (in the auto-summarize case) or from the user
207
+ * (in the on-demand case).
208
+ * @param onBehalfOf - ID of the client that requested that the summarizer start
209
+ * @param runCoordinator - cancellation token
210
+ * @param options - options to forward to the RunningSummarizer
211
+ * @returns - Promise that is fulfilled when the RunningSummarizer is ready
212
+ */
213
+ async start(onBehalfOf, runCoordinator, options) {
214
+ if (this.runningSummarizer) {
215
+ if (this.runningSummarizer.disposed) {
216
+ throw new UsageError("Starting a disposed summarizer");
217
+ }
218
+ return this.runningSummarizer;
219
+ }
220
+ if (this.starting) {
221
+ throw new UsageError("Attempting to start a summarizer that is already starting");
222
+ }
223
+ this.starting = true;
224
+ // Initialize values and first ack (time is not exact)
225
+ this.logger.sendTelemetryEvent({
226
+ eventName: "RunningSummarizer",
227
+ onBehalfOf,
228
+ initSummarySeqNumber: this.runtime.deltaManager.initialSequenceNumber,
229
+ });
120
230
  // Summarizing container ID (with clientType === "summarizer")
121
231
  const clientId = this.runtime.clientId;
122
232
  if (clientId === undefined) {
123
- throw Error("clientId should be defined if connected.");
233
+ throw new UsageError("clientId should be defined if connected.");
124
234
  }
125
235
  const runningSummarizer = await RunningSummarizer.start(this.logger, this.summaryCollection.createWatcher(clientId), this.configurationGetter(), async (...args) => this.internalsProvider.submitSummary(...args), // submitSummaryCallback
126
236
  new SummarizeHeuristicData(this.runtime.deltaManager.lastSequenceNumber, {
@@ -132,6 +242,7 @@ export class Summarizer extends EventEmitter {
132
242
  }
133
243
  }, this.summaryCollection, runCoordinator /* cancellationToken */, (reason) => runCoordinator.stop(reason), /* stopSummarizerCallback */ options);
134
244
  this.runningSummarizer = runningSummarizer;
245
+ this.starting = false;
135
246
  // Handle summary acks
136
247
  // Note: no exceptions are thrown from handleSummaryAcks handler as it handles all exceptions
137
248
  this.handleSummaryAcks().catch((error) => {
@@ -142,28 +253,7 @@ export class Summarizer extends EventEmitter {
142
253
  this.runtime.deltaManager.inbound.on("op", this.systemOpListener);
143
254
  this.opListener = (error, op) => runningSummarizer.handleOp(error, op);
144
255
  this.runtime.on("batchEnd", this.opListener);
145
- // Wait for either external signal to cancel, or loss of connectivity.
146
- const stopReason = await stopP;
147
- // There are two possible approaches here:
148
- // 1. Propagate cancellation from this.stopDeferred to runCoordinator. This will ensure that we move to the exit
149
- // faster, including breaking out of the RunningSummarizer.trySummarize() faster.
150
- // We could create new coordinator and pass it to waitStop() -> trySummarizeOnce("lastSummary") flow.
151
- // The con of this approach is that we might cancel active summary, and lastSummary will fail because it
152
- // did not wait for ack/nack from previous summary. Plus we disregard any 429 kind of info from service
153
- // that way (i.e. trySummarize() loop might have been waiting for 5 min because storage told us so).
154
- // In general, it's more wasted resources.
155
- // 2. We can not do it and make waitStop() do last summary only if there was no active summary. This ensures
156
- // that client behaves properly (from server POV) and we do not waste resources. But, it may mean we wait
157
- // substantially longer for trySummarize() retries to play out and thus this summary loop may run into
158
- // conflict with new summarizer client starting on different client.
159
- // As of now, #2 is implemented. It's more forward looking, as issue #7279 suggests changing design for new
160
- // summarizer client to not be created until current summarizer fully moves to exit, and that would reduce
161
- // cons of #2 substantially.
162
- // Cleanup after running
163
- await runningSummarizer.waitStop(!runCoordinator.cancelled /* allowLastSummary */);
164
- // Propagate reason and ensure that if someone is waiting for cancellation token, they are moving to exit
165
- runCoordinator.stop(stopReason);
166
- return stopReason;
256
+ return runningSummarizer;
167
257
  }
168
258
  /**
169
259
  * Disposes of resources after running. This cleanup will