@fluidframework/container-runtime 2.0.0-internal.7.0.0 → 2.0.0-internal.7.0.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 (107) hide show
  1. package/dist/blobManager.d.ts +3 -6
  2. package/dist/blobManager.d.ts.map +1 -1
  3. package/dist/blobManager.js +17 -42
  4. package/dist/blobManager.js.map +1 -1
  5. package/dist/containerRuntime.d.ts +5 -4
  6. package/dist/containerRuntime.d.ts.map +1 -1
  7. package/dist/containerRuntime.js +33 -8
  8. package/dist/containerRuntime.js.map +1 -1
  9. package/dist/dataStoreContext.d.ts +1 -0
  10. package/dist/dataStoreContext.d.ts.map +1 -1
  11. package/dist/dataStoreContext.js +39 -34
  12. package/dist/dataStoreContext.js.map +1 -1
  13. package/dist/dataStores.d.ts +0 -16
  14. package/dist/dataStores.d.ts.map +1 -1
  15. package/dist/dataStores.js +0 -48
  16. package/dist/dataStores.js.map +1 -1
  17. package/dist/gc/garbageCollection.d.ts +12 -3
  18. package/dist/gc/garbageCollection.d.ts.map +1 -1
  19. package/dist/gc/garbageCollection.js +41 -18
  20. package/dist/gc/garbageCollection.js.map +1 -1
  21. package/dist/gc/gcConfigs.d.ts +1 -0
  22. package/dist/gc/gcConfigs.d.ts.map +1 -1
  23. package/dist/gc/gcConfigs.js +15 -2
  24. package/dist/gc/gcConfigs.js.map +1 -1
  25. package/dist/gc/gcDefinitions.d.ts +28 -9
  26. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  27. package/dist/gc/gcDefinitions.js +8 -3
  28. package/dist/gc/gcDefinitions.js.map +1 -1
  29. package/dist/gc/gcTelemetry.d.ts +12 -6
  30. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  31. package/dist/gc/gcTelemetry.js +91 -47
  32. package/dist/gc/gcTelemetry.js.map +1 -1
  33. package/dist/gc/index.d.ts +2 -2
  34. package/dist/gc/index.d.ts.map +1 -1
  35. package/dist/gc/index.js +3 -5
  36. package/dist/gc/index.js.map +1 -1
  37. package/dist/opLifecycle/opGroupingManager.d.ts +10 -2
  38. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  39. package/dist/opLifecycle/opGroupingManager.js +23 -3
  40. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  41. package/dist/opLifecycle/outbox.d.ts +0 -1
  42. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  43. package/dist/opLifecycle/outbox.js +2 -1
  44. package/dist/opLifecycle/outbox.js.map +1 -1
  45. package/dist/packageVersion.d.ts +1 -1
  46. package/dist/packageVersion.js +1 -1
  47. package/dist/packageVersion.js.map +1 -1
  48. package/lib/blobManager.d.ts +3 -6
  49. package/lib/blobManager.d.ts.map +1 -1
  50. package/lib/blobManager.js +18 -43
  51. package/lib/blobManager.js.map +1 -1
  52. package/lib/containerRuntime.d.ts +5 -4
  53. package/lib/containerRuntime.d.ts.map +1 -1
  54. package/lib/containerRuntime.js +34 -9
  55. package/lib/containerRuntime.js.map +1 -1
  56. package/lib/dataStoreContext.d.ts +1 -0
  57. package/lib/dataStoreContext.d.ts.map +1 -1
  58. package/lib/dataStoreContext.js +40 -35
  59. package/lib/dataStoreContext.js.map +1 -1
  60. package/lib/dataStores.d.ts +0 -16
  61. package/lib/dataStores.d.ts.map +1 -1
  62. package/lib/dataStores.js +2 -50
  63. package/lib/dataStores.js.map +1 -1
  64. package/lib/gc/garbageCollection.d.ts +12 -3
  65. package/lib/gc/garbageCollection.d.ts.map +1 -1
  66. package/lib/gc/garbageCollection.js +42 -19
  67. package/lib/gc/garbageCollection.js.map +1 -1
  68. package/lib/gc/gcConfigs.d.ts +1 -0
  69. package/lib/gc/gcConfigs.d.ts.map +1 -1
  70. package/lib/gc/gcConfigs.js +17 -4
  71. package/lib/gc/gcConfigs.js.map +1 -1
  72. package/lib/gc/gcDefinitions.d.ts +28 -9
  73. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  74. package/lib/gc/gcDefinitions.js +7 -2
  75. package/lib/gc/gcDefinitions.js.map +1 -1
  76. package/lib/gc/gcTelemetry.d.ts +12 -6
  77. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  78. package/lib/gc/gcTelemetry.js +92 -48
  79. package/lib/gc/gcTelemetry.js.map +1 -1
  80. package/lib/gc/index.d.ts +2 -2
  81. package/lib/gc/index.d.ts.map +1 -1
  82. package/lib/gc/index.js +2 -2
  83. package/lib/gc/index.js.map +1 -1
  84. package/lib/opLifecycle/opGroupingManager.d.ts +10 -2
  85. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  86. package/lib/opLifecycle/opGroupingManager.js +23 -3
  87. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  88. package/lib/opLifecycle/outbox.d.ts +0 -1
  89. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  90. package/lib/opLifecycle/outbox.js +2 -1
  91. package/lib/opLifecycle/outbox.js.map +1 -1
  92. package/lib/packageVersion.d.ts +1 -1
  93. package/lib/packageVersion.js +1 -1
  94. package/lib/packageVersion.js.map +1 -1
  95. package/package.json +15 -18
  96. package/src/blobManager.ts +18 -58
  97. package/src/containerRuntime.ts +50 -18
  98. package/src/dataStoreContext.ts +17 -8
  99. package/src/dataStores.ts +2 -80
  100. package/src/gc/garbageCollection.ts +53 -24
  101. package/src/gc/gcConfigs.ts +28 -4
  102. package/src/gc/gcDefinitions.ts +32 -9
  103. package/src/gc/gcTelemetry.ts +123 -65
  104. package/src/gc/index.ts +2 -4
  105. package/src/opLifecycle/opGroupingManager.ts +34 -2
  106. package/src/opLifecycle/outbox.ts +4 -2
  107. package/src/packageVersion.ts +1 -1
@@ -105,6 +105,7 @@ exports.defaultRuntimeHeaderData = {
105
105
  wait: true,
106
106
  viaHandle: false,
107
107
  allowTombstone: false,
108
+ allowInactive: false,
108
109
  };
109
110
  /**
110
111
  * Available compression algorithms for op compression.
@@ -408,6 +409,14 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
408
409
  ? this.summaryConfiguration.initialSummarizerDelayMs
409
410
  : 0;
410
411
  }
412
+ /** If false, loading or using a Tombstoned object should merely log, not fail */
413
+ get gcTombstoneEnforcementAllowed() {
414
+ return this.garbageCollector.tombstoneEnforcementAllowed;
415
+ }
416
+ /** If true, throw an error when a tombstone data store is used. */
417
+ get gcThrowOnTombstoneUsage() {
418
+ return this.garbageCollector.throwOnTombstoneUsage;
419
+ }
411
420
  /**
412
421
  * @internal
413
422
  */
@@ -512,7 +521,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
512
521
  // Note that we only need to pull the *initial* connected state from the context.
513
522
  // Later updates come through calls to setConnectionState.
514
523
  this._connected = connected;
515
- this.gcTombstoneEnforcementAllowed = (0, gc_1.shouldAllowGcTombstoneEnforcement)(metadata?.gcFeatureMatrix?.tombstoneGeneration /* persisted */, this.runtimeOptions.gcOptions[gc_1.gcTombstoneGenerationOptionName] /* current */);
516
524
  this.mc.logger.sendTelemetryEvent({
517
525
  eventName: "GCFeatureMatrix",
518
526
  metadataValue: JSON.stringify(metadata?.gcFeatureMatrix),
@@ -523,7 +531,12 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
523
531
  this.telemetryDocumentId = metadata?.telemetryDocumentId ?? (0, uuid_1.v4)();
524
532
  this.disableAttachReorder = this.mc.config.getBoolean("Fluid.ContainerRuntime.disableAttachOpReorder");
525
533
  const disableChunking = this.mc.config.getBoolean("Fluid.ContainerRuntime.CompressionChunkingDisabled");
526
- const opGroupingManager = new opLifecycle_1.OpGroupingManager(this.groupedBatchingEnabled);
534
+ const opGroupingManager = new opLifecycle_1.OpGroupingManager({
535
+ groupedBatchingEnabled: this.groupedBatchingEnabled,
536
+ opCountThreshold: this.mc.config.getNumber("Fluid.ContainerRuntime.GroupedBatchingOpCount") ?? 2,
537
+ reentrantBatchGroupingEnabled: this.mc.config.getBoolean("Fluid.ContainerRuntime.GroupedBatchingReentrancy") ??
538
+ true,
539
+ }, this.mc.logger);
527
540
  const opSplitter = new opLifecycle_1.OpSplitter(chunks, this.submitBatchFn, disableChunking === true ? Number.POSITIVE_INFINITY : runtimeOptions.chunkSizeInBytes, runtimeOptions.maxBatchSizeInBytes, this.mc.logger);
528
541
  this.remoteMessageProcessor = new opLifecycle_1.RemoteMessageProcessor(opSplitter, new opLifecycle_1.OpDecompressor(this.mc.logger), opGroupingManager);
529
542
  this.handleContext = new containerHandleContext_1.ContainerFluidHandleContext("", this);
@@ -642,7 +655,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
642
655
  compressionOptions,
643
656
  maxBatchSizeInBytes: runtimeOptions.maxBatchSizeInBytes,
644
657
  disablePartialFlush: disablePartialFlush === true,
645
- enableGroupedBatching: this.groupedBatchingEnabled,
646
658
  },
647
659
  logger: this.mc.logger,
648
660
  groupingManager: opGroupingManager,
@@ -833,7 +845,9 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
833
845
  : (0, runtime_utils_1.create404Response)(request);
834
846
  }
835
847
  else if (requestParser.pathParts.length > 0) {
836
- const dataStore = await this.getDataStoreFromRequest(id, request);
848
+ // Differentiate between requesting the dataStore directly, or one of its children
849
+ const requestForChild = !requestParser.isLeaf(1);
850
+ const dataStore = await this.getDataStoreFromRequest(id, request, requestForChild);
837
851
  const subRequest = requestParser.createSubRequest(1);
838
852
  // We always expect createSubRequest to include a leading slash, but asserting here to protect against
839
853
  // unintentionally modifying the url if that changes.
@@ -855,7 +869,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
855
869
  internalId(maybeAlias) {
856
870
  return this.dataStores.aliases.get(maybeAlias) ?? maybeAlias;
857
871
  }
858
- async getDataStoreFromRequest(id, request) {
872
+ async getDataStoreFromRequest(id, request, requestForChild) {
859
873
  const headerData = {};
860
874
  if (typeof request.headers?.[RuntimeHeaders.wait] === "boolean") {
861
875
  headerData.wait = request.headers[RuntimeHeaders.wait];
@@ -866,15 +880,25 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
866
880
  if (typeof request.headers?.[exports.AllowTombstoneRequestHeaderKey] === "boolean") {
867
881
  headerData.allowTombstone = request.headers[exports.AllowTombstoneRequestHeaderKey];
868
882
  }
883
+ if (typeof request.headers?.[exports.AllowInactiveRequestHeaderKey] === "boolean") {
884
+ headerData.allowInactive = request.headers[exports.AllowInactiveRequestHeaderKey];
885
+ }
886
+ // We allow Tombstone requests for sub-DataStore objects
887
+ if (requestForChild) {
888
+ headerData.allowTombstone = true;
889
+ }
869
890
  await this.dataStores.waitIfPendingAlias(id);
870
891
  const internalId = this.internalId(id);
871
892
  const dataStoreContext = await this.dataStores.getDataStore(internalId, headerData);
872
- const dataStoreChannel = await dataStoreContext.realize();
873
893
  // Remove query params, leading and trailing slashes from the url. This is done to make sure the format is
874
894
  // the same as GC nodes id.
875
895
  const urlWithoutQuery = (0, gc_1.trimLeadingAndTrailingSlashes)(request.url.split("?")[0]);
876
- this.garbageCollector.nodeUpdated(`/${urlWithoutQuery}`, "Loaded", undefined /* timestampMs */, dataStoreContext.packagePath, request?.headers);
877
- return dataStoreChannel;
896
+ // Get the initial snapshot details which contain the data store package path.
897
+ const details = await dataStoreContext.getInitialSnapshotDetails();
898
+ // Note that this will throw if the data store is inactive or tombstoned and throwing on incorrect usage
899
+ // is configured.
900
+ this.garbageCollector.nodeUpdated(`/${urlWithoutQuery}`, "Loaded", undefined /* timestampMs */, details.pkg, request, headerData);
901
+ return dataStoreContext.realize();
878
902
  }
879
903
  /** Adds the container's metadata to the given summary tree. */
880
904
  addMetadataToSummary(summaryTree) {
@@ -1378,6 +1402,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
1378
1402
  if (channel.entryPoint === undefined) {
1379
1403
  throw new telemetry_utils_1.UsageError("entryPoint must be defined on data store runtime for using getAliasedDataStoreEntryPoint");
1380
1404
  }
1405
+ this.garbageCollector.nodeUpdated(`/${internalId}`, "Loaded", undefined /* timestampMs */, context.packagePath);
1381
1406
  return channel.entryPoint;
1382
1407
  }
1383
1408
  createDetachedRootDataStore(pkg, rootDataStoreId) {