diff --git a/.changeset/remove-enable-offline-load.md b/.changeset/remove-enable-offline-load.md new file mode 100644 index 000000000000..528f7cd946a6 --- /dev/null +++ b/.changeset/remove-enable-offline-load.md @@ -0,0 +1,16 @@ +--- +"@fluidframework/container-definitions": minor +"@fluidframework/container-loader": minor +"__section": legacy +--- + +Remove deprecated `ILoaderOptions.enableOfflineLoad` + +The deprecated `enableOfflineLoad` property on `ILoaderOptions` has been removed, along with the legacy `Fluid.Container.enableOfflineLoad` feature gate read from the config provider. Offline load remains enabled by default for interactive clients. + +To opt out, set `Fluid.Container.enableOfflineFull` to `false` via the config provider. To prevent silent misconfiguration, container load now throws a `UsageError` if a `pendingLocalState` is provided while `Fluid.Container.enableOfflineFull` is explicitly set to `false`. + +#### Migration + +- Remove any use of `enableOfflineLoad` from `ILoaderOptions` you pass to the `Loader`. +- If you previously set `Fluid.Container.enableOfflineLoad` via the config provider, set `Fluid.Container.enableOfflineFull` instead. diff --git a/packages/common/container-definitions/api-report/container-definitions.legacy.beta.api.md b/packages/common/container-definitions/api-report/container-definitions.legacy.beta.api.md index 1a5309202815..e632b5174835 100644 --- a/packages/common/container-definitions/api-report/container-definitions.legacy.beta.api.md +++ b/packages/common/container-definitions/api-report/container-definitions.legacy.beta.api.md @@ -436,7 +436,6 @@ export interface ILoader extends Partial { export type ILoaderOptions = { cache?: boolean; client?: IClient; - enableOfflineLoad?: boolean; provideScopeLoader?: boolean; maxClientLeaveWaitTime?: number; }; diff --git a/packages/common/container-definitions/src/loader.ts b/packages/common/container-definitions/src/loader.ts index 4af177e3a4ce..c69179d5a437 100644 --- a/packages/common/container-definitions/src/loader.ts +++ b/packages/common/container-definitions/src/loader.ts @@ -610,11 +610,6 @@ export type ILoaderOptions = { */ client?: IClient; - /** - * @deprecated Do not use. - */ - enableOfflineLoad?: boolean; - /** * Provide the current Loader through the scope object when creating Containers. It is added * as the `ILoader` property, and will overwrite an existing property of the same name on the diff --git a/packages/loader/container-loader/src/container.ts b/packages/loader/container-loader/src/container.ts index 93300a5f34ca..b711922bc77e 100644 --- a/packages/loader/container-loader/src/container.ts +++ b/packages/loader/container-loader/src/container.ts @@ -961,11 +961,14 @@ export class Container enableSummarizeProtocolTree, ); - const offlineLoadEnabled = - this.isInteractiveClient && - (this.mc.config.getBoolean("Fluid.Container.enableOfflineLoad") ?? - this.mc.config.getBoolean("Fluid.Container.enableOfflineFull") ?? - options.enableOfflineLoad !== false); + const explicitOfflineFull = this.mc.config.getBoolean("Fluid.Container.enableOfflineFull"); + // paranoic defense mechanism while enableOfflineFull still exists in config. + if (pendingLocalState !== undefined && explicitOfflineFull === false) { + throw new UsageError( + "Cannot load from pending local state when Fluid.Container.enableOfflineFull is explicitly disabled", + ); + } + const offlineLoadEnabled = this.isInteractiveClient && (explicitOfflineFull ?? true); this.serializedStateManager = new SerializedStateManager( this.subLogger, this.storageAdapter, diff --git a/packages/test/test-service-load/src/optionsMatrix.ts b/packages/test/test-service-load/src/optionsMatrix.ts index 12eaae8287f7..1f2ea5f05b40 100644 --- a/packages/test/test-service-load/src/optionsMatrix.ts +++ b/packages/test/test-service-load/src/optionsMatrix.ts @@ -34,7 +34,6 @@ const loaderOptionsMatrix: OptionsMatrix = { client: [undefined], provideScopeLoader: booleanCases, maxClientLeaveWaitTime: numberCases, - enableOfflineLoad: booleanCases, enableOfflineSnapshotRefresh: booleanCases, snapshotRefreshTimeoutMs: [undefined, 60 * 5 * 1000 /* 5min */], }; diff --git a/packages/test/test-service-load/src/runner.ts b/packages/test/test-service-load/src/runner.ts index 65f5dc1eb545..d2e017d30bf1 100644 --- a/packages/test/test-service-load/src/runner.ts +++ b/packages/test/test-service-load/src/runner.ts @@ -550,10 +550,7 @@ async function scheduleOffline( if (container.closed) { return undefined; } - if ( - runConfig.loaderConfig?.enableOfflineLoad === true && - random.real() < stashPercent - ) { + if (random.real() < stashPercent) { printStatus(runConfig, "closing offline container!"); const pendingState = await asLegacyAlpha(container).getPendingLocalState(); container.close();