mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-14 21:26:15 -08:00
chore(perf): prepare database post-GC capture
This commit is contained in:
1 parent
918c8f2ded
commit
1fe6f30e64
4 files changed
+229
No files matched your search
@@ -0,0 +1,70 @@
|
||||
export type DatabaseWorkerPostGcUnavailableReason =
|
||||
| 'database-worker-missing'
|
||||
| 'database-worker-not-idle'
|
||||
| 'multiple-database-workers';
|
||||
|
||||
export interface DatabaseWorkerPostGcSelectionRecord {
|
||||
readonly captureGeneration: number | null;
|
||||
readonly kind: string;
|
||||
readonly ordinal: number;
|
||||
readonly pendingCount: number;
|
||||
}
|
||||
|
||||
export interface DatabaseWorkerPostGcSelection<T> {
|
||||
readonly selected: T | null;
|
||||
readonly unavailableReason: DatabaseWorkerPostGcUnavailableReason | null;
|
||||
}
|
||||
|
||||
export interface DatabaseWorkerPostGcSelectionApi {
|
||||
select<T extends DatabaseWorkerPostGcSelectionRecord>(
|
||||
records: readonly T[],
|
||||
activeGeneration: number
|
||||
): DatabaseWorkerPostGcSelection<T>;
|
||||
}
|
||||
|
||||
export function createDatabaseWorkerPostGcSelectionApi(): DatabaseWorkerPostGcSelectionApi {
|
||||
const helpers = {
|
||||
select<T extends DatabaseWorkerPostGcSelectionRecord>(
|
||||
records: readonly T[],
|
||||
activeGeneration: number
|
||||
): DatabaseWorkerPostGcSelection<T> {
|
||||
const currentDatabaseWorkers: T[] = [];
|
||||
for (const record of records) {
|
||||
if (
|
||||
record.captureGeneration === activeGeneration &&
|
||||
record.kind === 'database.worker'
|
||||
) {
|
||||
currentDatabaseWorkers.push(record);
|
||||
}
|
||||
}
|
||||
|
||||
if (currentDatabaseWorkers.length === 0) {
|
||||
return Object.freeze({
|
||||
selected: null,
|
||||
unavailableReason: 'database-worker-missing',
|
||||
});
|
||||
}
|
||||
if (currentDatabaseWorkers.length > 1) {
|
||||
return Object.freeze({
|
||||
selected: null,
|
||||
unavailableReason: 'multiple-database-workers',
|
||||
});
|
||||
}
|
||||
|
||||
const selected = currentDatabaseWorkers[0] as T;
|
||||
if (selected.pendingCount > 0) {
|
||||
return Object.freeze({
|
||||
selected: null,
|
||||
unavailableReason: 'database-worker-not-idle',
|
||||
});
|
||||
}
|
||||
|
||||
return Object.freeze({
|
||||
selected,
|
||||
unavailableReason: null,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
return Object.freeze({ select: helpers.select });
|
||||
}
|
||||
Reference in new issue
Block a user