fix(api): prevent startup failure from meilisearch outage
This commit is contained in:
parent
868ddecda4
commit
f964a4eabb
@ -90,31 +90,39 @@ export function createInitializer(config: APIConfig, logger: ILogger): () => Pro
|
|||||||
}
|
}
|
||||||
|
|
||||||
logger.info({search_url: config.search.url}, 'Initializing search...');
|
logger.info({search_url: config.search.url}, 'Initializing search...');
|
||||||
await initializeSearch();
|
let searchInitialized = false;
|
||||||
logger.info('Search initialized');
|
try {
|
||||||
|
await initializeSearch();
|
||||||
|
searchInitialized = true;
|
||||||
|
logger.info('Search initialized');
|
||||||
|
} catch (error) {
|
||||||
|
logger.warn({error}, 'Search initialisation failed; continuing startup without search');
|
||||||
|
}
|
||||||
|
|
||||||
// All API replicas share the same Meilisearch cluster, so only one should warm it.
|
// All API replicas share the same Meilisearch cluster, so only one should warm it.
|
||||||
const warmupLockKey = 'fluxer:search:warmup:admin';
|
if (searchInitialized) {
|
||||||
const warmupLockToken = randomUUID();
|
const warmupLockKey = 'fluxer:search:warmup:admin';
|
||||||
const warmupLockTtlSeconds = 60 * 60;
|
const warmupLockToken = randomUUID();
|
||||||
const acquiredWarmupLock = await kvClient.setnx(warmupLockKey, warmupLockToken, warmupLockTtlSeconds);
|
const warmupLockTtlSeconds = 60 * 60;
|
||||||
if (!acquiredWarmupLock) {
|
const acquiredWarmupLock = await kvClient.setnx(warmupLockKey, warmupLockToken, warmupLockTtlSeconds);
|
||||||
logger.info('Another API instance is warming search indexes, skipping warmup');
|
if (!acquiredWarmupLock) {
|
||||||
} else {
|
logger.info('Another API instance is warming search indexes, skipping warmup');
|
||||||
try {
|
} else {
|
||||||
await warmupAdminSearchIndexes({
|
|
||||||
userRepository: new UserRepository(),
|
|
||||||
guildRepository: new GuildDataRepository(),
|
|
||||||
reportRepository: new ReportRepository(),
|
|
||||||
logger,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
logger.error({error}, 'Admin search warmup failed (continuing startup)');
|
|
||||||
} finally {
|
|
||||||
try {
|
try {
|
||||||
await kvClient.releaseLock(warmupLockKey, warmupLockToken);
|
await warmupAdminSearchIndexes({
|
||||||
|
userRepository: new UserRepository(),
|
||||||
|
guildRepository: new GuildDataRepository(),
|
||||||
|
reportRepository: new ReportRepository(),
|
||||||
|
logger,
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.warn({error}, 'Failed to release admin search warmup lock');
|
logger.error({error}, 'Admin search warmup failed (continuing startup)');
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
await kvClient.releaseLock(warmupLockKey, warmupLockToken);
|
||||||
|
} catch (error) {
|
||||||
|
logger.warn({error}, 'Failed to release admin search warmup lock');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user