@fluidframework/container-runtime 0.58.2002 → 0.59.1000
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.
- package/dist/blobManager.d.ts +15 -2
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +65 -9
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +63 -23
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +39 -7
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +161 -29
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +8 -1
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +9 -3
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +22 -6
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +13 -5
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +39 -18
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaScheduler.d.ts +4 -5
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +54 -35
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/garbageCollection.d.ts +31 -27
- package/dist/garbageCollection.d.ts.map +1 -1
- package/dist/garbageCollection.js +76 -75
- package/dist/garbageCollection.js.map +1 -1
- package/dist/opTelemetry.d.ts +22 -0
- package/dist/opTelemetry.d.ts.map +1 -0
- package/dist/opTelemetry.js +59 -0
- package/dist/opTelemetry.js.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/summarizerTypes.d.ts +9 -0
- package/dist/summarizerTypes.d.ts.map +1 -1
- package/dist/summarizerTypes.js.map +1 -1
- package/dist/summaryGenerator.d.ts.map +1 -1
- package/dist/summaryGenerator.js +1 -1
- package/dist/summaryGenerator.js.map +1 -1
- package/lib/blobManager.d.ts +15 -2
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +66 -10
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +63 -23
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +39 -7
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +163 -31
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +8 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +9 -3
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +22 -6
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +13 -5
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +39 -18
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaScheduler.d.ts +4 -5
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +54 -35
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/garbageCollection.d.ts +31 -27
- package/lib/garbageCollection.d.ts.map +1 -1
- package/lib/garbageCollection.js +75 -74
- package/lib/garbageCollection.js.map +1 -1
- package/lib/opTelemetry.d.ts +22 -0
- package/lib/opTelemetry.d.ts.map +1 -0
- package/lib/opTelemetry.js +55 -0
- package/lib/opTelemetry.js.map +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/summarizerTypes.d.ts +9 -0
- package/lib/summarizerTypes.d.ts.map +1 -1
- package/lib/summarizerTypes.js.map +1 -1
- package/lib/summaryGenerator.d.ts.map +1 -1
- package/lib/summaryGenerator.js +1 -1
- package/lib/summaryGenerator.js.map +1 -1
- package/package.json +63 -19
- package/src/blobManager.ts +78 -11
- package/src/connectionTelemetry.ts +110 -19
- package/src/containerRuntime.ts +191 -36
- package/src/dataStore.ts +7 -1
- package/src/dataStoreContext.ts +22 -7
- package/src/dataStores.ts +40 -19
- package/src/deltaScheduler.ts +65 -39
- package/src/garbageCollection.ts +92 -78
- package/src/opTelemetry.ts +71 -0
- package/src/packageVersion.ts +1 -1
- package/src/summarizerTypes.ts +9 -0
- package/src/summaryGenerator.ts +9 -1
|
@@ -19,15 +19,28 @@ export interface IGCStats {
|
|
|
19
19
|
nodeCount: number;
|
|
20
20
|
/** The number of data stores in the container. */
|
|
21
21
|
dataStoreCount: number;
|
|
22
|
+
/** The number of attachment blobs in the container. */
|
|
23
|
+
attachmentBlobCount: number;
|
|
22
24
|
/** The number of unreferenced nodes in the container. */
|
|
23
25
|
unrefNodeCount: number;
|
|
24
26
|
/** The number of unreferenced data stores in the container. */
|
|
25
27
|
unrefDataStoreCount: number;
|
|
28
|
+
/** The number of unreferenced attachment blobs in the container. */
|
|
29
|
+
unrefAttachmentBlobCount: number;
|
|
26
30
|
/** The number of nodes whose reference state updated since last GC run. */
|
|
27
31
|
updatedNodeCount: number;
|
|
28
32
|
/** The number of data stores whose reference state updated since last GC run. */
|
|
29
33
|
updatedDataStoreCount: number;
|
|
34
|
+
/** The number of attachment blobs whose reference state updated since last GC run. */
|
|
35
|
+
updatedAttachmentBlobCount: number;
|
|
30
36
|
}
|
|
37
|
+
/** The types of GC nodes in the GC reference graph. */
|
|
38
|
+
export declare const GCNodeType: {
|
|
39
|
+
DataStore: string;
|
|
40
|
+
Blob: string;
|
|
41
|
+
Other: string;
|
|
42
|
+
};
|
|
43
|
+
export declare type GCNodeType = typeof GCNodeType[keyof typeof GCNodeType];
|
|
31
44
|
/** Defines the APIs for the runtime object to be passed to the garbage collector. */
|
|
32
45
|
export interface IGarbageCollectionRuntime {
|
|
33
46
|
/** Before GC runs, called to notify the runtime to update any pending GC state. */
|
|
@@ -36,6 +49,12 @@ export interface IGarbageCollectionRuntime {
|
|
|
36
49
|
getGCData(fullGC?: boolean): Promise<IGarbageCollectionData>;
|
|
37
50
|
/** After GC has run, called to notify the runtime of routes that are used in it. */
|
|
38
51
|
updateUsedRoutes(usedRoutes: string[], gcTimestamp?: number): void;
|
|
52
|
+
/** After GC has run, called to delete objects in the runtime whose routes are unused. */
|
|
53
|
+
deleteUnusedRoutes(unusedRoutes: string[]): void;
|
|
54
|
+
/** Returns a referenced timestamp to be used to track unreferenced nodes. */
|
|
55
|
+
getCurrentReferenceTimestampMs(): number | undefined;
|
|
56
|
+
/** Returns the type of the GC node. */
|
|
57
|
+
getNodeType(nodePath: string): GCNodeType;
|
|
39
58
|
/** Called when the runtime should close because of an error. */
|
|
40
59
|
closeFn(error?: ICriticalContainerError): void;
|
|
41
60
|
}
|
|
@@ -64,8 +83,8 @@ export interface IGarbageCollector {
|
|
|
64
83
|
}): Promise<IGCStats>;
|
|
65
84
|
/** Summarizes the GC data and returns it as a summary tree. */
|
|
66
85
|
summarize(): ISummaryTreeWithStats | undefined;
|
|
67
|
-
/** Returns a map of each
|
|
68
|
-
|
|
86
|
+
/** Returns a map of each node id to its base GC details in the base summary. */
|
|
87
|
+
getBaseGCDetails(): Promise<Map<string, IGarbageCollectionDetailsBase>>;
|
|
69
88
|
/** Called when the latest summary of the system has been refreshed. */
|
|
70
89
|
latestSummaryStateRefreshed(result: RefreshSummaryResult, readAndParseBlob: ReadAndParseBlob): Promise<void>;
|
|
71
90
|
/** Called when a node is updated. Used to detect and log when an inactive node is changed or loaded. */
|
|
@@ -79,21 +98,13 @@ export interface IGarbageCollector {
|
|
|
79
98
|
* its state across summaries.
|
|
80
99
|
*/
|
|
81
100
|
export declare class GarbageCollector implements IGarbageCollector {
|
|
82
|
-
private readonly
|
|
101
|
+
private readonly runtime;
|
|
83
102
|
private readonly gcOptions;
|
|
84
|
-
/** After GC has run, called to delete objects in the runtime whose routes are unused. */
|
|
85
|
-
private readonly deleteUnusedRoutes;
|
|
86
103
|
/** For a given node path, returns the node's package path. */
|
|
87
104
|
private readonly getNodePackagePath;
|
|
88
|
-
/**
|
|
89
|
-
* Returns a referenced timestamp to be used to track unreferenced nodes. This is a server generated timestamp
|
|
90
|
-
* and may not be available if there aren't any ops processed yet. If so, we skip tracking unreferenced state
|
|
91
|
-
* such as time when node becomes unreferenced or inactive.
|
|
92
|
-
*/
|
|
93
|
-
private readonly getCurrentReferenceTimestampMs;
|
|
94
105
|
/** Returns the timestamp of the last summary generated for this container. */
|
|
95
106
|
private readonly getLastSummaryTimestampMs;
|
|
96
|
-
static create(provider: IGarbageCollectionRuntime, gcOptions: IGCRuntimeOptions,
|
|
107
|
+
static create(provider: IGarbageCollectionRuntime, gcOptions: IGCRuntimeOptions, getNodePackagePath: (nodePath: string) => readonly string[] | undefined, getLastSummaryTimestampMs: () => number | undefined, baseSnapshot: ISnapshotTree | undefined, readAndParseBlob: ReadAndParseBlob, baseLogger: ITelemetryLogger, existing: boolean, metadata?: IContainerRuntimeMetadata): IGarbageCollector;
|
|
97
108
|
/**
|
|
98
109
|
* Tells whether GC should be run based on the GC options and local storage flags.
|
|
99
110
|
*/
|
|
@@ -146,27 +157,19 @@ export declare class GarbageCollector implements IGarbageCollector {
|
|
|
146
157
|
private gcDataFromLastRun;
|
|
147
158
|
private readonly referencesSinceLastRun;
|
|
148
159
|
private readonly initializeBaseStateP;
|
|
149
|
-
private readonly
|
|
160
|
+
private readonly baseGCDetailsP;
|
|
150
161
|
private readonly deleteTimeoutMs;
|
|
151
162
|
private readonly unreferencedNodesState;
|
|
152
163
|
private sessionExpiryTimer?;
|
|
153
164
|
private readonly loggedUnreferencedEvents;
|
|
154
165
|
private readonly pendingEventsQueue;
|
|
155
|
-
protected constructor(
|
|
156
|
-
/** After GC has run, called to delete objects in the runtime whose routes are unused. */
|
|
157
|
-
deleteUnusedRoutes: (unusedRoutes: string[]) => void,
|
|
166
|
+
protected constructor(runtime: IGarbageCollectionRuntime, gcOptions: IGCRuntimeOptions,
|
|
158
167
|
/** For a given node path, returns the node's package path. */
|
|
159
168
|
getNodePackagePath: (nodePath: string) => readonly string[] | undefined,
|
|
160
|
-
/**
|
|
161
|
-
* Returns a referenced timestamp to be used to track unreferenced nodes. This is a server generated timestamp
|
|
162
|
-
* and may not be available if there aren't any ops processed yet. If so, we skip tracking unreferenced state
|
|
163
|
-
* such as time when node becomes unreferenced or inactive.
|
|
164
|
-
*/
|
|
165
|
-
getCurrentReferenceTimestampMs: () => number | undefined,
|
|
166
169
|
/** Returns the timestamp of the last summary generated for this container. */
|
|
167
170
|
getLastSummaryTimestampMs: () => number | undefined, baseSnapshot: ISnapshotTree | undefined, readAndParseBlob: ReadAndParseBlob, baseLogger: ITelemetryLogger, existing: boolean, metadata?: IContainerRuntimeMetadata);
|
|
168
171
|
/**
|
|
169
|
-
* Runs garbage collection and
|
|
172
|
+
* Runs garbage collection and updates the reference / used state of the nodes in the container.
|
|
170
173
|
* @returns the number of data stores that have been marked as unreferenced.
|
|
171
174
|
*/
|
|
172
175
|
collectGarbage(options: {
|
|
@@ -184,10 +187,10 @@ export declare class GarbageCollector implements IGarbageCollector {
|
|
|
184
187
|
*/
|
|
185
188
|
summarize(): ISummaryTreeWithStats | undefined;
|
|
186
189
|
/**
|
|
187
|
-
* Returns a map of
|
|
188
|
-
* initialize the GC state of
|
|
190
|
+
* Returns a map of node ids to their base GC details generated from the base summary. This is used by the caller
|
|
191
|
+
* to initialize the GC state of the nodes.
|
|
189
192
|
*/
|
|
190
|
-
|
|
193
|
+
getBaseGCDetails(): Promise<Map<string, IGarbageCollectionDetailsBase>>;
|
|
191
194
|
/**
|
|
192
195
|
* Called when the latest summary of the system has been refreshed. This will be used to update the state of the
|
|
193
196
|
* latest summary tracked.
|
|
@@ -245,7 +248,8 @@ export declare class GarbageCollector implements IGarbageCollector {
|
|
|
245
248
|
private validateReferenceCorrectness;
|
|
246
249
|
/**
|
|
247
250
|
* Generates the stats of a garbage collection run from the given results of the run. Also, logs any pending events
|
|
248
|
-
* in the pendingEventsQueue.
|
|
251
|
+
* in the pendingEventsQueue. This should be called before updating the current state because it generates stats
|
|
252
|
+
* based on previous state of the system.
|
|
249
253
|
* @param gcResult - The result of a GC run.
|
|
250
254
|
* @returns the GC stats of the GC run.
|
|
251
255
|
*/
|
|
@@ -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,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,qBAAqB,EAAE,MAAM,CAAC;
|
|
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"}
|
package/lib/garbageCollection.js
CHANGED
|
@@ -29,6 +29,15 @@ const writeAtRootKey = "Fluid.GarbageCollection.WriteDataAtRoot";
|
|
|
29
29
|
const runSessionExpiry = "Fluid.GarbageCollection.RunSessionExpiry";
|
|
30
30
|
const defaultDeleteTimeoutMs = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
31
31
|
export const defaultSessionExpiryDurationMs = 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
32
|
+
/** The types of GC nodes in the GC reference graph. */
|
|
33
|
+
export const GCNodeType = {
|
|
34
|
+
// Nodes that are for data stores.
|
|
35
|
+
DataStore: "DataStore",
|
|
36
|
+
// Nodes that are for attachment blobs, i.e., blobs uploaded via BlobManager.
|
|
37
|
+
Blob: "Blob",
|
|
38
|
+
// Nodes that are neither data store not blobs. For example, root node and DDS nodes.
|
|
39
|
+
Other: "Other",
|
|
40
|
+
};
|
|
32
41
|
/**
|
|
33
42
|
* Helper class that tracks the state of an unreferenced node such as the time it was unreferenced. It also sets
|
|
34
43
|
* the node's state to inactive if it remains unreferenced for a given amount of time (inactiveTimeoutMs).
|
|
@@ -80,25 +89,15 @@ class UnreferencedStateTracker {
|
|
|
80
89
|
* its state across summaries.
|
|
81
90
|
*/
|
|
82
91
|
export class GarbageCollector {
|
|
83
|
-
constructor(
|
|
84
|
-
/** After GC has run, called to delete objects in the runtime whose routes are unused. */
|
|
85
|
-
deleteUnusedRoutes,
|
|
92
|
+
constructor(runtime, gcOptions,
|
|
86
93
|
/** For a given node path, returns the node's package path. */
|
|
87
94
|
getNodePackagePath,
|
|
88
|
-
/**
|
|
89
|
-
* Returns a referenced timestamp to be used to track unreferenced nodes. This is a server generated timestamp
|
|
90
|
-
* and may not be available if there aren't any ops processed yet. If so, we skip tracking unreferenced state
|
|
91
|
-
* such as time when node becomes unreferenced or inactive.
|
|
92
|
-
*/
|
|
93
|
-
getCurrentReferenceTimestampMs,
|
|
94
95
|
/** Returns the timestamp of the last summary generated for this container. */
|
|
95
96
|
getLastSummaryTimestampMs, baseSnapshot, readAndParseBlob, baseLogger, existing, metadata) {
|
|
96
97
|
var _a, _b, _c, _d, _e;
|
|
97
|
-
this.
|
|
98
|
+
this.runtime = runtime;
|
|
98
99
|
this.gcOptions = gcOptions;
|
|
99
|
-
this.deleteUnusedRoutes = deleteUnusedRoutes;
|
|
100
100
|
this.getNodePackagePath = getNodePackagePath;
|
|
101
|
-
this.getCurrentReferenceTimestampMs = getCurrentReferenceTimestampMs;
|
|
102
101
|
this.getLastSummaryTimestampMs = getLastSummaryTimestampMs;
|
|
103
102
|
/**
|
|
104
103
|
* Tells whether the GC data should be written to the root of the summary tree.
|
|
@@ -136,12 +135,12 @@ export class GarbageCollector {
|
|
|
136
135
|
if (existing) {
|
|
137
136
|
prevSummaryGCVersion = getGCVersion(metadata);
|
|
138
137
|
// Existing documents which did not have metadata blob or had GC disabled have version as 0. For all
|
|
139
|
-
// other
|
|
138
|
+
// other existing documents, GC is enabled.
|
|
140
139
|
this.gcEnabled = prevSummaryGCVersion > 0;
|
|
141
140
|
this.sessionExpiryTimeoutMs = metadata === null || metadata === void 0 ? void 0 : metadata.sessionExpiryTimeoutMs;
|
|
142
141
|
}
|
|
143
142
|
else {
|
|
144
|
-
// For new documents, GC has to be
|
|
143
|
+
// For new documents, GC has to be explicitly enabled via the gcAllowed flag in GC options.
|
|
145
144
|
this.gcEnabled = gcOptions.gcAllowed === true;
|
|
146
145
|
// Set the Session Expiry only if the flag is enabled or the test option is set.
|
|
147
146
|
if (this.mc.config.getBoolean(runSessionExpiry) && this.gcEnabled) {
|
|
@@ -152,7 +151,7 @@ export class GarbageCollector {
|
|
|
152
151
|
if (this.sessionExpiryTimeoutMs !== undefined) {
|
|
153
152
|
const timeoutMs = this.sessionExpiryTimeoutMs;
|
|
154
153
|
setLongTimeout(timeoutMs, () => {
|
|
155
|
-
this.
|
|
154
|
+
this.runtime.closeFn(new ClientSessionExpiredError(`Client session expired.`, timeoutMs));
|
|
156
155
|
}, (timer) => {
|
|
157
156
|
this.sessionExpiryTimer = timer;
|
|
158
157
|
});
|
|
@@ -203,9 +202,9 @@ export class GarbageCollector {
|
|
|
203
202
|
// consolidate into IGarbageCollectionState format.
|
|
204
203
|
// Add a node for the root node that is not present in older snapshot format.
|
|
205
204
|
const gcState = { gcNodes: { "/": { outboundRoutes: [] } } };
|
|
206
|
-
const
|
|
207
|
-
assert(
|
|
208
|
-
for (const [dsId, dsSnapshotTree] of Object.entries(
|
|
205
|
+
const dataStoreSnapshotTree = getSummaryForDatastores(baseSnapshot, metadata);
|
|
206
|
+
assert(dataStoreSnapshotTree !== undefined, 0x2a8 /* "Expected data store snapshot tree in base snapshot" */);
|
|
207
|
+
for (const [dsId, dsSnapshotTree] of Object.entries(dataStoreSnapshotTree.trees)) {
|
|
209
208
|
const blobId = dsSnapshotTree.blobs[gcBlobKey];
|
|
210
209
|
if (blobId === undefined) {
|
|
211
210
|
continue;
|
|
@@ -241,7 +240,7 @@ export class GarbageCollector {
|
|
|
241
240
|
* may be out of date. This is fine because the state is updated every time GC runs based on the time then.
|
|
242
241
|
*/
|
|
243
242
|
this.initializeBaseStateP = new LazyPromise(async () => {
|
|
244
|
-
const currentReferenceTimestampMs = this.getCurrentReferenceTimestampMs();
|
|
243
|
+
const currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();
|
|
245
244
|
const baseState = await baseSummaryStateP;
|
|
246
245
|
if (baseState === undefined) {
|
|
247
246
|
return;
|
|
@@ -255,9 +254,9 @@ export class GarbageCollector {
|
|
|
255
254
|
}
|
|
256
255
|
this.gcDataFromLastRun = { gcNodes };
|
|
257
256
|
});
|
|
258
|
-
// Get the GC details for each
|
|
259
|
-
//
|
|
260
|
-
this.
|
|
257
|
+
// Get the GC details for each node from the GC state in the base summary. This is returned in getBaseGCDetails
|
|
258
|
+
// which the caller uses to initialize each node's GC state.
|
|
259
|
+
this.baseGCDetailsP = new LazyPromise(async () => {
|
|
261
260
|
const baseState = await baseSummaryStateP;
|
|
262
261
|
if (baseState === undefined) {
|
|
263
262
|
return new Map();
|
|
@@ -270,18 +269,18 @@ export class GarbageCollector {
|
|
|
270
269
|
// This is an optimization for space (vs performance) wherein we don't need to store the used routes of
|
|
271
270
|
// each node in the summary.
|
|
272
271
|
const usedRoutes = runGarbageCollection(gcNodes, ["/"], this.mc.logger).referencedNodeIds;
|
|
273
|
-
const
|
|
274
|
-
// Currently, the
|
|
272
|
+
const baseGCDetailsMap = unpackChildNodesGCDetails({ gcData: { gcNodes }, usedRoutes });
|
|
273
|
+
// Currently, the nodes may write the GC data. So, we need to update it's base GC details with the
|
|
275
274
|
// unreferenced timestamp. Once we start writing the GC data here, we won't need to do this anymore.
|
|
276
275
|
for (const [nodeId, nodeData] of Object.entries(baseState.gcNodes)) {
|
|
277
276
|
if (nodeData.unreferencedTimestampMs !== undefined) {
|
|
278
|
-
const dataStoreGCDetails =
|
|
277
|
+
const dataStoreGCDetails = baseGCDetailsMap.get(nodeId.slice(1));
|
|
279
278
|
if (dataStoreGCDetails !== undefined) {
|
|
280
279
|
dataStoreGCDetails.unrefTimestamp = nodeData.unreferencedTimestampMs;
|
|
281
280
|
}
|
|
282
281
|
}
|
|
283
282
|
}
|
|
284
|
-
return
|
|
283
|
+
return baseGCDetailsMap;
|
|
285
284
|
});
|
|
286
285
|
// Initialize the base state. The base GC data is used to detect and log when inactive / deleted objects are
|
|
287
286
|
// used in the container.
|
|
@@ -299,8 +298,8 @@ export class GarbageCollector {
|
|
|
299
298
|
});
|
|
300
299
|
}
|
|
301
300
|
}
|
|
302
|
-
static create(provider, gcOptions,
|
|
303
|
-
return new GarbageCollector(provider, gcOptions,
|
|
301
|
+
static create(provider, gcOptions, getNodePackagePath, getLastSummaryTimestampMs, baseSnapshot, readAndParseBlob, baseLogger, existing, metadata) {
|
|
302
|
+
return new GarbageCollector(provider, gcOptions, getNodePackagePath, getLastSummaryTimestampMs, baseSnapshot, readAndParseBlob, baseLogger, existing, metadata);
|
|
304
303
|
}
|
|
305
304
|
/**
|
|
306
305
|
* This tracks two things:
|
|
@@ -326,7 +325,7 @@ export class GarbageCollector {
|
|
|
326
325
|
return this._writeDataAtRoot;
|
|
327
326
|
}
|
|
328
327
|
/**
|
|
329
|
-
* Runs garbage collection and
|
|
328
|
+
* Runs garbage collection and updates the reference / used state of the nodes in the container.
|
|
330
329
|
* @returns the number of data stores that have been marked as unreferenced.
|
|
331
330
|
*/
|
|
332
331
|
async collectGarbage(options) {
|
|
@@ -334,25 +333,25 @@ export class GarbageCollector {
|
|
|
334
333
|
return PerformanceEvent.timedExecAsync(logger, { eventName: "GarbageCollection" }, async (event) => {
|
|
335
334
|
await this.initializeBaseStateP;
|
|
336
335
|
// Let the runtime update its pending state before GC runs.
|
|
337
|
-
await this.
|
|
336
|
+
await this.runtime.updateStateBeforeGC();
|
|
338
337
|
// Get the runtime's GC data and run GC on the reference graph in it.
|
|
339
|
-
const gcData = await this.
|
|
338
|
+
const gcData = await this.runtime.getGCData(fullGC);
|
|
340
339
|
const gcResult = runGarbageCollection(gcData.gcNodes, ["/"], logger);
|
|
341
340
|
const gcStats = this.generateStatsAndLogEvents(gcResult);
|
|
342
341
|
// Update the state since the last GC run. There can be nodes that were referenced between the last and
|
|
343
342
|
// the current run. We need to identify than and update their unreferenced state if needed.
|
|
344
343
|
this.updateStateSinceLastRun(gcData);
|
|
345
344
|
// Update the current state of the system based on the GC run.
|
|
346
|
-
const currentReferenceTimestampMs = this.getCurrentReferenceTimestampMs();
|
|
345
|
+
const currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();
|
|
347
346
|
this.updateCurrentState(gcData, gcResult, currentReferenceTimestampMs);
|
|
348
|
-
this.
|
|
347
|
+
this.runtime.updateUsedRoutes(gcResult.referencedNodeIds, currentReferenceTimestampMs);
|
|
349
348
|
if (runSweep) {
|
|
350
349
|
// Placeholder for running sweep logic.
|
|
351
350
|
}
|
|
352
351
|
// If we are running in GC test mode, delete objects for unused routes. This enables testing scenarios
|
|
353
352
|
// involving access to deleted data.
|
|
354
353
|
if (this.testMode) {
|
|
355
|
-
this.deleteUnusedRoutes(gcResult.deletedNodeIds);
|
|
354
|
+
this.runtime.deleteUnusedRoutes(gcResult.deletedNodeIds);
|
|
356
355
|
}
|
|
357
356
|
event.end(Object.assign({}, gcStats));
|
|
358
357
|
return gcStats;
|
|
@@ -380,11 +379,11 @@ export class GarbageCollector {
|
|
|
380
379
|
return builder.getSummaryTree();
|
|
381
380
|
}
|
|
382
381
|
/**
|
|
383
|
-
* Returns a map of
|
|
384
|
-
* initialize the GC state of
|
|
382
|
+
* Returns a map of node ids to their base GC details generated from the base summary. This is used by the caller
|
|
383
|
+
* to initialize the GC state of the nodes.
|
|
385
384
|
*/
|
|
386
|
-
async
|
|
387
|
-
return this.
|
|
385
|
+
async getBaseGCDetails() {
|
|
386
|
+
return this.baseGCDetailsP;
|
|
388
387
|
}
|
|
389
388
|
/**
|
|
390
389
|
* Called when the latest summary of the system has been refreshed. This will be used to update the state of the
|
|
@@ -590,7 +589,7 @@ export class GarbageCollector {
|
|
|
590
589
|
currentReferences.forEach((route) => {
|
|
591
590
|
// Validate references for data stores only. Currently, layers below data stores don't have GC implemented
|
|
592
591
|
// so there is no guarantee their references will be notified.
|
|
593
|
-
if (
|
|
592
|
+
if (this.runtime.getNodeType(route) === GCNodeType.DataStore && !explicitReferences.includes(route)) {
|
|
594
593
|
/**
|
|
595
594
|
* The following log will be enabled once this issue is resolved:
|
|
596
595
|
* https://github.com/microsoft/FluidFramework/issues/8878.
|
|
@@ -606,7 +605,8 @@ export class GarbageCollector {
|
|
|
606
605
|
}
|
|
607
606
|
/**
|
|
608
607
|
* Generates the stats of a garbage collection run from the given results of the run. Also, logs any pending events
|
|
609
|
-
* in the pendingEventsQueue.
|
|
608
|
+
* in the pendingEventsQueue. This should be called before updating the current state because it generates stats
|
|
609
|
+
* based on previous state of the system.
|
|
610
610
|
* @param gcResult - The result of a GC run.
|
|
611
611
|
* @returns the GC stats of the GC run.
|
|
612
612
|
*/
|
|
@@ -622,49 +622,58 @@ export class GarbageCollector {
|
|
|
622
622
|
const gcStats = {
|
|
623
623
|
nodeCount: 0,
|
|
624
624
|
dataStoreCount: 0,
|
|
625
|
+
attachmentBlobCount: 0,
|
|
625
626
|
unrefNodeCount: 0,
|
|
626
627
|
unrefDataStoreCount: 0,
|
|
628
|
+
unrefAttachmentBlobCount: 0,
|
|
627
629
|
updatedNodeCount: 0,
|
|
628
630
|
updatedDataStoreCount: 0,
|
|
631
|
+
updatedAttachmentBlobCount: 0,
|
|
629
632
|
};
|
|
630
|
-
|
|
633
|
+
const updateNodeStats = (nodeId, referenced) => {
|
|
631
634
|
gcStats.nodeCount++;
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
if (this.unreferencedNodesState.has(nodeId)) {
|
|
635
|
+
/**
|
|
636
|
+
* `this.unreferencedNodesState` has the previous unreferenced state of all nodes. `referenced` flag passed
|
|
637
|
+
* here is current state of the give node. Check if the reference state of the changed.
|
|
638
|
+
*/
|
|
639
|
+
const stateUpdated = this.unreferencedNodesState.has(nodeId) ? referenced : !referenced;
|
|
640
|
+
if (stateUpdated) {
|
|
639
641
|
gcStats.updatedNodeCount++;
|
|
640
|
-
if (isDataStore) {
|
|
641
|
-
gcStats.updatedDataStoreCount++;
|
|
642
|
-
}
|
|
643
642
|
}
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
gcStats.nodeCount++;
|
|
647
|
-
gcStats.unrefNodeCount++;
|
|
648
|
-
const isDataStore = isDataStoreNode(nodeId);
|
|
649
|
-
if (isDataStore) {
|
|
650
|
-
gcStats.dataStoreCount++;
|
|
651
|
-
gcStats.unrefDataStoreCount++;
|
|
643
|
+
if (!referenced) {
|
|
644
|
+
gcStats.unrefNodeCount++;
|
|
652
645
|
}
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
gcStats.updatedNodeCount++;
|
|
657
|
-
if (isDataStore) {
|
|
646
|
+
if (this.runtime.getNodeType(nodeId) === GCNodeType.DataStore) {
|
|
647
|
+
gcStats.dataStoreCount++;
|
|
648
|
+
if (stateUpdated) {
|
|
658
649
|
gcStats.updatedDataStoreCount++;
|
|
659
650
|
}
|
|
651
|
+
if (!referenced) {
|
|
652
|
+
gcStats.unrefDataStoreCount++;
|
|
653
|
+
}
|
|
660
654
|
}
|
|
655
|
+
if (this.runtime.getNodeType(nodeId) === GCNodeType.Blob) {
|
|
656
|
+
gcStats.attachmentBlobCount++;
|
|
657
|
+
if (stateUpdated) {
|
|
658
|
+
gcStats.updatedAttachmentBlobCount++;
|
|
659
|
+
}
|
|
660
|
+
if (!referenced) {
|
|
661
|
+
gcStats.unrefAttachmentBlobCount++;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
};
|
|
665
|
+
for (const nodeId of gcResult.referencedNodeIds) {
|
|
666
|
+
updateNodeStats(nodeId, true /* referenced */);
|
|
667
|
+
}
|
|
668
|
+
for (const nodeId of gcResult.deletedNodeIds) {
|
|
669
|
+
updateNodeStats(nodeId, false /* referenced */);
|
|
661
670
|
}
|
|
662
671
|
return gcStats;
|
|
663
672
|
}
|
|
664
673
|
/**
|
|
665
674
|
* Logs an event if a node is inactive and is used.
|
|
666
675
|
*/
|
|
667
|
-
logIfInactive(eventSuffix, nodeId, currentReferenceTimestampMs = this.getCurrentReferenceTimestampMs(), packagePath, requestHeaders) {
|
|
676
|
+
logIfInactive(eventSuffix, nodeId, currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs(), packagePath, requestHeaders) {
|
|
668
677
|
// If there is no reference timestamp to work with, no ops have been processed after creation. If so, skip
|
|
669
678
|
// logging as nothing interesting would have happened worth logging.
|
|
670
679
|
if (currentReferenceTimestampMs === undefined) {
|
|
@@ -704,7 +713,7 @@ export class GarbageCollector {
|
|
|
704
713
|
async function getGCStateFromSnapshot(gcSnapshotTree, readAndParseBlob) {
|
|
705
714
|
let rootGCState = { gcNodes: {} };
|
|
706
715
|
for (const key of Object.keys(gcSnapshotTree.blobs)) {
|
|
707
|
-
// Skip blobs that do not
|
|
716
|
+
// Skip blobs that do not start with the GC prefix.
|
|
708
717
|
if (!key.startsWith(gcBlobPrefix)) {
|
|
709
718
|
continue;
|
|
710
719
|
}
|
|
@@ -738,12 +747,4 @@ function setLongTimeout(timeoutMs, timeoutFn, setTimerFn) {
|
|
|
738
747
|
}
|
|
739
748
|
setTimerFn(timer);
|
|
740
749
|
}
|
|
741
|
-
/**
|
|
742
|
-
* Given a GC nodeId, tells whether it belongs to a data store or not.
|
|
743
|
-
*/
|
|
744
|
-
function isDataStoreNode(nodeId) {
|
|
745
|
-
const pathParts = nodeId.split("/");
|
|
746
|
-
// Data store ids are in the format "/dataStoreId".
|
|
747
|
-
return pathParts.length === 2 && pathParts[1] !== "" ? true : false;
|
|
748
|
-
}
|
|
749
750
|
//# sourceMappingURL=garbageCollection.js.map
|