问题描述
做固件升级时任务完成;但是偶现问题-界面报错“升级失败“;经定位升级任务完成后,在 15s后的查询升级任务接口报错;且会话未过期,这种情况下”升级失败“必现;但是15s后这个接口请求有时候成功有时候失败;
评论里补充图片-图1-接口及报错界面
环境信息
-
操作系统:window 10
-
软件版本:630节点版本
重现步骤
-
升级ibmc固件包;升级过程中点击界面任意位置;触发最新的keeplive接口;保证界面会话时间(会话超期出现弹窗会清除定时器)
- 评论里补充图片-图2-失败后端返回
-
升级任务完成后;会触发一个15s后的请求,这个请求有时候成功,有时候失败;成功后拿到空数组,清除定时器;如果失败,会触发2s一次的轮询接口;10次失败后且会话超时弹窗没出现;界面就会出现报错
失败接口截图
评论里补充图片-图3-失败后端返回
成功接口截图
评论里补充图片-图4-成功后端返回
期望结果
界面升级任务跑完且升级成功了;不会出现提示“升级失败“
实际结果
非必现问题,如果升级任务完成后;15s后的升级进度接口报错且会话未过期;就会必现以上 问题
尝试过的解决方案
15后接口异常且前一次请求结果中没有 Running 任务;清除定时器
影响场景:
15秒 checkClearTimeout 触发 queryParallelTask 后,如果任务已结束(modeDisabled = false),会清掉 handleReqError 刚设置的 taskInterval。
这导致的问题:正常升级轮询过程中,如果用户页面一直保持打开,某次 queryParallelTask 调用时接口刚好异常,且没有 Running 任务(任务已完成但接口异常返回前),handleReqError 设了 taskInterval,但回到 scheduleDelayedRequery 后被 clearQueryProgress 清掉。现在想求证这个15s后的定时任务初衷是什么;异常情况下是否能把错误轮询机制的定时器清理了
分析结论
当前会话有效期和升级任务轮询接口之间存在偶现性的时序问题;根因就在于会话有效期内;升级任务完成后;15s后请求的这个UI/Rest/BMCSettings/UpdateService/UpdateProgress接口偶现异常;进而造成10次异常后界面弹出错误提示 。
function handleReqError(err: any) {
failCount.value += 1;
if (failCount.value < 10) {
taskInterval = setTimeout(queryParallelTask, 2000);
} else {
clearQueryProgress();
bmcUpdating = false;
elNotification.closeAll();
onUpgrade.value = false;
retainedDisabled.value = false;
configRadioDisabled.value = false;
modeDisabled.value = false;
forceUpdateDisabled.value = false;
uploadDisabled.value = isSystemLock.value;
uploadConfig.disabled = isSystemLock.value;
uploadRef.value.clear();
isInit.value = false;
tableData.splice(0);
filteredTable.value.splice(0);
failCount.value = 0;
elNotification({
title: traduction('IBMC_FIMWARE_FAILED'),
position: 'bottom-right',
type: 'error',
offset: 10,
});
}
}



