@fluidframework/container-runtime 0.59.1001-62246 → 0.59.2000

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 (88) hide show
  1. package/dist/connectionTelemetry.js +1 -1
  2. package/dist/connectionTelemetry.js.map +1 -1
  3. package/dist/containerRuntime.d.ts.map +1 -1
  4. package/dist/containerRuntime.js +6 -6
  5. package/dist/containerRuntime.js.map +1 -1
  6. package/dist/garbageCollection.d.ts +26 -8
  7. package/dist/garbageCollection.d.ts.map +1 -1
  8. package/dist/garbageCollection.js +81 -57
  9. package/dist/garbageCollection.js.map +1 -1
  10. package/dist/orderedClientElection.d.ts +57 -6
  11. package/dist/orderedClientElection.d.ts.map +1 -1
  12. package/dist/orderedClientElection.js +141 -26
  13. package/dist/orderedClientElection.js.map +1 -1
  14. package/dist/packageVersion.d.ts +1 -1
  15. package/dist/packageVersion.d.ts.map +1 -1
  16. package/dist/packageVersion.js +1 -1
  17. package/dist/packageVersion.js.map +1 -1
  18. package/dist/runningSummarizer.d.ts.map +1 -1
  19. package/dist/runningSummarizer.js +11 -10
  20. package/dist/runningSummarizer.js.map +1 -1
  21. package/dist/summarizer.d.ts +1 -0
  22. package/dist/summarizer.d.ts.map +1 -1
  23. package/dist/summarizer.js +8 -4
  24. package/dist/summarizer.js.map +1 -1
  25. package/dist/summarizerClientElection.d.ts +2 -0
  26. package/dist/summarizerClientElection.d.ts.map +1 -1
  27. package/dist/summarizerClientElection.js +15 -2
  28. package/dist/summarizerClientElection.js.map +1 -1
  29. package/dist/summarizerTypes.d.ts +47 -1
  30. package/dist/summarizerTypes.d.ts.map +1 -1
  31. package/dist/summarizerTypes.js.map +1 -1
  32. package/dist/summaryGenerator.d.ts +0 -2
  33. package/dist/summaryGenerator.d.ts.map +1 -1
  34. package/dist/summaryGenerator.js +2 -3
  35. package/dist/summaryGenerator.js.map +1 -1
  36. package/dist/summaryManager.d.ts.map +1 -1
  37. package/dist/summaryManager.js +29 -18
  38. package/dist/summaryManager.js.map +1 -1
  39. package/lib/connectionTelemetry.js +1 -1
  40. package/lib/connectionTelemetry.js.map +1 -1
  41. package/lib/containerRuntime.d.ts.map +1 -1
  42. package/lib/containerRuntime.js +6 -6
  43. package/lib/containerRuntime.js.map +1 -1
  44. package/lib/garbageCollection.d.ts +26 -8
  45. package/lib/garbageCollection.d.ts.map +1 -1
  46. package/lib/garbageCollection.js +81 -57
  47. package/lib/garbageCollection.js.map +1 -1
  48. package/lib/orderedClientElection.d.ts +57 -6
  49. package/lib/orderedClientElection.d.ts.map +1 -1
  50. package/lib/orderedClientElection.js +141 -26
  51. package/lib/orderedClientElection.js.map +1 -1
  52. package/lib/packageVersion.d.ts +1 -1
  53. package/lib/packageVersion.d.ts.map +1 -1
  54. package/lib/packageVersion.js +1 -1
  55. package/lib/packageVersion.js.map +1 -1
  56. package/lib/runningSummarizer.d.ts.map +1 -1
  57. package/lib/runningSummarizer.js +11 -10
  58. package/lib/runningSummarizer.js.map +1 -1
  59. package/lib/summarizer.d.ts +1 -0
  60. package/lib/summarizer.d.ts.map +1 -1
  61. package/lib/summarizer.js +8 -4
  62. package/lib/summarizer.js.map +1 -1
  63. package/lib/summarizerClientElection.d.ts +2 -0
  64. package/lib/summarizerClientElection.d.ts.map +1 -1
  65. package/lib/summarizerClientElection.js +15 -2
  66. package/lib/summarizerClientElection.js.map +1 -1
  67. package/lib/summarizerTypes.d.ts +47 -1
  68. package/lib/summarizerTypes.d.ts.map +1 -1
  69. package/lib/summarizerTypes.js.map +1 -1
  70. package/lib/summaryGenerator.d.ts +0 -2
  71. package/lib/summaryGenerator.d.ts.map +1 -1
  72. package/lib/summaryGenerator.js +2 -3
  73. package/lib/summaryGenerator.js.map +1 -1
  74. package/lib/summaryManager.d.ts.map +1 -1
  75. package/lib/summaryManager.js +29 -18
  76. package/lib/summaryManager.js.map +1 -1
  77. package/package.json +29 -53
  78. package/src/connectionTelemetry.ts +2 -2
  79. package/src/containerRuntime.ts +4 -6
  80. package/src/garbageCollection.ts +96 -61
  81. package/src/orderedClientElection.ts +155 -25
  82. package/src/packageVersion.ts +1 -1
  83. package/src/runningSummarizer.ts +13 -10
  84. package/src/summarizer.ts +9 -4
  85. package/src/summarizerClientElection.ts +15 -2
  86. package/src/summarizerTypes.ts +60 -1
  87. package/src/summaryGenerator.ts +3 -51
  88. package/src/summaryManager.ts +32 -23
@@ -96,6 +96,19 @@ export interface IGarbageCollector {
96
96
  /**
97
97
  * The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains
98
98
  * its state across summaries.
99
+ *
100
+ * Node - represented as nodeId, it's a node on the GC graph
101
+ * Outbound Route - a path from one node to another node, think `nodeA` -> `nodeB`
102
+ * Graph - all nodes with their respective routes
103
+ * GC Graph
104
+ *
105
+ * Node
106
+ * NodeId = "datastore1"
107
+ * / \
108
+ * OutboundRoute OutboundRoute
109
+ * / \
110
+ * Node Node
111
+ * NodeId = "dds1" NodeId = "dds2"
99
112
  */
100
113
  export declare class GarbageCollector implements IGarbageCollector {
101
114
  private readonly runtime;
@@ -154,8 +167,8 @@ export declare class GarbageCollector implements IGarbageCollector {
154
167
  private initialStateNeedsReset;
155
168
  private readonly currentGCVersion;
156
169
  private latestSummaryGCVersion;
157
- private gcDataFromLastRun;
158
- private readonly referencesSinceLastRun;
170
+ private previousGCDataFromLastRun;
171
+ private readonly newReferencesSinceLastRun;
159
172
  private readonly initializeBaseStateP;
160
173
  private readonly baseGCDetailsP;
161
174
  private readonly deleteTimeoutMs;
@@ -238,14 +251,19 @@ export declare class GarbageCollector implements IGarbageCollector {
238
251
  */
239
252
  private updateStateSinceLastRun;
240
253
  /**
241
- * Validates that all new references are correctly identified and processed. The basic principle for validation is
242
- * that we should not have new references in the reference graph (GC data) that have not been notified to the
243
- * garbage collector via `referenceAdded`.
244
- * We validate that the references in the current reference graph should be a subset of the references in the last
245
- * run's reference graph + references since the last run.
254
+ * Finds all new references or outbound routes in the current graph that haven't been explicitly notified to GC.
255
+ * The principle is that every new reference or outbound route must be notified to GC via the
256
+ * addedOutboundReference method. It it hasn't, its a bug and we want to identify these scenarios.
257
+ *
258
+ * In more simple terms:
259
+ * Missing Explicit References = Current References - Previous References - Explicitly Added References;
260
+ *
246
261
  * @param currentGCData - The GC data (reference graph) from the current GC run.
262
+ * @param previousGCData - The GC data (reference graph) from the previous GC run.
263
+ * @param explicitReferences - New references added explicity between the previous and the current run.
264
+ * @returns - a list of missing explicit references
247
265
  */
248
- private validateReferenceCorrectness;
266
+ private findMissingExplicitReferences;
249
267
  /**
250
268
  * Generates the stats of a garbage collection run from the given results of the run. Also, logs any pending events
251
269
  * in the pendingEventsQueue. This should be called before updating the current state because it generates stats
@@ -1 +1 @@
1
- {"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../src/garbageCollection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../src/garbageCollection.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,8 @@ const runSweepKey = "Fluid.GarbageCollection.RunSweep";
27
27
  const writeAtRootKey = "Fluid.GarbageCollection.WriteDataAtRoot";
28
28
  // Feature gate key to expire a session after a set period of time.
29
29
  const runSessionExpiry = "Fluid.GarbageCollection.RunSessionExpiry";
30
+ // Feature gate key to log error messages if GC reference validation fails.
31
+ const logUnknownOutboundReferencesKey = "Fluid.GarbageCollection.LogUnknownOutboundReferences";
30
32
  const defaultDeleteTimeoutMs = 7 * 24 * 60 * 60 * 1000; // 7 days
31
33
  export const defaultSessionExpiryDurationMs = 30 * 24 * 60 * 60 * 1000; // 30 days
32
34
  /** The types of GC nodes in the GC reference graph. */
@@ -87,6 +89,19 @@ class UnreferencedStateTracker {
87
89
  /**
88
90
  * The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains
89
91
  * its state across summaries.
92
+ *
93
+ * Node - represented as nodeId, it's a node on the GC graph
94
+ * Outbound Route - a path from one node to another node, think `nodeA` -> `nodeB`
95
+ * Graph - all nodes with their respective routes
96
+ * GC Graph
97
+ *
98
+ * Node
99
+ * NodeId = "datastore1"
100
+ * / \
101
+ * OutboundRoute OutboundRoute
102
+ * / \
103
+ * Node Node
104
+ * NodeId = "dds1" NodeId = "dds2"
90
105
  */
91
106
  export class GarbageCollector {
92
107
  constructor(runtime, gcOptions,
@@ -118,7 +133,7 @@ export class GarbageCollector {
118
133
  this.currentGCVersion = GCVersion;
119
134
  // Keeps a list of references (edges in the GC graph) between GC runs. Each entry has a node id and a list of
120
135
  // outbound routes from that node.
121
- this.referencesSinceLastRun = new Map();
136
+ this.newReferencesSinceLastRun = new Map();
122
137
  // Map of node ids to their unreferenced state tracker.
123
138
  this.unreferencedNodesState = new Map();
124
139
  // Keeps track of unreferenced events that are logged for a node. This is used to limit the log generation to one
@@ -252,7 +267,7 @@ export class GarbageCollector {
252
267
  }
253
268
  gcNodes[nodeId] = Array.from(nodeData.outboundRoutes);
254
269
  }
255
- this.gcDataFromLastRun = { gcNodes };
270
+ this.previousGCDataFromLastRun = { gcNodes };
256
271
  });
257
272
  // Get the GC details for each node from the GC state in the base summary. This is returned in getBaseGCDetails
258
273
  // which the caller uses to initialize each node's GC state.
@@ -364,11 +379,11 @@ export class GarbageCollector {
364
379
  */
365
380
  summarize() {
366
381
  var _a;
367
- if (!this.shouldRunGC || this.gcDataFromLastRun === undefined) {
382
+ if (!this.shouldRunGC || this.previousGCDataFromLastRun === undefined) {
368
383
  return;
369
384
  }
370
385
  const gcState = { gcNodes: {} };
371
- for (const [nodeId, outboundRoutes] of Object.entries(this.gcDataFromLastRun.gcNodes)) {
386
+ for (const [nodeId, outboundRoutes] of Object.entries(this.previousGCDataFromLastRun.gcNodes)) {
372
387
  gcState.gcNodes[nodeId] = {
373
388
  outboundRoutes,
374
389
  unreferencedTimestampMs: (_a = this.unreferencedNodesState.get(nodeId)) === null || _a === void 0 ? void 0 : _a.unreferencedTimestampMs,
@@ -432,9 +447,9 @@ export class GarbageCollector {
432
447
  if (!this.shouldRunGC) {
433
448
  return;
434
449
  }
435
- const outboundRoutes = (_a = this.referencesSinceLastRun.get(fromNodePath)) !== null && _a !== void 0 ? _a : [];
450
+ const outboundRoutes = (_a = this.newReferencesSinceLastRun.get(fromNodePath)) !== null && _a !== void 0 ? _a : [];
436
451
  outboundRoutes.push(toNodePath);
437
- this.referencesSinceLastRun.set(fromNodePath, outboundRoutes);
452
+ this.newReferencesSinceLastRun.set(fromNodePath, outboundRoutes);
438
453
  // If the node that got referenced is inactive, log an event as that may indicate use-after-delete.
439
454
  this.logIfInactive("Revived", toNodePath);
440
455
  }
@@ -464,8 +479,8 @@ export class GarbageCollector {
464
479
  * @param currentReferenceTimestampMs - The timestamp to be used for unreferenced nodes' timestamp.
465
480
  */
466
481
  updateCurrentState(gcData, gcResult, currentReferenceTimestampMs) {
467
- this.gcDataFromLastRun = cloneGCData(gcData);
468
- this.referencesSinceLastRun.clear();
482
+ this.previousGCDataFromLastRun = cloneGCData(gcData);
483
+ this.newReferencesSinceLastRun.clear();
469
484
  // Iterate through the referenced nodes and stop tracking if they were unreferenced before.
470
485
  for (const nodeId of gcResult.referencedNodeIds) {
471
486
  const nodeStateTracker = this.unreferencedNodesState.get(nodeId);
@@ -508,12 +523,30 @@ export class GarbageCollector {
508
523
  * If these nodes are currently unreferenced, they will be assigned new unreferenced state by the current run.
509
524
  */
510
525
  updateStateSinceLastRun(currentGCData) {
511
- // If we haven't run GC before or no references were added since the last run, there is nothing to do.
512
- if (this.gcDataFromLastRun === undefined || this.referencesSinceLastRun.size === 0) {
526
+ // If we haven't run GC before there is nothing to do.
527
+ if (this.previousGCDataFromLastRun === undefined) {
528
+ return;
529
+ }
530
+ // Find any references that haven't been identified correctly.
531
+ const missingExplicitReferences = this.findMissingExplicitReferences(currentGCData, this.previousGCDataFromLastRun, this.newReferencesSinceLastRun);
532
+ // The following log will be enabled once this issue is resolved:
533
+ // https://github.com/microsoft/FluidFramework/issues/8878.
534
+ if (this.mc.config.getBoolean(logUnknownOutboundReferencesKey) === true
535
+ && missingExplicitReferences.length > 0) {
536
+ missingExplicitReferences.forEach((missingExplicitReference) => {
537
+ const event = {
538
+ eventName: "gcUnknownOutboundReferences",
539
+ gcNodeId: missingExplicitReference[0],
540
+ gcRoutes: JSON.stringify(missingExplicitReference[1]),
541
+ };
542
+ this.mc.logger.sendPerformanceEvent(event);
543
+ });
544
+ }
545
+ // No references were added since the last run so we don't have to update reference states of any unreferenced
546
+ // nodes
547
+ if (this.newReferencesSinceLastRun.size === 0) {
513
548
  return;
514
549
  }
515
- // Validate that we have identified all references correctly.
516
- this.validateReferenceCorrectness(currentGCData);
517
550
  /**
518
551
  * Generate a super set of the GC data that contains the nodes and edges from last run, plus any new node and
519
552
  * edges that have been added since then. To do this, combine the GC data from the last run and the current
@@ -529,8 +562,8 @@ export class GarbageCollector {
529
562
  * which is tracked by https://github.com/microsoft/FluidFramework/issues/8470.
530
563
  * - A new data store may have "root" DDSs already created and we don't detect them today.
531
564
  */
532
- const gcDataSuperSet = concatGarbageCollectionData(this.gcDataFromLastRun, currentGCData);
533
- this.referencesSinceLastRun.forEach((outboundRoutes, sourceNodeId) => {
565
+ const gcDataSuperSet = concatGarbageCollectionData(this.previousGCDataFromLastRun, currentGCData);
566
+ this.newReferencesSinceLastRun.forEach((outboundRoutes, sourceNodeId) => {
534
567
  if (gcDataSuperSet.gcNodes[sourceNodeId] === undefined) {
535
568
  gcDataSuperSet.gcNodes[sourceNodeId] = outboundRoutes;
536
569
  }
@@ -555,53 +588,44 @@ export class GarbageCollector {
555
588
  }
556
589
  }
557
590
  /**
558
- * Validates that all new references are correctly identified and processed. The basic principle for validation is
559
- * that we should not have new references in the reference graph (GC data) that have not been notified to the
560
- * garbage collector via `referenceAdded`.
561
- * We validate that the references in the current reference graph should be a subset of the references in the last
562
- * run's reference graph + references since the last run.
591
+ * Finds all new references or outbound routes in the current graph that haven't been explicitly notified to GC.
592
+ * The principle is that every new reference or outbound route must be notified to GC via the
593
+ * addedOutboundReference method. It it hasn't, its a bug and we want to identify these scenarios.
594
+ *
595
+ * In more simple terms:
596
+ * Missing Explicit References = Current References - Previous References - Explicitly Added References;
597
+ *
563
598
  * @param currentGCData - The GC data (reference graph) from the current GC run.
599
+ * @param previousGCData - The GC data (reference graph) from the previous GC run.
600
+ * @param explicitReferences - New references added explicity between the previous and the current run.
601
+ * @returns - a list of missing explicit references
564
602
  */
565
- validateReferenceCorrectness(currentGCData) {
566
- assert(this.gcDataFromLastRun !== undefined, 0x2b7);
567
- // Get a list of all the outbound routes (or references) in the current GC data.
568
- const currentReferences = [];
569
- for (const [nodeId, outboundRoutes] of Object.entries(currentGCData.gcNodes)) {
570
- /**
571
- * Remove routes from a child node to its parent which is added implicitly by the runtime. For instance,
572
- * each adds its data store as an outbound route to mark it as referenced if the DDS is referenced.
573
- * We won't get any explicit notification for these references so they must be removed before validation.
574
- */
575
- const explicitRoutes = outboundRoutes.filter((route) => !nodeId.startsWith(route));
576
- currentReferences.push(...explicitRoutes);
577
- }
578
- // Get a list of outbound routes (or references) from the last run's GC data plus references added since the
579
- // last run that were notified via `referenceAdded`.
580
- const explicitReferences = [];
581
- for (const [, outboundRoutes] of Object.entries(this.gcDataFromLastRun.gcNodes)) {
582
- explicitReferences.push(...outboundRoutes);
583
- }
584
- this.referencesSinceLastRun.forEach((outboundRoutes) => {
585
- explicitReferences.push(...outboundRoutes);
586
- });
587
- // Validate that the current reference graph doesn't have references that we are not already aware of. If this
588
- // happens, it might indicate data corruption since we may delete objects prematurely.
589
- currentReferences.forEach((route) => {
590
- // Validate references for data stores only. Currently, layers below data stores don't have GC implemented
591
- // so there is no guarantee their references will be notified.
592
- if (this.runtime.getNodeType(route) === GCNodeType.DataStore && !explicitReferences.includes(route)) {
593
- /**
594
- * The following log will be enabled once this issue is resolved:
595
- * https://github.com/microsoft/FluidFramework/issues/8878.
596
- */
597
- // We should ideally throw a data corruption error here. However, send an error for now until we have
598
- // implemented sweep and have reasonable confidence in the sweep process.
599
- // this.mc.logger.sendErrorEvent({
600
- // eventName: "gcUnknownOutboundRoute",
601
- // route,
602
- // });
603
+ findMissingExplicitReferences(currentGCData, previousGCData, explicitReferences) {
604
+ assert(previousGCData !== undefined, 0x2b7);
605
+ const currentGraph = Object.entries(currentGCData.gcNodes);
606
+ const missingExplicitReferences = [];
607
+ currentGraph.forEach(([nodeId, currentOutboundRoutes]) => {
608
+ var _a, _b;
609
+ const previousRoutes = (_a = previousGCData.gcNodes[nodeId]) !== null && _a !== void 0 ? _a : [];
610
+ const explicitRoutes = (_b = explicitReferences.get(nodeId)) !== null && _b !== void 0 ? _b : [];
611
+ const missingExplicitRoutes = [];
612
+ currentOutboundRoutes.forEach((route) => {
613
+ const isBlobOrDataStoreRoute = this.runtime.getNodeType(route) === GCNodeType.Blob ||
614
+ this.runtime.getNodeType(route) === GCNodeType.DataStore;
615
+ // Ignore implicitly added DDS routes to their parent datastores
616
+ const notRouteFromDDSToParentDataStore = !nodeId.startsWith(route);
617
+ if (isBlobOrDataStoreRoute &&
618
+ notRouteFromDDSToParentDataStore &&
619
+ (!previousRoutes.includes(route) && !explicitRoutes.includes(route))) {
620
+ missingExplicitRoutes.push(route);
621
+ }
622
+ });
623
+ if (missingExplicitRoutes.length > 0) {
624
+ missingExplicitReferences.push([nodeId, missingExplicitRoutes]);
603
625
  }
604
626
  });
627
+ // Ideally missingExplicitReferences should always have a size 0
628
+ return missingExplicitReferences;
605
629
  }
606
630
  /**
607
631
  * Generates the stats of a garbage collection run from the given results of the run. Also, logs any pending events