perf(main): reuse task snapshots for projections
This commit is contained in:
parent
b32cc59b46
commit
172ddad18a
2 changed files with 18 additions and 10 deletions
|
|
@ -1107,7 +1107,13 @@ export class TeamDataService {
|
||||||
}
|
}
|
||||||
|
|
||||||
async getAllTasks(): Promise<GlobalTask[]> {
|
async getAllTasks(): Promise<GlobalTask[]> {
|
||||||
const rawTasks = await this.taskReader.getAllTasks();
|
const taskReader = this.taskReader as TeamTaskReader & {
|
||||||
|
getAllTasksProjectionSnapshot?: () => Promise<readonly (TeamTask & { teamName: string })[]>;
|
||||||
|
};
|
||||||
|
const rawTasks =
|
||||||
|
typeof taskReader.getAllTasksProjectionSnapshot === 'function'
|
||||||
|
? await taskReader.getAllTasksProjectionSnapshot()
|
||||||
|
: await taskReader.getAllTasks();
|
||||||
const teamInfoMap = await this.readGlobalTaskTeamInfo(rawTasks);
|
const teamInfoMap = await this.readGlobalTaskTeamInfo(rawTasks);
|
||||||
|
|
||||||
const MAX_GLOBAL_TASKS_EXPORTED = 500;
|
const MAX_GLOBAL_TASKS_EXPORTED = 500;
|
||||||
|
|
|
||||||
|
|
@ -566,28 +566,31 @@ export class TeamTaskReader {
|
||||||
}
|
}
|
||||||
|
|
||||||
async getAllTasks(): Promise<(TeamTask & { teamName: string })[]> {
|
async getAllTasks(): Promise<(TeamTask & { teamName: string })[]> {
|
||||||
|
const tasks = await this.getAllTasksProjectionSnapshot();
|
||||||
|
return cloneTasks(tasks);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getAllTasksProjectionSnapshot(): Promise<readonly (TeamTask & { teamName: string })[]> {
|
||||||
const startedAt = Date.now();
|
const startedAt = Date.now();
|
||||||
const cached = TeamTaskReader.allTasksCache;
|
const cached = TeamTaskReader.allTasksCache;
|
||||||
if (cached && cached.expiresAt > Date.now()) {
|
if (cached && cached.expiresAt > Date.now()) {
|
||||||
const cloned = cloneTasks(cached.value);
|
|
||||||
const ms = Date.now() - startedAt;
|
const ms = Date.now() - startedAt;
|
||||||
if (ms >= 1500) {
|
if (ms >= 1500) {
|
||||||
logger.warn(`[getAllTasks] cache clone slow ms=${ms} tasks=${cloned.length}`);
|
logger.warn(`[getAllTasks] cache read slow ms=${ms} tasks=${cached.value.length}`);
|
||||||
}
|
}
|
||||||
return cloned;
|
return cached.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TeamTaskReader.allTasksInFlight?.generationAtStart === TeamTaskReader.allTasksGeneration) {
|
if (TeamTaskReader.allTasksInFlight?.generationAtStart === TeamTaskReader.allTasksGeneration) {
|
||||||
const waitedAt = Date.now();
|
const waitedAt = Date.now();
|
||||||
const tasks = await TeamTaskReader.allTasksInFlight.promise;
|
const tasks = await TeamTaskReader.allTasksInFlight.promise;
|
||||||
const cloned = cloneTasks(tasks);
|
|
||||||
const ms = Date.now() - startedAt;
|
const ms = Date.now() - startedAt;
|
||||||
if (ms >= 1500) {
|
if (ms >= 1500) {
|
||||||
logger.warn(
|
logger.warn(
|
||||||
`[getAllTasks] in-flight wait slow ms=${ms} waitMs=${Date.now() - waitedAt} tasks=${cloned.length}`
|
`[getAllTasks] in-flight wait slow ms=${ms} waitMs=${Date.now() - waitedAt} tasks=${tasks.length}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return cloned;
|
return tasks;
|
||||||
}
|
}
|
||||||
|
|
||||||
const request = this.readAllTasksUncached();
|
const request = this.readAllTasksUncached();
|
||||||
|
|
@ -604,12 +607,11 @@ export class TeamTaskReader {
|
||||||
expiresAt: Date.now() + ALL_TASKS_CACHE_TTL_MS,
|
expiresAt: Date.now() + ALL_TASKS_CACHE_TTL_MS,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
const cloned = cloneTasks(tasks);
|
|
||||||
const ms = Date.now() - startedAt;
|
const ms = Date.now() - startedAt;
|
||||||
if (ms >= 1500) {
|
if (ms >= 1500) {
|
||||||
logger.warn(`[getAllTasks] total slow ms=${ms} tasks=${cloned.length}`);
|
logger.warn(`[getAllTasks] total slow ms=${ms} tasks=${tasks.length}`);
|
||||||
}
|
}
|
||||||
return cloned;
|
return tasks;
|
||||||
} finally {
|
} finally {
|
||||||
if (TeamTaskReader.allTasksInFlight?.promise === request) {
|
if (TeamTaskReader.allTasksInFlight?.promise === request) {
|
||||||
TeamTaskReader.allTasksInFlight = null;
|
TeamTaskReader.allTasksInFlight = null;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue