界面升级过程中,会话未过期且15s后的查询升级任务接口报错;这种情况下”升级失败“必现;

问题描述

做固件升级时任务完成;但是偶现问题-界面报错“升级失败“;经定位升级任务完成后,在 15s后的查询升级任务接口报错;且会话未过期,这种情况下”升级失败“必现;但是15s后这个接口请求有时候成功有时候失败;

评论里补充图片-图1-接口及报错界面

环境信息

  • 操作系统:window 10

  • 软件版本:630节点版本

重现步骤

  1. 升级ibmc固件包;升级过程中点击界面任意位置;触发最新的keeplive接口;保证界面会话时间(会话超期出现弹窗会清除定时器)

    1. 评论里补充图片-图2-失败后端返回
  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,
    });
  }
}

补充图片
图1-接口及报错界面

图2-失败后端返回

图3-失败后端返回

图4-成功后端返回

15s后定时器触发请求异常导致偶现"升级失败"问题分析

问题根因分析

scheduleDelayedRequery 在任务完成后重新启动定时器 (第736-758行)
升级任务成功后;15s后触发queryParallelTask方法,但此时bmc已重启;接口异常状态,就会走handleReqError方法,在会话未过期时间窗口内以2s请求一次的频率触发请求;累计10次后界面报错;

竞态场景:

  1. 任务完成 → 进入 taskParallelCompleted() → 清除 taskInterval
  2. 但此时 tableData 仍在(已解析的 Completed 状态),第740行 hasFinishedTask = true
  3. scheduleDelayedRequery 设置 checkClearTimeout 15秒后执行
  4. 15秒后重新调用 queryParallelTask,接口可能因 BMC 重启中而返回异常
  5. 进入 handleReqError → failCount 累积到 10 → 弹窗"升级失败"

方案确认

任务成功后15s后执行的这个机制初衷是什么;

文件路径

src\pages\Manager\Upgrade\components\manual\UpgradeModeStep1.vue

任务完成15后接口请求条件

// 升级完成/失败后,15秒延迟重新查询一次任务状态(防抖:轮询期间每次重置计时器,仅触发一次)
function scheduleDelayedRequery() {
  if (isDelayedRequery) {
    return;
  }
  const hasFinishedTask = tableData.some(item => ['Completed', 'Exception'].includes(item.state));
  if (!hasFinishedTask) {
    return;
  }
  // 取消上一次的延迟查询,避免重复请求
  if (checkClearTimeout) {
    clearTimeout(checkClearTimeout);
    checkClearTimeout = null;
  }
  checkClearTimeout = setTimeout(async () => {
    checkClearTimeout = null;
    if (isUnmounted) {
      return;
    }
    isDelayedRequery = true;
    await queryParallelTask();
    isDelayedRequery = false;
  }, 15000);
}

// 接口异常处理逻辑
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,
    });
  }
}

问题已修复。

issue: [缺陷]: WEB做CSR固件包升级操作,提示升级失败,实际升级成功 ,影响运维功能,出现概率 1/5-webui-AtomGit

PR链接为:【修改描述】【WEB前端】【固件升级】在2280V3环境下,WEB做CSR固件包升级操作,提示升级失败,实际升级成功 ,影响运维功能,出现概率 1/5-webui-AtomGit