Dashboard: Fix cache validation to prevent stale cache (#105918)

* compare dashboard updated at while fetching

* test added

* added created field in dashboard dto meta object for k8s api. fixed cache updation check

* code refactor

* code formatting with prettier

* added created at field in DashboardPageProxy.test.tsx
This commit is contained in:
Yash Suresh Chandra
2025-07-07 14:06:01 +02:00
committed by GitHub
parent 5a39f29c74
commit b9fba95849
4 changed files with 40 additions and 1 deletions
@@ -218,6 +218,39 @@ describe('DashboardScenePageStateManager v1', () => {
});
describe('caching', () => {
it('should return cached scene if updated_at matches', async () => {
const loader = new DashboardScenePageStateManager({});
// set cache
loader.setSceneCache(
'fake-dash',
new DashboardScene({ title: 'Dashboard 1', uid: 'fake-dash', meta: { created: '1' }, version: 0 }, 'v1')
);
// should return cached scene
expect(
loader.transformResponseToScene(
{
meta: { created: '1' },
dashboard: { title: 'Dashboard 1', uid: 'fake-dash', schemaVersion: 1, version: 0 },
},
{ uid: 'fake-dash', route: DashboardRoutes.Normal }
)?.state.title
).toBe('Dashboard 1');
// try loading new scene
loader.transformResponseToScene(
{
meta: { created: '2' },
dashboard: { title: 'Dashboard 2', uid: 'fake-dash', schemaVersion: 1, version: 0 },
},
{ uid: 'fake-dash', route: DashboardRoutes.Normal }
);
// should update cache with new scene
expect(loader.getSceneFromCache('fake-dash').state.title).toBe('Dashboard 2');
});
it('should take scene from cache if it exists', async () => {
setupLoadDashboardMock({ dashboard: { uid: 'fake-dash', version: 10 }, meta: {} });
@@ -371,7 +371,11 @@ export class DashboardScenePageStateManager extends DashboardScenePageStateManag
transformResponseToScene(rsp: DashboardDTO | null, options: LoadDashboardOptions): DashboardScene | null {
const fromCache = this.getSceneFromCache(options.uid);
if (fromCache && fromCache.state.version === rsp?.dashboard.version) {
if (
fromCache &&
fromCache.state.version === rsp?.dashboard.version &&
fromCache.state.meta.created === rsp?.meta.created
) {
return fromCache;
}
+1
View File
@@ -128,6 +128,7 @@ export class K8sDashboardAPI implements DashboardAPI<DashboardDTO, Dashboard> {
uid: dash.metadata.name,
k8s: dash.metadata,
version: dash.metadata.generation,
created: dash.metadata.creationTimestamp,
},
dashboard: {
...dash.spec,
@@ -33,6 +33,7 @@ const dashMock: DashboardDTO = {
},
meta: {
canEdit: false,
created: 'Friday, 4 July 2025 07:56:41 GMT+05:30',
},
};