Skip to content

Commit e4947c0

Browse files
Merge pull request #1593 from input-output-hk/feat/LW-12228-improve-caching-mechanism
feat: make metadata update operation atomic in persisten cache storage
2 parents 66e1864 + 6875804 commit e4947c0

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

packages/web-extension/src/storage/persistentCacheStorage/persistentCacheStorage.ts

+19-10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export const makePersistentCacheStorageFactory =
3333
resourceName: string;
3434
quotaInBytes: number;
3535
}): Cache<T> => {
36+
let metadataUpdateQueue = Promise.resolve();
3637
const loaded = createVolatileCache<T>();
3738
const metadataKey = makeMetadataKey(resourceName);
3839
const getItemKey = (key: string) => makeItemKey(resourceName, key);
@@ -42,15 +43,22 @@ export const makePersistentCacheStorageFactory =
4243
return result[metadataKey] as Metadata;
4344
};
4445

46+
const updateMetadata = async (mutate: (metadata: Metadata) => Metadata) => {
47+
metadataUpdateQueue = metadataUpdateQueue.then(async () => {
48+
const currentMetadata = await getMetadata();
49+
const nextMetadata = mutate(currentMetadata);
50+
await extensionLocalStorage.set({ [metadataKey]: nextMetadata });
51+
});
52+
return metadataUpdateQueue;
53+
};
54+
4555
const updateAccessTime = async (key: string) => {
46-
const metadata = await getMetadata();
47-
const nextMetadata: Metadata = {
56+
await updateMetadata((metadata) => ({
4857
...metadata,
4958
[key]: {
5059
accessTime: Date.now()
5160
}
52-
};
53-
await extensionLocalStorage.set({ [metadataKey]: nextMetadata });
61+
}));
5462
};
5563

5664
const isQuotaExceeded = async () => {
@@ -67,7 +75,7 @@ export const makePersistentCacheStorageFactory =
6775
};
6876

6977
const evict = async () => {
70-
let metadata = await getMetadata();
78+
const metadata = await getMetadata();
7179
const mostDatedKeysToPurge = Object.entries(metadata)
7280
.map(([key, { accessTime }]) => ({ accessTime, key }))
7381
.sort((a, b) => a.accessTime - b.accessTime)
@@ -78,11 +86,12 @@ export const makePersistentCacheStorageFactory =
7886
.map((i) => i.key);
7987

8088
await extensionLocalStorage.remove(mostDatedKeysToPurge);
81-
metadata = await getMetadata();
82-
for (const key of mostDatedKeysToPurge) {
83-
delete metadata[key];
84-
}
85-
await extensionLocalStorage.set({ [metadataKey]: metadata });
89+
await updateMetadata((currentMetadata) => {
90+
for (const key of mostDatedKeysToPurge) {
91+
delete currentMetadata[key];
92+
}
93+
return currentMetadata;
94+
});
8695
};
8796

8897
return {

0 commit comments

Comments
 (0)