@fluidframework/container-runtime 0.55.2 → 0.56.2

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 (84) hide show
  1. package/dist/containerRuntime.d.ts +3 -12
  2. package/dist/containerRuntime.d.ts.map +1 -1
  3. package/dist/containerRuntime.js +24 -38
  4. package/dist/containerRuntime.js.map +1 -1
  5. package/dist/dataStoreContext.d.ts +42 -29
  6. package/dist/dataStoreContext.d.ts.map +1 -1
  7. package/dist/dataStoreContext.js +27 -49
  8. package/dist/dataStoreContext.js.map +1 -1
  9. package/dist/dataStores.d.ts +2 -1
  10. package/dist/dataStores.d.ts.map +1 -1
  11. package/dist/dataStores.js +74 -16
  12. package/dist/dataStores.js.map +1 -1
  13. package/dist/garbageCollection.d.ts +22 -9
  14. package/dist/garbageCollection.d.ts.map +1 -1
  15. package/dist/garbageCollection.js +55 -35
  16. package/dist/garbageCollection.js.map +1 -1
  17. package/dist/index.d.ts +6 -6
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +11 -17
  20. package/dist/index.js.map +1 -1
  21. package/dist/packageVersion.d.ts +1 -1
  22. package/dist/packageVersion.js +1 -1
  23. package/dist/packageVersion.js.map +1 -1
  24. package/dist/runningSummarizer.d.ts.map +1 -1
  25. package/dist/runningSummarizer.js +2 -9
  26. package/dist/runningSummarizer.js.map +1 -1
  27. package/dist/summarizerTypes.d.ts +2 -0
  28. package/dist/summarizerTypes.d.ts.map +1 -1
  29. package/dist/summarizerTypes.js.map +1 -1
  30. package/dist/summaryFormat.d.ts.map +1 -1
  31. package/dist/summaryFormat.js +2 -1
  32. package/dist/summaryFormat.js.map +1 -1
  33. package/dist/summaryGenerator.d.ts +0 -5
  34. package/dist/summaryGenerator.d.ts.map +1 -1
  35. package/dist/summaryGenerator.js +2 -1
  36. package/dist/summaryGenerator.js.map +1 -1
  37. package/garbageCollection.md +33 -0
  38. package/lib/containerRuntime.d.ts +3 -12
  39. package/lib/containerRuntime.d.ts.map +1 -1
  40. package/lib/containerRuntime.js +25 -39
  41. package/lib/containerRuntime.js.map +1 -1
  42. package/lib/dataStoreContext.d.ts +42 -29
  43. package/lib/dataStoreContext.d.ts.map +1 -1
  44. package/lib/dataStoreContext.js +25 -47
  45. package/lib/dataStoreContext.js.map +1 -1
  46. package/lib/dataStores.d.ts +2 -1
  47. package/lib/dataStores.d.ts.map +1 -1
  48. package/lib/dataStores.js +75 -17
  49. package/lib/dataStores.js.map +1 -1
  50. package/lib/garbageCollection.d.ts +22 -9
  51. package/lib/garbageCollection.d.ts.map +1 -1
  52. package/lib/garbageCollection.js +55 -35
  53. package/lib/garbageCollection.js.map +1 -1
  54. package/lib/index.d.ts +6 -6
  55. package/lib/index.d.ts.map +1 -1
  56. package/lib/index.js +5 -6
  57. package/lib/index.js.map +1 -1
  58. package/lib/packageVersion.d.ts +1 -1
  59. package/lib/packageVersion.js +1 -1
  60. package/lib/packageVersion.js.map +1 -1
  61. package/lib/runningSummarizer.d.ts.map +1 -1
  62. package/lib/runningSummarizer.js +2 -9
  63. package/lib/runningSummarizer.js.map +1 -1
  64. package/lib/summarizerTypes.d.ts +2 -0
  65. package/lib/summarizerTypes.d.ts.map +1 -1
  66. package/lib/summarizerTypes.js.map +1 -1
  67. package/lib/summaryFormat.d.ts.map +1 -1
  68. package/lib/summaryFormat.js +2 -1
  69. package/lib/summaryFormat.js.map +1 -1
  70. package/lib/summaryGenerator.d.ts +0 -5
  71. package/lib/summaryGenerator.d.ts.map +1 -1
  72. package/lib/summaryGenerator.js +2 -1
  73. package/lib/summaryGenerator.js.map +1 -1
  74. package/package.json +14 -14
  75. package/src/containerRuntime.ts +38 -42
  76. package/src/dataStoreContext.ts +76 -122
  77. package/src/dataStores.ts +75 -48
  78. package/src/garbageCollection.ts +62 -39
  79. package/src/index.ts +51 -6
  80. package/src/packageVersion.ts +1 -1
  81. package/src/runningSummarizer.ts +2 -7
  82. package/src/summarizerTypes.ts +2 -0
  83. package/src/summaryFormat.ts +2 -1
  84. package/src/summaryGenerator.ts +2 -6
@@ -7,7 +7,7 @@ import { assert, Trace, TypedEventEmitter, unreachableCase, performance, } from
7
7
  import { ChildLogger, raiseConnectedEvent, PerformanceEvent, normalizeError, TaggedLoggerAdapter, loggerToMonitoringContext, } from "@fluidframework/telemetry-utils";
8
8
  import { DriverHeader } from "@fluidframework/driver-definitions";
9
9
  import { readAndParse, BlobAggregationStorage } from "@fluidframework/driver-utils";
10
- import { CreateProcessingError, DataCorruptionError, GenericError, UsageError, extractSafePropertiesFromMessage, } from "@fluidframework/container-utils";
10
+ import { DataCorruptionError, GenericError, UsageError, extractSafePropertiesFromMessage, } from "@fluidframework/container-utils";
11
11
  import { MessageType, SummaryType, } from "@fluidframework/protocol-definitions";
12
12
  import { FlushMode, channelsTreeName, } from "@fluidframework/runtime-definitions";
13
13
  import { addBlobToSummary, addTreeToSummary, convertToSummaryTree, createRootSummarizerNodeWithGC, RequestParser, create404Response, exceptionToResponse, requestFluidObject, responseToException, seqFromTree, convertSummaryTreeToITree, } from "@fluidframework/runtime-utils";
@@ -56,6 +56,7 @@ const DefaultSummaryConfiguration = {
56
56
  // the min of the two will be chosen
57
57
  maxAckWaitTime: 120000,
58
58
  };
59
+ ;
59
60
  // Local storage key to set the default flush mode to TurnBased
60
61
  const turnBasedFlushModeKey = "Fluid.ContainerRuntime.FlushModeTurnBased";
61
62
  export var RuntimeMessage;
@@ -346,6 +347,7 @@ export class ContainerRuntime extends TypedEventEmitter {
346
347
  this._disposed = false;
347
348
  this.dirtyContainer = false;
348
349
  this.emitDirtyDocumentEvent = true;
350
+ this.summarizerWarning = (warning) => this.mc.logger.sendTelemetryEvent({ eventName: "summarizerWarning" }, warning);
349
351
  /**
350
352
  * Used to apply stashed ops at their reference sequence number.
351
353
  * Normal op processing is synchronous, but applying stashed ops is async since the
@@ -367,10 +369,6 @@ export class ContainerRuntime extends TypedEventEmitter {
367
369
  this.closeFn(normalizeError(error));
368
370
  });
369
371
  };
370
- // @deprecated Needs to become private
371
- this.raiseContainerWarning = (warning) => {
372
- this.context.raiseContainerWarning(warning);
373
- };
374
372
  this.summarizeOnDemand = (...args) => {
375
373
  if (this.clientDetails.type === summarizerClientType) {
376
374
  return this.summarizer.summarizeOnDemand(...args);
@@ -457,7 +455,7 @@ export class ContainerRuntime extends TypedEventEmitter {
457
455
  if (this.context.baseSnapshot) {
458
456
  this.summarizerNode.loadBaseSummaryWithoutDifferential(this.context.baseSnapshot);
459
457
  }
460
- this.dataStores = new DataStores(getSummaryForDatastores(context.baseSnapshot, metadata), this, (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg), (id, createParam) => (summarizeInternal, getGCDataFn, getBaseGCDetailsFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam, undefined, getGCDataFn, getBaseGCDetailsFn), (id) => this.summarizerNode.deleteChild(id), this.mc.logger, async () => this.garbageCollector.getDataStoreBaseGCDetails(), (id) => this.garbageCollector.nodeChanged(id), new Map(dataStoreAliasMap));
458
+ this.dataStores = new DataStores(getSummaryForDatastores(context.baseSnapshot, metadata), this, (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg), (id, createParam) => (summarizeInternal, getGCDataFn, getBaseGCDetailsFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam, undefined, getGCDataFn, getBaseGCDetailsFn), (id) => this.summarizerNode.deleteChild(id), this.mc.logger, async () => this.garbageCollector.getDataStoreBaseGCDetails(), (id) => this.garbageCollector.nodeChanged(id), new Map(dataStoreAliasMap), this.garbageCollector.writeDataAtRoot);
461
459
  this.blobManager = new BlobManager(this.handleContext, blobManagerSnapshot, () => this.storage, (blobId) => this.submit(ContainerMessageType.BlobAttach, undefined, undefined, { blobId }), this, this.logger);
462
460
  this.scheduleManager = new ScheduleManager(context.deltaManager, this, ChildLogger.create(this.logger, "ScheduleManager"));
463
461
  this.deltaSender = this.deltaManager;
@@ -510,7 +508,7 @@ export class ContainerRuntime extends TypedEventEmitter {
510
508
  formExponentialFn({ coefficient: 20, initialDelay: 0 })), {
511
509
  initialDelayMs: this.runtimeOptions.summaryOptions.initialSummarizerDelayMs,
512
510
  }, this.runtimeOptions.summaryOptions.summarizerOptions);
513
- this.summaryManager.on("summarizerWarning", this.raiseContainerWarning);
511
+ this.summaryManager.on("summarizerWarning", this.summarizerWarning);
514
512
  this.summaryManager.start();
515
513
  }
516
514
  }
@@ -555,6 +553,7 @@ export class ContainerRuntime extends TypedEventEmitter {
555
553
  static async load(context, registryEntries, requestHandler, runtimeOptions = {}, containerScope = context.scope, existing) {
556
554
  var _a, _b, _c;
557
555
  // If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:
556
+ // back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45
558
557
  const passLogger = (_a = context.taggedLogger) !== null && _a !== void 0 ? _a : new TaggedLoggerAdapter(context.logger);
559
558
  const logger = ChildLogger.create(passLogger, undefined, {
560
559
  all: {
@@ -632,12 +631,6 @@ export class ContainerRuntime extends TypedEventEmitter {
632
631
  }, containerScope, logger, loadExisting, blobManagerSnapshot, requestHandler, storage);
633
632
  return runtime;
634
633
  }
635
- /**
636
- * @deprecated This will be removed in a later release. Deprecated in 0.53
637
- */
638
- get id() {
639
- return this.context.id;
640
- }
641
634
  get options() {
642
635
  return this.context.options;
643
636
  }
@@ -701,13 +694,6 @@ export class ContainerRuntime extends TypedEventEmitter {
701
694
  return Object.assign(Object.assign(Object.assign({}, DefaultSummaryConfiguration), (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.serviceConfiguration) === null || _b === void 0 ? void 0 : _b.summary), (_c = this.runtimeOptions.summaryOptions) === null || _c === void 0 ? void 0 : _c.summaryConfigOverrides);
702
695
  }
703
696
  get disposed() { return this._disposed; }
704
- /**
705
- * True, if GC data should be written at root of the summary tree.
706
- * False, if data stores should write GC blobs in their summary tree.
707
- */
708
- get writeGCDataAtRoot() {
709
- return this.garbageCollector.writeDataAtRoot;
710
- }
711
697
  get summarizer() {
712
698
  assert(this._summarizer !== undefined, 0x257 /* "This is not summarizing container" */);
713
699
  return this._summarizer;
@@ -730,7 +716,7 @@ export class ContainerRuntime extends TypedEventEmitter {
730
716
  attachState: this.attachState,
731
717
  }, error);
732
718
  if (this.summaryManager !== undefined) {
733
- this.summaryManager.off("summarizerWarning", this.raiseContainerWarning);
719
+ this.summaryManager.off("summarizerWarning", this.summarizerWarning);
734
720
  this.summaryManager.dispose();
735
721
  }
736
722
  this.garbageCollector.dispose();
@@ -867,7 +853,7 @@ export class ContainerRuntime extends TypedEventEmitter {
867
853
  });
868
854
  return convertSummaryTreeToITree(summaryResult.summary);
869
855
  }
870
- addContainerBlobsToSummary(summaryTree) {
856
+ addContainerStateToSummary(summaryTree) {
871
857
  var _a;
872
858
  addBlobToSummary(summaryTree, metadataBlobName, JSON.stringify(this.formMetadata()));
873
859
  if (this.chunkMap.size > 0) {
@@ -889,7 +875,7 @@ export class ContainerRuntime extends TypedEventEmitter {
889
875
  const blobsTree = convertToSummaryTree(snapshot, false);
890
876
  addTreeToSummary(summaryTree, blobsTreeName, blobsTree);
891
877
  }
892
- if (this.writeGCDataAtRoot) {
878
+ if (this.garbageCollector.writeDataAtRoot) {
893
879
  const gcSummary = this.garbageCollector.summarize();
894
880
  if (gcSummary !== undefined) {
895
881
  addTreeToSummary(summaryTree, gcTreeKey, gcSummary);
@@ -1077,21 +1063,19 @@ export class ContainerRuntime extends TypedEventEmitter {
1077
1063
  }
1078
1064
  const savedFlushMode = this.flushMode;
1079
1065
  this.setFlushMode(FlushMode.TurnBased);
1080
- try {
1081
- this.trackOrderSequentiallyCalls(callback);
1082
- this.flush();
1083
- this.setFlushMode(savedFlushMode);
1084
- }
1085
- catch (error) {
1086
- this.closeFn(CreateProcessingError(error, "orderSequentially"));
1087
- throw error; // throw the original error for the consumer of the runtime
1088
- }
1066
+ this.trackOrderSequentiallyCalls(callback);
1067
+ this.flush();
1068
+ this.setFlushMode(savedFlushMode);
1089
1069
  }
1090
1070
  trackOrderSequentiallyCalls(callback) {
1091
1071
  try {
1092
1072
  this._orderSequentiallyCalls++;
1093
1073
  callback();
1094
1074
  }
1075
+ catch (error) {
1076
+ this.closeFn(new GenericError("orderSequentiallyCallbackException", error));
1077
+ throw error; // throw the original error for the consumer of the runtime
1078
+ }
1095
1079
  finally {
1096
1080
  this._orderSequentiallyCalls--;
1097
1081
  }
@@ -1121,7 +1105,7 @@ export class ContainerRuntime extends TypedEventEmitter {
1121
1105
  return this.dataStores._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id, isRoot).realize();
1122
1106
  }
1123
1107
  canSendOps() {
1124
- return this.connected && !this.deltaManager.readonly;
1108
+ return this.connected && !this.deltaManager.readOnlyInfo.readonly;
1125
1109
  }
1126
1110
  getQuorum() {
1127
1111
  return this.context.quorum;
@@ -1194,7 +1178,7 @@ export class ContainerRuntime extends TypedEventEmitter {
1194
1178
  // Wrap data store summaries in .channels subtree.
1195
1179
  wrapSummaryInChannelsTree(summarizeResult);
1196
1180
  }
1197
- this.addContainerBlobsToSummary(summarizeResult);
1181
+ this.addContainerStateToSummary(summarizeResult);
1198
1182
  return summarizeResult.summary;
1199
1183
  }
1200
1184
  async getAbsoluteUrl(relativeUrl) {
@@ -1214,13 +1198,14 @@ export class ContainerRuntime extends TypedEventEmitter {
1214
1198
  wrapSummaryInChannelsTree(summarizeResult);
1215
1199
  pathPartsForChildren = [channelsTreeName];
1216
1200
  }
1217
- this.addContainerBlobsToSummary(summarizeResult);
1201
+ this.addContainerStateToSummary(summarizeResult);
1218
1202
  return Object.assign(Object.assign({}, summarizeResult), { id: "", pathPartsForChildren });
1219
1203
  }
1220
1204
  /**
1221
1205
  * Returns a summary of the runtime at the current sequence number.
1222
1206
  */
1223
1207
  async summarize(options) {
1208
+ this.verifyNotClosed();
1224
1209
  const { summaryLogger, fullTree = false, trackState = true, runGC = true, runSweep, fullGC } = options;
1225
1210
  if (runGC) {
1226
1211
  await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC });
@@ -1345,13 +1330,13 @@ export class ContainerRuntime extends TypedEventEmitter {
1345
1330
  }
1346
1331
  const trace = Trace.start();
1347
1332
  let summarizeResult;
1333
+ // If the GC state needs to be reset, we need to force a full tree summary and update the unreferenced
1334
+ // state of all the nodes.
1335
+ const forcedFullTree = this.garbageCollector.summaryStateNeedsReset;
1348
1336
  try {
1349
1337
  summarizeResult = await this.summarize({
1350
1338
  summaryLogger,
1351
- // If the GC version changed since the last summary was submitted, we need to regenerate summary by
1352
- // running full summary. This is used to handle scenarios where we upgrade the GC version because we
1353
- // cannot trust the data from the previous GC version anymore.
1354
- fullTree: fullTree || this.garbageCollector.hasGCVersionChanged,
1339
+ fullTree: fullTree || forcedFullTree,
1355
1340
  trackState: true,
1356
1341
  runGC: this.garbageCollector.shouldRunGC,
1357
1342
  });
@@ -1372,6 +1357,7 @@ export class ContainerRuntime extends TypedEventEmitter {
1372
1357
  summaryTree,
1373
1358
  summaryStats,
1374
1359
  generateDuration: trace.trace().duration,
1360
+ forcedFullTree,
1375
1361
  };
1376
1362
  continueResult = checkContinue();
1377
1363
  if (!continueResult.continue) {