From 300739208d21a76541e2b7841cc63f61d1ec06cf Mon Sep 17 00:00:00 2001 From: Daniel Madrid <105010181+dannimad@users.noreply.github.com> Date: Tue, 12 May 2026 23:27:00 +0000 Subject: [PATCH] chore(container-loader): tighten snapshot refresh config flag gating Drop the Fluid.Container.enableOfflineFull fallback from SnapshotRefresher's #snapshotRefreshEnabled gating. Snapshot refresh now requires Fluid.Container.enableOfflineSnapshotRefresh=true to be opted into explicitly. Adds a unit test pinning the new behavior. --- .../container-loader/src/snapshotRefresher.ts | 3 +-- .../src/test/snapshotRefresher.spec.ts | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/loader/container-loader/src/snapshotRefresher.ts b/packages/loader/container-loader/src/snapshotRefresher.ts index 66d880429456..25d427b7f0db 100644 --- a/packages/loader/container-loader/src/snapshotRefresher.ts +++ b/packages/loader/container-loader/src/snapshotRefresher.ts @@ -97,8 +97,7 @@ export class SnapshotRefresher implements IDisposable { this.#snapshotRefreshEnabled = this.offlineLoadEnabled && - (this.mc.config.getBoolean("Fluid.Container.enableOfflineSnapshotRefresh") ?? - this.mc.config.getBoolean("Fluid.Container.enableOfflineFull")) === true; + (this.mc.config.getBoolean("Fluid.Container.enableOfflineSnapshotRefresh") ?? false); this.refreshTimer = this.#snapshotRefreshEnabled ? new Timer(this.snapshotRefreshTimeoutMs, () => this.tryRefreshSnapshot()) diff --git a/packages/loader/container-loader/src/test/snapshotRefresher.spec.ts b/packages/loader/container-loader/src/test/snapshotRefresher.spec.ts index 690abedda409..3772fac60faf 100644 --- a/packages/loader/container-loader/src/test/snapshotRefresher.spec.ts +++ b/packages/loader/container-loader/src/test/snapshotRefresher.spec.ts @@ -60,6 +60,12 @@ function enableOfflineSnapshotRefresh(logger: ITelemetryBaseLogger): ITelemetryB }).logger; } +function enableOfflineFullOnly(logger: ITelemetryBaseLogger): ITelemetryBaseLogger { + return mixinMonitoringContext(logger, { + getRawConfig: (name) => (name === "Fluid.Container.enableOfflineFull" ? true : undefined), + }).logger; +} + class MockStorageAdapter implements ISerializedStateManagerDocumentStorageService { public readonly blobs = new Map(); private snapshot: ISnapshotTree; @@ -329,6 +335,23 @@ describe("SnapshotRefresher", () => { refresher.dispose(); }); + + it("should not trigger refresh when only enableOfflineFull is set", () => { + const logger = enableOfflineFullOnly(mockLogger); + const timeout = 1000; + const refresher = createRefresher(true, () => true, timeout, logger); + + refresher.startTimer(); + clock.tick(timeout); + + assert.strictEqual( + mockStorage.getVersionsCallCount, + 0, + "getVersions should not be called when only enableOfflineFull is set (enableOfflineSnapshotRefresh must be opted in explicitly)", + ); + + refresher.dispose(); + }); }); describe("tryRefreshSnapshot", () => {