@@ -13,6 +13,7 @@ import {
1313 touchKey ,
1414 updateOrCreateKey ,
1515 useDB ,
16+ findPrefixedKeysForRemoval ,
1617} from '~/lib/db'
1718import { ENV } from '~/lib/env'
1819import { logger } from '~/lib/logger'
@@ -21,6 +22,7 @@ import { getStorageDriver } from '~/lib/storage/drivers'
2122import { getObjectNameFromKey } from '~/lib/utils'
2223
2324export interface Storage {
25+ pruneCacheByKeyPrefix : ( keyPrefix : string ) => Promise < void >
2426 getCacheEntry : (
2527 keys : string [ ] ,
2628 version : string ,
@@ -68,9 +70,44 @@ export async function initializeStorage() {
6870 const driver = await driverSetup ( )
6971 const db = await useDB ( )
7072
71- storage = {
73+ storage = {
74+
75+ async pruneCacheKeys ( keysForRemoval ) {
76+ if ( keysForRemoval . length === 0 ) {
77+ logger . debug ( 'Prune: No caches to prune' )
78+ return
79+ }
80+
81+ await driver . delete ( {
82+ objectNames : keysForRemoval . map ( ( key ) => getObjectNameFromKey ( key . key , key . version ) ) ,
83+ } )
84+
85+ await pruneKeys ( db , keysForRemoval )
86+ } ,
87+
88+ async pruneStaleCacheByType ( key ) {
89+ if ( ! ENV . ENABLE_TYPED_KEY_PREFIX_REMOVAL ) {
90+ return
91+ }
92+ let keyTypeIndex = key . indexOf ( ENV . TYPED_KEY_DELIMITER )
93+ if ( keyTypeIndex < 1 ) {
94+ return
95+ }
96+ let keyType = key . substring ( 0 , keyTypeIndex )
97+ logger . debug ( `Prune by type is called: Type [${ keyType } ]. Full key [${ key } ].` )
98+ let keysForRemoval = await findPrefixedKeysForRemoval ( db , { keyPrefix : keyType , skipRecentKeysLimit : ENV . MAX_STORED_KEYS_PER_TYPE } )
99+ logger . debug ( `Removing ${ keysForRemoval . length } keys for prefix [${ keyType } ].` )
100+ await this . pruneCacheKeys ( keysForRemoval )
101+ } ,
102+
103+ async pruneCacheByKeyPrefix ( keyPrefix ) {
104+ let keysForRemoval = await findPrefixedKeysForRemoval ( db , { keyPrefix : keyPrefix , skipRecentKeysLimit : 0 } )
105+ logger . debug ( `Removing ${ keysForRemoval . length } keys for prefix [${ keyPrefix } ].` )
106+ await this . pruneCacheKeys ( keysForRemoval )
107+ } ,
108+
72109 async reserveCache ( key , version , totalSize ) {
73- logger . debug ( 'Reserve:' , { key, version } )
110+ logger . debug ( 'Reserve:' , { key, version } )
74111
75112 if ( await getUpload ( db , { key, version } ) ) {
76113 logger . debug ( `Reserve: Already reserved. Ignoring...` , { key, version } )
@@ -103,6 +140,8 @@ export async function initializeStorage() {
103140 uploadId,
104141 } )
105142
143+ this . pruneStaleCacheByType ( key )
144+
106145 return {
107146 cacheId : uploadId ,
108147 }
0 commit comments