perf: extend persisted runtime probe cache

This commit is contained in:
777genius 2026-05-29 14:04:28 +03:00
parent dd71420314
commit d0c6fdd28c
2 changed files with 59 additions and 4 deletions

View file

@ -3295,6 +3295,7 @@ export class TeamProvisioningService {
private static readonly SAME_TEAM_RUN_START_SKEW_MS = 1_000;
private static readonly SAME_TEAM_PERSIST_RETRY_MS = 2_000;
private static readonly AGENT_RUNTIME_SNAPSHOT_CACHE_TTL_MS = 2_000;
private static readonly PERSISTED_AGENT_RUNTIME_SNAPSHOT_CACHE_TTL_MS = 5_000;
private static readonly AGENT_RUNTIME_RESOURCE_HISTORY_LIMIT = 60;
private static readonly BOOTSTRAP_TRANSCRIPT_OUTCOME_CACHE_MAX_ENTRIES = 2_048;
private static readonly MAX_RUNTIME_TREE_PIDS_PER_ROOT = 64;
@ -4867,6 +4868,13 @@ export class TeamProvisioningService {
return this.getProvisioningRunId(teamName) ?? this.getAliveRunId(teamName);
}
private getAgentRuntimeSnapshotCacheTtlMs(teamName: string, runId: string | null): number {
if (runId || this.runtimeAdapterRunByTeam.has(teamName)) {
return TeamProvisioningService.AGENT_RUNTIME_SNAPSHOT_CACHE_TTL_MS;
}
return TeamProvisioningService.PERSISTED_AGENT_RUNTIME_SNAPSHOT_CACHE_TTL_MS;
}
private canDeliverToTrackedRuntimeRun(teamName: string, runId: string): boolean {
const runtimeProgress = this.runtimeAdapterProgressByRunId.get(runId);
if (
@ -14589,7 +14597,7 @@ export class TeamProvisioningService {
this.getTrackedRunId(teamName) === runId
) {
this.agentRuntimeSnapshotCache.set(teamName, {
expiresAtMs: Date.now() + TeamProvisioningService.AGENT_RUNTIME_SNAPSHOT_CACHE_TTL_MS,
expiresAtMs: Date.now() + this.getAgentRuntimeSnapshotCacheTtlMs(teamName, runId),
snapshot,
});
}
@ -25330,7 +25338,7 @@ export class TeamProvisioningService {
);
}
this.runtimeProcessRowsForUsageSnapshotByTeam.set(teamName, {
expiresAtMs: Date.now() + TeamProvisioningService.AGENT_RUNTIME_SNAPSHOT_CACHE_TTL_MS,
expiresAtMs: Date.now() + this.getAgentRuntimeSnapshotCacheTtlMs(teamName, runId),
generation: generationAtStart,
runId,
rows: processTableAvailable ? processRows : null,
@ -25491,7 +25499,7 @@ export class TeamProvisioningService {
this.getTrackedRunId(teamName) === runId
) {
this.liveTeamAgentRuntimeMetadataCache.set(teamName, {
expiresAtMs: Date.now() + TeamProvisioningService.AGENT_RUNTIME_SNAPSHOT_CACHE_TTL_MS,
expiresAtMs: Date.now() + this.getAgentRuntimeSnapshotCacheTtlMs(teamName, runId),
metadata: this.cloneLiveTeamAgentRuntimeMetadata(metadataByMember),
runId,
});
@ -25796,7 +25804,9 @@ export class TeamProvisioningService {
const resultRows = rows && rows.length > 0 ? rows : runtimeProcessTableAvailable ? [] : null;
this.runtimeProcessRowsForUsageSnapshotByTeam.set(teamName, {
expiresAtMs: Date.now() + TeamProvisioningService.AGENT_RUNTIME_SNAPSHOT_CACHE_TTL_MS,
expiresAtMs:
Date.now() +
this.getAgentRuntimeSnapshotCacheTtlMs(teamName, this.getTrackedRunId(teamName)),
generation: this.getRuntimeSnapshotCacheGeneration(teamName),
runId: this.getTrackedRunId(teamName),
rows: resultRows,

View file

@ -3385,6 +3385,51 @@ describe('TeamProvisioningService', () => {
expect(listRuntimeProcessTableForCurrentPlatform).toHaveBeenCalledTimes(1);
});
it('uses a longer live runtime metadata cache for persisted teams without a tracked run', async () => {
vi.useFakeTimers();
vi.setSystemTime(new Date('2026-05-03T12:00:00.000Z'));
const svc = new TeamProvisioningService();
(svc as any).configReader = {
getConfig: vi.fn(async () => ({
members: [
{ name: 'team-lead', agentType: 'team-lead' },
{ name: 'alice', model: 'gpt-5.4-mini' },
],
})),
};
vi.mocked(listRuntimeProcessTableForCurrentPlatform).mockResolvedValue([]);
await (svc as any).getLiveTeamAgentRuntimeMetadata('runtime-team');
vi.setSystemTime(new Date('2026-05-03T12:00:03.000Z'));
await (svc as any).getLiveTeamAgentRuntimeMetadata('runtime-team');
vi.setSystemTime(new Date('2026-05-03T12:00:06.000Z'));
await (svc as any).getLiveTeamAgentRuntimeMetadata('runtime-team');
expect(listRuntimeProcessTableForCurrentPlatform).toHaveBeenCalledTimes(2);
});
it('keeps the short live runtime metadata cache for tracked runs', async () => {
vi.useFakeTimers();
vi.setSystemTime(new Date('2026-05-03T12:00:00.000Z'));
const svc = new TeamProvisioningService();
(svc as any).configReader = {
getConfig: vi.fn(async () => ({
members: [
{ name: 'team-lead', agentType: 'team-lead' },
{ name: 'alice', model: 'gpt-5.4-mini' },
],
})),
};
(svc as any).aliveRunByTeam.set('runtime-team', 'run-1');
vi.mocked(listRuntimeProcessTableForCurrentPlatform).mockResolvedValue([]);
await (svc as any).getLiveTeamAgentRuntimeMetadata('runtime-team');
vi.setSystemTime(new Date('2026-05-03T12:00:03.000Z'));
await (svc as any).getLiveTeamAgentRuntimeMetadata('runtime-team');
expect(listRuntimeProcessTableForCurrentPlatform).toHaveBeenCalledTimes(2);
});
it('clears runtime probe caches when starting a new run for the team', async () => {
const svc = new TeamProvisioningService();
(svc as any).configReader = {