@fluidframework/container-runtime 2.0.0-rc.3.0.1 → 2.0.0-rc.3.0.3

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 (95) hide show
  1. package/api-report/container-runtime.api.md +23 -7
  2. package/dist/channelCollection.d.ts +5 -3
  3. package/dist/channelCollection.d.ts.map +1 -1
  4. package/dist/channelCollection.js +65 -15
  5. package/dist/channelCollection.js.map +1 -1
  6. package/dist/containerRuntime.d.ts +5 -0
  7. package/dist/containerRuntime.d.ts.map +1 -1
  8. package/dist/containerRuntime.js +25 -5
  9. package/dist/containerRuntime.js.map +1 -1
  10. package/dist/dataStoreContexts.d.ts +2 -0
  11. package/dist/dataStoreContexts.d.ts.map +1 -1
  12. package/dist/dataStoreContexts.js +7 -0
  13. package/dist/dataStoreContexts.js.map +1 -1
  14. package/dist/gc/garbageCollection.d.ts +4 -11
  15. package/dist/gc/garbageCollection.d.ts.map +1 -1
  16. package/dist/gc/garbageCollection.js +45 -29
  17. package/dist/gc/garbageCollection.js.map +1 -1
  18. package/dist/gc/gcDefinitions.d.ts +26 -5
  19. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  20. package/dist/gc/gcDefinitions.js.map +1 -1
  21. package/dist/gc/gcHelpers.d.ts +5 -4
  22. package/dist/gc/gcHelpers.d.ts.map +1 -1
  23. package/dist/gc/gcHelpers.js +14 -2
  24. package/dist/gc/gcHelpers.js.map +1 -1
  25. package/dist/gc/gcTelemetry.d.ts +13 -2
  26. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  27. package/dist/gc/gcTelemetry.js +24 -21
  28. package/dist/gc/gcTelemetry.js.map +1 -1
  29. package/dist/gc/index.d.ts +2 -2
  30. package/dist/gc/index.d.ts.map +1 -1
  31. package/dist/gc/index.js +2 -2
  32. package/dist/gc/index.js.map +1 -1
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/legacy.d.ts +1 -0
  38. package/dist/packageVersion.d.ts +1 -1
  39. package/dist/packageVersion.js +1 -1
  40. package/dist/packageVersion.js.map +1 -1
  41. package/dist/summary/documentSchema.js +1 -1
  42. package/dist/summary/documentSchema.js.map +1 -1
  43. package/lib/channelCollection.d.ts +5 -3
  44. package/lib/channelCollection.d.ts.map +1 -1
  45. package/lib/channelCollection.js +67 -17
  46. package/lib/channelCollection.js.map +1 -1
  47. package/lib/containerRuntime.d.ts +5 -0
  48. package/lib/containerRuntime.d.ts.map +1 -1
  49. package/lib/containerRuntime.js +24 -4
  50. package/lib/containerRuntime.js.map +1 -1
  51. package/lib/dataStoreContexts.d.ts +2 -0
  52. package/lib/dataStoreContexts.d.ts.map +1 -1
  53. package/lib/dataStoreContexts.js +7 -0
  54. package/lib/dataStoreContexts.js.map +1 -1
  55. package/lib/gc/garbageCollection.d.ts +4 -11
  56. package/lib/gc/garbageCollection.d.ts.map +1 -1
  57. package/lib/gc/garbageCollection.js +47 -31
  58. package/lib/gc/garbageCollection.js.map +1 -1
  59. package/lib/gc/gcDefinitions.d.ts +26 -5
  60. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  61. package/lib/gc/gcDefinitions.js.map +1 -1
  62. package/lib/gc/gcHelpers.d.ts +5 -4
  63. package/lib/gc/gcHelpers.d.ts.map +1 -1
  64. package/lib/gc/gcHelpers.js +12 -1
  65. package/lib/gc/gcHelpers.js.map +1 -1
  66. package/lib/gc/gcTelemetry.d.ts +13 -2
  67. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  68. package/lib/gc/gcTelemetry.js +24 -21
  69. package/lib/gc/gcTelemetry.js.map +1 -1
  70. package/lib/gc/index.d.ts +2 -2
  71. package/lib/gc/index.d.ts.map +1 -1
  72. package/lib/gc/index.js +1 -1
  73. package/lib/gc/index.js.map +1 -1
  74. package/lib/index.d.ts +2 -2
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +1 -1
  77. package/lib/index.js.map +1 -1
  78. package/lib/legacy.d.ts +1 -0
  79. package/lib/packageVersion.d.ts +1 -1
  80. package/lib/packageVersion.js +1 -1
  81. package/lib/packageVersion.js.map +1 -1
  82. package/lib/summary/documentSchema.js +1 -1
  83. package/lib/summary/documentSchema.js.map +1 -1
  84. package/package.json +17 -17
  85. package/src/channelCollection.ts +85 -35
  86. package/src/containerRuntime.ts +24 -24
  87. package/src/dataStoreContexts.ts +12 -0
  88. package/src/gc/garbageCollection.ts +63 -41
  89. package/src/gc/gcDefinitions.ts +21 -9
  90. package/src/gc/gcHelpers.ts +14 -1
  91. package/src/gc/gcTelemetry.ts +56 -47
  92. package/src/gc/index.ts +2 -1
  93. package/src/index.ts +2 -0
  94. package/src/packageVersion.ts +1 -1
  95. package/src/summary/documentSchema.ts +1 -1
@@ -77,7 +77,7 @@ export const AllowTombstoneRequestHeaderKey = "allowTombstone";
77
77
 
78
78
  // @internal
79
79
  export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
80
- constructor(baseSnapshot: ISnapshotTree | undefined, parentContext: IFluidParentContext, baseLogger: ITelemetryBaseLogger, gcNodeUpdated: (nodePath: string, reason: "Loaded" | "Changed", timestampMs?: number, packagePath?: readonly string[], request?: IRequest, headerData?: RuntimeHeaderData) => void, isDataStoreDeleted: (nodePath: string) => boolean, aliasMap: Map<string, string>, provideEntryPoint: (runtime: ChannelCollection) => Promise<FluidObject>);
80
+ constructor(baseSnapshot: ISnapshotTree | undefined, parentContext: IFluidParentContext, baseLogger: ITelemetryBaseLogger, gcNodeUpdated: (props: IGCNodeUpdatedProps) => void, isDataStoreDeleted: (nodePath: string) => boolean, aliasMap: Map<string, string>, provideEntryPoint: (runtime: ChannelCollection) => Promise<FluidObject>);
81
81
  // (undocumented)
82
82
  get aliases(): ReadonlyMap<string, string>;
83
83
  // (undocumented)
@@ -112,8 +112,6 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
112
112
  // (undocumented)
113
113
  readonly entryPoint: IFluidHandle<FluidObject>;
114
114
  getAttachSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats;
115
- // (undocumented)
116
- getDataStore(id: string, requestHeaderData: RuntimeHeaderData): Promise<IFluidDataStoreContextInternal>;
117
115
  getDataStoreIfAvailable(id: string, requestHeaderData: RuntimeHeaderData): Promise<IFluidDataStoreContextInternal | undefined>;
118
116
  getDataStorePackagePath(nodePath: string): Promise<readonly string[] | undefined>;
119
117
  getGCData(fullGC?: boolean): Promise<IGarbageCollectionData>;
@@ -386,6 +384,8 @@ export class DataStoreContexts implements Iterable<[string, FluidDataStoreContex
386
384
  // (undocumented)
387
385
  get(id: string): FluidDataStoreContext | undefined;
388
386
  getBoundOrRemoted(id: string, wait: boolean): Promise<FluidDataStoreContext | undefined>;
387
+ // (undocumented)
388
+ getRecentlyDeletedContext(id: string): FluidDataStoreContext | undefined;
389
389
  getUnbound(id: string): LocalFluidDataStoreContext | undefined;
390
390
  // (undocumented)
391
391
  has(id: string): boolean;
@@ -400,6 +400,9 @@ export class DataStoreContexts implements Iterable<[string, FluidDataStoreContex
400
400
  // @alpha (undocumented)
401
401
  export const DefaultSummaryConfiguration: ISummaryConfiguration;
402
402
 
403
+ // @alpha
404
+ export const DeletedResponseHeaderKey = "wasDeleted";
405
+
403
406
  // @internal
404
407
  export function detectOutboundReferences(address: string, contents: unknown, addedOutboundReference: (fromNodePath: string, toNodePath: string) => void): void;
405
408
 
@@ -591,10 +594,10 @@ export type GCFeatureMatrix = {
591
594
 
592
595
  // @alpha
593
596
  export const GCNodeType: {
594
- DataStore: string;
595
- SubDataStore: string;
596
- Blob: string;
597
- Other: string;
597
+ readonly DataStore: "DataStore";
598
+ readonly SubDataStore: "SubDataStore";
599
+ readonly Blob: "Blob";
600
+ readonly Other: "Other";
598
601
  };
599
602
 
600
603
  // @alpha (undocumented)
@@ -832,6 +835,19 @@ export interface IGCMetadata {
832
835
  readonly tombstoneTimeoutMs?: number;
833
836
  }
834
837
 
838
+ // @internal
839
+ export interface IGCNodeUpdatedProps {
840
+ headerData?: RuntimeHeaderData;
841
+ node: {
842
+ type: (typeof GCNodeType)["DataStore" | "Blob"];
843
+ path: string;
844
+ };
845
+ packagePath?: readonly string[];
846
+ reason: "Loaded" | "Changed";
847
+ request?: IRequest;
848
+ timestampMs?: number;
849
+ }
850
+
835
851
  // @alpha (undocumented)
836
852
  export interface IGCRuntimeOptions {
837
853
  [key: string]: any;
@@ -11,7 +11,7 @@ import { MonitoringContext } from "@fluidframework/telemetry-utils/internal";
11
11
  import { RuntimeHeaderData } from "./containerRuntime.js";
12
12
  import { IFluidDataStoreContextInternal, ILocalDetachedFluidDataStoreContextProps, LocalFluidDataStoreContext } from "./dataStoreContext.js";
13
13
  import { DataStoreContexts } from "./dataStoreContexts.js";
14
- import { GCNodeType } from "./gc/index.js";
14
+ import { GCNodeType, IGCNodeUpdatedProps } from "./gc/index.js";
15
15
  import { IContainerRuntimeMetadata } from "./summary/index.js";
16
16
  /**
17
17
  * Accepted header keys for requests coming to the runtime.
@@ -70,7 +70,7 @@ export declare class ChannelCollection implements IFluidDataStoreChannel, IDispo
70
70
  private readonly pendingAliasMap;
71
71
  protected readonly contexts: DataStoreContexts;
72
72
  private readonly aliasedDataStores;
73
- constructor(baseSnapshot: ISnapshotTree | undefined, parentContext: IFluidParentContext, baseLogger: ITelemetryBaseLogger, gcNodeUpdated: (nodePath: string, reason: "Loaded" | "Changed", timestampMs?: number, packagePath?: readonly string[], request?: IRequest, headerData?: RuntimeHeaderData) => void, isDataStoreDeleted: (nodePath: string) => boolean, aliasMap: Map<string, string>, provideEntryPoint: (runtime: ChannelCollection) => Promise<FluidObject>);
73
+ constructor(baseSnapshot: ISnapshotTree | undefined, parentContext: IFluidParentContext, baseLogger: ITelemetryBaseLogger, gcNodeUpdated: (props: IGCNodeUpdatedProps) => void, isDataStoreDeleted: (nodePath: string) => boolean, aliasMap: Map<string, string>, provideEntryPoint: (runtime: ChannelCollection) => Promise<FluidObject>);
74
74
  get aliases(): ReadonlyMap<string, string>;
75
75
  get pendingAliases(): Map<string, Promise<AliasResult>>;
76
76
  waitIfPendingAlias(maybeAlias: string): Promise<AliasResult>;
@@ -126,7 +126,7 @@ export declare class ChannelCollection implements IFluidDataStoreChannel, IDispo
126
126
  private applyStashedAttachOp;
127
127
  process(message: ISequencedDocumentMessage, local: boolean, localMessageMetadata: unknown, addedOutboundReference?: (fromNodePath: string, toNodePath: string) => void): void;
128
128
  protected processChannelOp(address: string, message: ISequencedDocumentMessage, local: boolean, localMessageMetadata: unknown): void;
129
- getDataStore(id: string, requestHeaderData: RuntimeHeaderData): Promise<IFluidDataStoreContextInternal>;
129
+ private getDataStore;
130
130
  /**
131
131
  * Returns the data store requested with the given id if available. Otherwise, returns undefined.
132
132
  */
@@ -135,8 +135,10 @@ export declare class ChannelCollection implements IFluidDataStoreChannel, IDispo
135
135
  * Checks if the data store has been deleted by GC. If so, log an error.
136
136
  * @param id - The data store's id.
137
137
  * @param context - The data store context.
138
+ * @param deletedLogSuffix - Whether it was Changed or Requested (will go into the eventName)
138
139
  * @param callSite - The function name this is called from.
139
140
  * @param requestHeaderData - The request header information to log if the data store is deleted.
141
+ * @param originalRequest - The original request (could be for a child of the DataStore)
140
142
  * @returns true if the data store is deleted. Otherwise, returns false.
141
143
  */
142
144
  private checkAndLogIfDeleted;
@@ -1 +1 @@
1
- {"version":3,"file":"channelCollection.d.ts","sourceRoot":"","sources":["../src/channelCollection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channelCollection.d.ts","sourceRoot":"","sources":["../src/channelCollection.ts"],"names":[],"mappings":"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"}
@@ -609,14 +609,20 @@ class ChannelCollection {
609
609
  context.process(message, local, localMessageMetadata);
610
610
  // Notify that a GC node for the data store changed. This is used to detect if a deleted data store is
611
611
  // being used.
612
- this.gcNodeUpdated(`/${address}`, "Changed", message.timestamp, context.isLoaded ? context.packagePath : undefined);
612
+ this.gcNodeUpdated({
613
+ node: { type: "DataStore", path: `/${address}` },
614
+ reason: "Changed",
615
+ timestampMs: message.timestamp,
616
+ packagePath: context.isLoaded ? context.packagePath : undefined,
617
+ });
613
618
  }
614
- async getDataStore(id, requestHeaderData) {
619
+ async getDataStore(id, requestHeaderData, originalRequest) {
615
620
  const headerData = { ...containerRuntime_js_1.defaultRuntimeHeaderData, ...requestHeaderData };
616
- if (this.checkAndLogIfDeleted(id, this.contexts.get(id), "Requested", "getDataStore", requestHeaderData)) {
621
+ if (this.checkAndLogIfDeleted(id, this.contexts.get(id), "Requested", "getDataStore", requestHeaderData, originalRequest)) {
617
622
  // The requested data store has been deleted by gc. Create a 404 response exception.
618
- const request = { url: id };
619
- throw (0, internal_5.responseToException)((0, internal_5.createResponseError)(404, "DataStore was deleted", request), request);
623
+ throw (0, internal_5.responseToException)((0, internal_5.createResponseError)(404, "DataStore was deleted", originalRequest, {
624
+ [containerRuntime_js_1.DeletedResponseHeaderKey]: true,
625
+ }), originalRequest);
620
626
  }
621
627
  const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
622
628
  if (context === undefined) {
@@ -645,21 +651,52 @@ class ChannelCollection {
645
651
  * Checks if the data store has been deleted by GC. If so, log an error.
646
652
  * @param id - The data store's id.
647
653
  * @param context - The data store context.
654
+ * @param deletedLogSuffix - Whether it was Changed or Requested (will go into the eventName)
648
655
  * @param callSite - The function name this is called from.
649
656
  * @param requestHeaderData - The request header information to log if the data store is deleted.
657
+ * @param originalRequest - The original request (could be for a child of the DataStore)
650
658
  * @returns true if the data store is deleted. Otherwise, returns false.
651
659
  */
652
- checkAndLogIfDeleted(id, context, deletedLogSuffix, callSite, requestHeaderData) {
660
+ checkAndLogIfDeleted(id, context, deletedLogSuffix, callSite, requestHeaderData, originalRequest) {
653
661
  const dataStoreNodePath = `/${id}`;
654
662
  if (!this.isDataStoreDeleted(dataStoreNodePath)) {
655
663
  return false;
656
664
  }
665
+ const idToLog = originalRequest !== undefined
666
+ ? (0, index_js_1.urlToGCNodePath)(originalRequest.url)
667
+ : dataStoreNodePath;
668
+ // Log the package details asynchronously since getInitialSnapshotDetails is async
669
+ const recentelyDeletedContext = this.contexts.getRecentlyDeletedContext(id);
670
+ if (recentelyDeletedContext !== undefined) {
671
+ recentelyDeletedContext
672
+ .getInitialSnapshotDetails()
673
+ .then((details) => {
674
+ return details.pkg.join("/");
675
+ })
676
+ .then((pkg) => ({ pkg, error: undefined }), (error) => ({ pkg: undefined, error }))
677
+ .then(({ pkg, error }) => {
678
+ this.mc.logger.sendTelemetryEvent({
679
+ eventName: `GC_DeletedDataStore_PathInfo`,
680
+ ...(0, internal_6.tagCodeArtifacts)({
681
+ id: idToLog,
682
+ pkg,
683
+ }),
684
+ callSite,
685
+ }, error);
686
+ })
687
+ .catch(() => { });
688
+ }
657
689
  this.mc.logger.sendErrorEvent({
658
690
  eventName: `GC_Deleted_DataStore_${deletedLogSuffix}`,
659
- ...(0, internal_6.tagCodeArtifacts)({ id }),
691
+ ...(0, internal_6.tagCodeArtifacts)({ id: idToLog }),
660
692
  callSite,
661
693
  headers: JSON.stringify(requestHeaderData),
662
694
  exists: context !== undefined,
695
+ details: {
696
+ url: originalRequest?.url,
697
+ headers: JSON.stringify(originalRequest?.headers),
698
+ aliased: this.aliasedDataStores.has(id),
699
+ },
663
700
  });
664
701
  return true;
665
702
  }
@@ -849,6 +886,15 @@ class ChannelCollection {
849
886
  deleteChild(dataStoreId) {
850
887
  const dataStoreContext = this.contexts.get(dataStoreId);
851
888
  (0, internal_1.assert)(dataStoreContext !== undefined, 0x2d7 /* No data store with specified id */);
889
+ if (dataStoreContext.isLoaded) {
890
+ this.mc.logger.sendTelemetryEvent({
891
+ eventName: "GC_DeletingLoadedDataStore",
892
+ ...(0, internal_6.tagCodeArtifacts)({
893
+ id: dataStoreId,
894
+ pkg: dataStoreContext.packagePath.join("/"),
895
+ }),
896
+ });
897
+ }
852
898
  dataStoreContext.delete();
853
899
  // Delete the contexts of unused data stores.
854
900
  this.contexts.delete(dataStoreId);
@@ -975,21 +1021,25 @@ class ChannelCollection {
975
1021
  if (typeof request.headers?.[exports.AllowInactiveRequestHeaderKey] === "boolean") {
976
1022
  headerData.allowInactive = request.headers[exports.AllowInactiveRequestHeaderKey];
977
1023
  }
978
- // We allow Tombstone requests for sub-DataStore objects
1024
+ // We allow Tombstone/Inactive requests for sub-DataStore objects
979
1025
  if (requestForChild) {
980
1026
  headerData.allowTombstone = true;
1027
+ headerData.allowInactive = true;
981
1028
  }
982
1029
  await this.waitIfPendingAlias(id);
983
1030
  const internalId = this.internalId(id);
984
- const dataStoreContext = await this.getDataStore(internalId, headerData);
985
- // Remove query params, leading and trailing slashes from the url. This is done to make sure the format is
986
- // the same as GC nodes id.
987
- const urlWithoutQuery = (0, index_js_1.trimLeadingAndTrailingSlashes)(request.url.split("?")[0]);
1031
+ const dataStoreContext = await this.getDataStore(internalId, headerData, request);
988
1032
  // Get the initial snapshot details which contain the data store package path.
989
1033
  const details = await dataStoreContext.getInitialSnapshotDetails();
990
- // Note that this will throw if the data store is inactive or tombstoned and throwing on incorrect usage
991
- // is configured.
992
- this.gcNodeUpdated(`/${urlWithoutQuery}`, "Loaded", undefined /* timestampMs */, details.pkg, request, headerData);
1034
+ // When notifying GC of this node being loaded, we only indicate the DataStore itself, not the full subDataStore url if applicable.
1035
+ // This is in case the url is to a route that Fluid doesn't understand or track for GC (e.g. if suited for a custom request handler)
1036
+ this.gcNodeUpdated({
1037
+ node: { type: "DataStore", path: `/${id}` },
1038
+ reason: "Loaded",
1039
+ packagePath: details.pkg,
1040
+ request,
1041
+ headerData,
1042
+ });
993
1043
  const dataStore = await dataStoreContext.realize();
994
1044
  const subRequest = requestParser.createSubRequest(1);
995
1045
  // We always expect createSubRequest to include a leading slash, but asserting here to protect against