@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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AASjE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAEH,sBAAsB,EAEtB,6BAA6B,EAC7B,qBAAqB,EACxB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EAEvB,MAAM,+BAA+B,CAAC;AASvC,OAAO,EAAE,iBAAiB,EAAkB,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAGH,yBAAyB,EAI5B,MAAM,iBAAiB,CAAC;AAMzB,eAAO,MAAM,SAAS,OAAO,CAAC;AAE9B,eAAO,MAAM,YAAY,SAAS,CAAC;AAcnC,eAAO,MAAM,8BAA8B,QAA2B,CAAC;AAEvE,yEAAyE;AACzE,MAAM,WAAW,QAAQ;IACrB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,wBAAwB,EAAE,MAAM,CAAC;IACjC,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sFAAsF;IACtF,0BAA0B,EAAE,MAAM,CAAC;CACtC;AAED,uDAAuD;AACvD,eAAO,MAAM,UAAU;;;;CAOtB,CAAC;AACF,oBAAY,UAAU,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAapE,qFAAqF;AACrF,MAAM,WAAW,yBAAyB;IACtC,mFAAmF;IACnF,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,0DAA0D;IAC1D,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC7D,oFAAoF;IACpF,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnE,yFAAyF;IACzF,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjD,6EAA6E;IAC7E,8BAA8B,IAAI,MAAM,GAAG,SAAS,CAAC;IACrD,uCAAuC;IACvC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1C,gEAAgE;IAChE,OAAO,CAAC,KAAK,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAClD;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,8DAA8D;IAC9D,QAAQ,CAAC,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD;;;;OAIG;IACH,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,mFAAmF;IACnF,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,+EAA+E;IAC/E,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,kFAAkF;IAClF,cAAc,CACV,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9F,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrB,+DAA+D;IAC/D,SAAS,IAAI,qBAAqB,GAAG,SAAS,CAAC;IAC/C,gFAAgF;IAChF,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC;IACxE,uEAAuE;IACvE,2BAA2B,CAAC,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7G,wGAAwG;IACxG,WAAW,CACP,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,EAC/B,cAAc,CAAC,EAAE,cAAc,GAChC,IAAI,CAAC;IACR,iHAAiH;IACjH,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACvE,OAAO,IAAI,IAAI,CAAC;CACnB;AAuDD;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IAmHlD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,yBAAyB;WAvHhC,MAAM,CAChB,QAAQ,EAAE,yBAAyB,EACnC,SAAS,EAAE,iBAAiB,EAC5B,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAAG,SAAS,EACvE,yBAAyB,EAAE,MAAM,MAAM,GAAG,SAAS,EACnD,YAAY,EAAE,aAAa,GAAG,SAAS,EACvC,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE,gBAAgB,EAC5B,QAAQ,EAAE,OAAO,EACjB,QAAQ,CAAC,EAAE,yBAAyB,GACrC,iBAAiB;IAcpB;;OAEG;IACH,SAAgB,WAAW,EAAE,OAAO,CAAC;IAErC;;OAEG;IACH,SAAgB,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3D;;;;OAIG;IACH,IAAW,uBAAuB,IAAI,MAAM,CAE3C;IAED;;;;;;;OAOG;IACH,IAAW,sBAAsB,IAAI,OAAO,CAG3C;IAED;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IAEvC;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,IAAW,eAAe,IAAI,OAAO,CAEnC;IAEF;;;;;;;;;MASE;IACF,OAAO,CAAC,sBAAsB,CAAkB;IAGhD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAE9C,OAAO,CAAC,sBAAsB,CAAY;IAG1C,OAAO,CAAC,iBAAiB,CAAqC;IAG9D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoC;IAG3E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;IAErD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsD;IAErF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoD;IAE3F,OAAO,CAAC,kBAAkB,CAAC,CAAgC;IAI3D,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAA0B;IAEnE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;IAE/D,SAAS,aACY,OAAO,EAAE,yBAAyB,EAClC,SAAS,EAAE,iBAAiB;IAC7C,8DAA8D;IAC7C,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAAG,SAAS;IACxF,8EAA8E;IAC7D,yBAAyB,EAAE,MAAM,MAAM,GAAG,SAAS,EACpE,YAAY,EAAE,aAAa,GAAG,SAAS,EACvC,gBAAgB,EAAE,gBAAgB,EAClC,UAAU,EAAE,gBAAgB,EAC5B,QAAQ,EAAE,OAAO,EACjB,QAAQ,CAAC,EAAE,yBAAyB;IA0NxC;;;OAGG;IACU,cAAc,CACvB,OAAO,EAAE;QACL,0CAA0C;QAC1C,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAC1B,sDAAsD;QACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,oCAAoC;QACpC,MAAM,CAAC,EAAE,OAAO,CAAC;KACpB,GACF,OAAO,CAAC,QAAQ,CAAC;IA+CpB;;;;OAIG;IACI,SAAS,IAAI,qBAAqB,GAAG,SAAS;IAkBrD;;;OAGG;IACU,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;IAIpF;;;OAGG;IACU,2BAA2B,CACpC,MAAM,EAAE,oBAAoB,EAC5B,gBAAgB,EAAE,gBAAgB,GACnC,OAAO,CAAC,IAAI,CAAC;IAoBhB;;;;;;;OAOG;IACI,WAAW,CACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,EAC/B,cAAc,CAAC,EAAE,cAAc;IAenC;;;;;;OAMG;IACI,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAgB/D,OAAO,IAAI,IAAI;IAOtB;;OAEG;YACW,kCAAkC;IAQhD;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAkD1B;;;;;;;OAOG;IACH,OAAO,CAAC,uBAAuB;IAkD/B;;;;;;;OAOG;IACH,OAAO,CAAC,4BAA4B;IAgDpC;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAsEjC;;OAEG;IACH,OAAO,CAAC,aAAa;CA0CxB"}
1
+ {"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../src/garbageCollection.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,8 @@ const runSweepKey = "Fluid.GarbageCollection.RunSweep";
30
30
  const writeAtRootKey = "Fluid.GarbageCollection.WriteDataAtRoot";
31
31
  // Feature gate key to expire a session after a set period of time.
32
32
  const runSessionExpiry = "Fluid.GarbageCollection.RunSessionExpiry";
33
+ // Feature gate key to log error messages if GC reference validation fails.
34
+ const logUnknownOutboundReferencesKey = "Fluid.GarbageCollection.LogUnknownOutboundReferences";
33
35
  const defaultDeleteTimeoutMs = 7 * 24 * 60 * 60 * 1000; // 7 days
34
36
  exports.defaultSessionExpiryDurationMs = 30 * 24 * 60 * 60 * 1000; // 30 days
35
37
  /** The types of GC nodes in the GC reference graph. */
@@ -90,6 +92,19 @@ class UnreferencedStateTracker {
90
92
  /**
91
93
  * The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains
92
94
  * its state across summaries.
95
+ *
96
+ * Node - represented as nodeId, it's a node on the GC graph
97
+ * Outbound Route - a path from one node to another node, think `nodeA` -> `nodeB`
98
+ * Graph - all nodes with their respective routes
99
+ * GC Graph
100
+ *
101
+ * Node
102
+ * NodeId = "datastore1"
103
+ * / \
104
+ * OutboundRoute OutboundRoute
105
+ * / \
106
+ * Node Node
107
+ * NodeId = "dds1" NodeId = "dds2"
93
108
  */
94
109
  class GarbageCollector {
95
110
  constructor(runtime, gcOptions,
@@ -121,7 +136,7 @@ class GarbageCollector {
121
136
  this.currentGCVersion = GCVersion;
122
137
  // Keeps a list of references (edges in the GC graph) between GC runs. Each entry has a node id and a list of
123
138
  // outbound routes from that node.
124
- this.referencesSinceLastRun = new Map();
139
+ this.newReferencesSinceLastRun = new Map();
125
140
  // Map of node ids to their unreferenced state tracker.
126
141
  this.unreferencedNodesState = new Map();
127
142
  // Keeps track of unreferenced events that are logged for a node. This is used to limit the log generation to one
@@ -255,7 +270,7 @@ class GarbageCollector {
255
270
  }
256
271
  gcNodes[nodeId] = Array.from(nodeData.outboundRoutes);
257
272
  }
258
- this.gcDataFromLastRun = { gcNodes };
273
+ this.previousGCDataFromLastRun = { gcNodes };
259
274
  });
260
275
  // Get the GC details for each node from the GC state in the base summary. This is returned in getBaseGCDetails
261
276
  // which the caller uses to initialize each node's GC state.
@@ -367,11 +382,11 @@ class GarbageCollector {
367
382
  */
368
383
  summarize() {
369
384
  var _a;
370
- if (!this.shouldRunGC || this.gcDataFromLastRun === undefined) {
385
+ if (!this.shouldRunGC || this.previousGCDataFromLastRun === undefined) {
371
386
  return;
372
387
  }
373
388
  const gcState = { gcNodes: {} };
374
- for (const [nodeId, outboundRoutes] of Object.entries(this.gcDataFromLastRun.gcNodes)) {
389
+ for (const [nodeId, outboundRoutes] of Object.entries(this.previousGCDataFromLastRun.gcNodes)) {
375
390
  gcState.gcNodes[nodeId] = {
376
391
  outboundRoutes,
377
392
  unreferencedTimestampMs: (_a = this.unreferencedNodesState.get(nodeId)) === null || _a === void 0 ? void 0 : _a.unreferencedTimestampMs,
@@ -435,9 +450,9 @@ class GarbageCollector {
435
450
  if (!this.shouldRunGC) {
436
451
  return;
437
452
  }
438
- const outboundRoutes = (_a = this.referencesSinceLastRun.get(fromNodePath)) !== null && _a !== void 0 ? _a : [];
453
+ const outboundRoutes = (_a = this.newReferencesSinceLastRun.get(fromNodePath)) !== null && _a !== void 0 ? _a : [];
439
454
  outboundRoutes.push(toNodePath);
440
- this.referencesSinceLastRun.set(fromNodePath, outboundRoutes);
455
+ this.newReferencesSinceLastRun.set(fromNodePath, outboundRoutes);
441
456
  // If the node that got referenced is inactive, log an event as that may indicate use-after-delete.
442
457
  this.logIfInactive("Revived", toNodePath);
443
458
  }
@@ -467,8 +482,8 @@ class GarbageCollector {
467
482
  * @param currentReferenceTimestampMs - The timestamp to be used for unreferenced nodes' timestamp.
468
483
  */
469
484
  updateCurrentState(gcData, gcResult, currentReferenceTimestampMs) {
470
- this.gcDataFromLastRun = garbage_collector_1.cloneGCData(gcData);
471
- this.referencesSinceLastRun.clear();
485
+ this.previousGCDataFromLastRun = garbage_collector_1.cloneGCData(gcData);
486
+ this.newReferencesSinceLastRun.clear();
472
487
  // Iterate through the referenced nodes and stop tracking if they were unreferenced before.
473
488
  for (const nodeId of gcResult.referencedNodeIds) {
474
489
  const nodeStateTracker = this.unreferencedNodesState.get(nodeId);
@@ -511,12 +526,30 @@ class GarbageCollector {
511
526
  * If these nodes are currently unreferenced, they will be assigned new unreferenced state by the current run.
512
527
  */
513
528
  updateStateSinceLastRun(currentGCData) {
514
- // If we haven't run GC before or no references were added since the last run, there is nothing to do.
515
- if (this.gcDataFromLastRun === undefined || this.referencesSinceLastRun.size === 0) {
529
+ // If we haven't run GC before there is nothing to do.
530
+ if (this.previousGCDataFromLastRun === undefined) {
531
+ return;
532
+ }
533
+ // Find any references that haven't been identified correctly.
534
+ const missingExplicitReferences = this.findMissingExplicitReferences(currentGCData, this.previousGCDataFromLastRun, this.newReferencesSinceLastRun);
535
+ // The following log will be enabled once this issue is resolved:
536
+ // https://github.com/microsoft/FluidFramework/issues/8878.
537
+ if (this.mc.config.getBoolean(logUnknownOutboundReferencesKey) === true
538
+ && missingExplicitReferences.length > 0) {
539
+ missingExplicitReferences.forEach((missingExplicitReference) => {
540
+ const event = {
541
+ eventName: "gcUnknownOutboundReferences",
542
+ gcNodeId: missingExplicitReference[0],
543
+ gcRoutes: JSON.stringify(missingExplicitReference[1]),
544
+ };
545
+ this.mc.logger.sendPerformanceEvent(event);
546
+ });
547
+ }
548
+ // No references were added since the last run so we don't have to update reference states of any unreferenced
549
+ // nodes
550
+ if (this.newReferencesSinceLastRun.size === 0) {
516
551
  return;
517
552
  }
518
- // Validate that we have identified all references correctly.
519
- this.validateReferenceCorrectness(currentGCData);
520
553
  /**
521
554
  * Generate a super set of the GC data that contains the nodes and edges from last run, plus any new node and
522
555
  * edges that have been added since then. To do this, combine the GC data from the last run and the current
@@ -532,8 +565,8 @@ class GarbageCollector {
532
565
  * which is tracked by https://github.com/microsoft/FluidFramework/issues/8470.
533
566
  * - A new data store may have "root" DDSs already created and we don't detect them today.
534
567
  */
535
- const gcDataSuperSet = garbage_collector_1.concatGarbageCollectionData(this.gcDataFromLastRun, currentGCData);
536
- this.referencesSinceLastRun.forEach((outboundRoutes, sourceNodeId) => {
568
+ const gcDataSuperSet = garbage_collector_1.concatGarbageCollectionData(this.previousGCDataFromLastRun, currentGCData);
569
+ this.newReferencesSinceLastRun.forEach((outboundRoutes, sourceNodeId) => {
537
570
  if (gcDataSuperSet.gcNodes[sourceNodeId] === undefined) {
538
571
  gcDataSuperSet.gcNodes[sourceNodeId] = outboundRoutes;
539
572
  }
@@ -558,53 +591,44 @@ class GarbageCollector {
558
591
  }
559
592
  }
560
593
  /**
561
- * Validates that all new references are correctly identified and processed. The basic principle for validation is
562
- * that we should not have new references in the reference graph (GC data) that have not been notified to the
563
- * garbage collector via `referenceAdded`.
564
- * We validate that the references in the current reference graph should be a subset of the references in the last
565
- * run's reference graph + references since the last run.
594
+ * Finds all new references or outbound routes in the current graph that haven't been explicitly notified to GC.
595
+ * The principle is that every new reference or outbound route must be notified to GC via the
596
+ * addedOutboundReference method. It it hasn't, its a bug and we want to identify these scenarios.
597
+ *
598
+ * In more simple terms:
599
+ * Missing Explicit References = Current References - Previous References - Explicitly Added References;
600
+ *
566
601
  * @param currentGCData - The GC data (reference graph) from the current GC run.
602
+ * @param previousGCData - The GC data (reference graph) from the previous GC run.
603
+ * @param explicitReferences - New references added explicity between the previous and the current run.
604
+ * @returns - a list of missing explicit references
567
605
  */
568
- validateReferenceCorrectness(currentGCData) {
569
- common_utils_1.assert(this.gcDataFromLastRun !== undefined, 0x2b7);
570
- // Get a list of all the outbound routes (or references) in the current GC data.
571
- const currentReferences = [];
572
- for (const [nodeId, outboundRoutes] of Object.entries(currentGCData.gcNodes)) {
573
- /**
574
- * Remove routes from a child node to its parent which is added implicitly by the runtime. For instance,
575
- * each adds its data store as an outbound route to mark it as referenced if the DDS is referenced.
576
- * We won't get any explicit notification for these references so they must be removed before validation.
577
- */
578
- const explicitRoutes = outboundRoutes.filter((route) => !nodeId.startsWith(route));
579
- currentReferences.push(...explicitRoutes);
580
- }
581
- // Get a list of outbound routes (or references) from the last run's GC data plus references added since the
582
- // last run that were notified via `referenceAdded`.
583
- const explicitReferences = [];
584
- for (const [, outboundRoutes] of Object.entries(this.gcDataFromLastRun.gcNodes)) {
585
- explicitReferences.push(...outboundRoutes);
586
- }
587
- this.referencesSinceLastRun.forEach((outboundRoutes) => {
588
- explicitReferences.push(...outboundRoutes);
589
- });
590
- // Validate that the current reference graph doesn't have references that we are not already aware of. If this
591
- // happens, it might indicate data corruption since we may delete objects prematurely.
592
- currentReferences.forEach((route) => {
593
- // Validate references for data stores only. Currently, layers below data stores don't have GC implemented
594
- // so there is no guarantee their references will be notified.
595
- if (this.runtime.getNodeType(route) === exports.GCNodeType.DataStore && !explicitReferences.includes(route)) {
596
- /**
597
- * The following log will be enabled once this issue is resolved:
598
- * https://github.com/microsoft/FluidFramework/issues/8878.
599
- */
600
- // We should ideally throw a data corruption error here. However, send an error for now until we have
601
- // implemented sweep and have reasonable confidence in the sweep process.
602
- // this.mc.logger.sendErrorEvent({
603
- // eventName: "gcUnknownOutboundRoute",
604
- // route,
605
- // });
606
+ findMissingExplicitReferences(currentGCData, previousGCData, explicitReferences) {
607
+ common_utils_1.assert(previousGCData !== undefined, 0x2b7);
608
+ const currentGraph = Object.entries(currentGCData.gcNodes);
609
+ const missingExplicitReferences = [];
610
+ currentGraph.forEach(([nodeId, currentOutboundRoutes]) => {
611
+ var _a, _b;
612
+ const previousRoutes = (_a = previousGCData.gcNodes[nodeId]) !== null && _a !== void 0 ? _a : [];
613
+ const explicitRoutes = (_b = explicitReferences.get(nodeId)) !== null && _b !== void 0 ? _b : [];
614
+ const missingExplicitRoutes = [];
615
+ currentOutboundRoutes.forEach((route) => {
616
+ const isBlobOrDataStoreRoute = this.runtime.getNodeType(route) === exports.GCNodeType.Blob ||
617
+ this.runtime.getNodeType(route) === exports.GCNodeType.DataStore;
618
+ // Ignore implicitly added DDS routes to their parent datastores
619
+ const notRouteFromDDSToParentDataStore = !nodeId.startsWith(route);
620
+ if (isBlobOrDataStoreRoute &&
621
+ notRouteFromDDSToParentDataStore &&
622
+ (!previousRoutes.includes(route) && !explicitRoutes.includes(route))) {
623
+ missingExplicitRoutes.push(route);
624
+ }
625
+ });
626
+ if (missingExplicitRoutes.length > 0) {
627
+ missingExplicitReferences.push([nodeId, missingExplicitRoutes]);
606
628
  }
607
629
  });
630
+ // Ideally missingExplicitReferences should always have a size 0
631
+ return missingExplicitReferences;
608
632
  }
609
633
  /**
610
634
  * Generates the stats of a garbage collection run from the given results of the run. Also, logs any pending events