Skip to content

Commit d02307c

Browse files
committed
feat: implement timeout handling for Redis key retrieval
1 parent e8794c7 commit d02307c

1 file changed

Lines changed: 35 additions & 2 deletions

File tree

shared-code/src/data-access-layer/data-access-objects/data-access-object-redis.ts

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat
815815
public async getTablesFromDB(): Promise<Array<TableDS>> {
816816
const redisClient = await this.getClient();
817817

818-
const allKeys = await redisClient.keys('*');
818+
const allKeys = await this.getAllKeysWithTimeout(redisClient);
819819
const prefixedTableNames = new Set<string>();
820820
const standaloneKeys: Array<{ key: string; type: string }> = [];
821821

@@ -833,7 +833,7 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat
833833
continue;
834834
}
835835
}
836-
}
836+
}
837837

838838
const tables: Array<TableDS> = [];
839839

@@ -1634,4 +1634,37 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat
16341634
}
16351635
});
16361636
}
1637+
1638+
private async getAllKeysWithScan(redisClient: RedisClientType, pattern: string = '*'): Promise<string[]> {
1639+
const allKeys: string[] = [];
1640+
const scanOptions = { MATCH: pattern, COUNT: 1000 };
1641+
let cursor = '0';
1642+
1643+
do {
1644+
const result = await redisClient.scan(cursor, scanOptions);
1645+
cursor = result.cursor.toString();
1646+
allKeys.push(...result.keys);
1647+
} while (cursor !== '0');
1648+
1649+
return allKeys;
1650+
}
1651+
1652+
private async getAllKeysWithTimeout(
1653+
redisClient: RedisClientType,
1654+
timeoutMs: number = 5000,
1655+
): Promise<string[]> {
1656+
const keysPromise = redisClient.keys('*');
1657+
1658+
const timeoutPromise = new Promise<null>((resolve) => {
1659+
setTimeout(() => resolve(null), timeoutMs);
1660+
});
1661+
1662+
const result = await Promise.race([keysPromise, timeoutPromise]);
1663+
1664+
if (result === null) {
1665+
return this.getAllKeysWithScan(redisClient);
1666+
}
1667+
1668+
return result;
1669+
}
16371670
}

0 commit comments

Comments
 (0)