task-47: 轮询 baseline 统计补强测试
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user