task-47: 轮询 baseline 统计补强测试

This commit is contained in:
2026-08-31 22:47:47 +08:00
parent 969c5a2a67
commit 0cc7380205
3 changed files with 188 additions and 2 deletions
@@ -194,6 +194,7 @@ export function useTaskProgressLoop<TDetail>(
try {
const result = await options.fetchProgress(ids)
const items = result?.items || []
baseline?.recordResponseItems(items, (detail) => options.extractTaskId(detail))
const terminalEvents: Array<{ taskId: number; detail: TDetail | undefined; status: string }> = []
const nextStatuses = { ...taskStatuses.value }
for (const detail of items) {
@@ -226,6 +227,7 @@ export function useTaskProgressLoop<TDetail>(
}
} catch (error) {
if (!disposed) {
baseline?.recordFailure()
const attempt = failureCount
failureCount = Math.min(failureCount + 1, 100)
options.onError?.(error, attempt)
@@ -32,6 +32,8 @@ export interface TaskPollingBaselineStats {
droppedCount: number
/** 缓存条目 key(按首次到达顺序) */
entryKeys: number[]
/** 轮询失败次数(网络错误等,不触发终态) */
failureCount: number
}
/** 每条缓存条目的固定估算开销:key + 记录结构 + 文本编码余量 */
@@ -56,6 +58,7 @@ export function createTaskPollingBaseline(options: TaskPollingBaselineOptions =
let largestResponseBytes = 0
let cachedBytes = 0
let droppedCount = 0
let failureCount = 0
function evictIfNeeded() {
while (cache.size > maxEntries || cachedBytes > maxCacheBytes) {
@@ -72,6 +75,11 @@ export function createTaskPollingBaseline(options: TaskPollingBaselineOptions =
requestCount += 1
}
/** 记录一次轮询失败(网络错误/超时等,不影响缓存) */
function recordFailure() {
failureCount += 1
}
/**
* 记录一次批量进度响应,返回成功写入缓存的条目数。
* items 非数组、extractKey 非函数或 key 提取抛错时整个调用失败,不产生任何状态变更。
@@ -125,6 +133,7 @@ export function createTaskPollingBaseline(options: TaskPollingBaselineOptions =
largestResponseBytes = 0
cachedBytes = 0
droppedCount = 0
failureCount = 0
}
function stats(): TaskPollingBaselineStats {
@@ -136,10 +145,11 @@ export function createTaskPollingBaseline(options: TaskPollingBaselineOptions =
cachedBytes,
droppedCount,
entryKeys: [...cache.keys()],
failureCount,
}
}
return { recordRequest, recordResponseItems, reset, stats }
return { recordRequest, recordResponseItems, recordFailure, reset, stats }
}
export type TaskPollingBaseline = ReturnType<typeof createTaskPollingBaseline>