|
@@ -31,15 +31,15 @@ namespace Task
|
|
|
struct QueryUpgradeControlTaskRet : CHTTPRet {
|
|
|
string m_retStr;
|
|
|
bool Parse(string strData) {
|
|
|
- m_retStr=strData;
|
|
|
+ m_retStr = strData;
|
|
|
return true;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- struct InitFSMTask : public ITaskSp{
|
|
|
+ struct InitFSMTask : public ITaskSp {
|
|
|
CUpgradeMgrEntity* Mgr;
|
|
|
explicit InitFSMTask(CUpgradeMgrEntity* e) : Mgr(e) {}
|
|
|
- void Process(){
|
|
|
+ void Process() {
|
|
|
LOG_FUNCTION();
|
|
|
|
|
|
Mgr->bNewUpgradeMgr = true;//默认新模式
|
|
@@ -50,27 +50,29 @@ namespace Task
|
|
|
LogWarn(Severity_Low, Error_Exception, WARN_TASK_START_NEW_MODE, "init new upgradeTaskMgr");
|
|
|
}
|
|
|
else {
|
|
|
- LogWarn(Severity_Low, Error_Exception, WARN_TASK_START_NEW_MODE, CSimpleStringA::Format("init new upgradeTaskMgr, version = %s",info.InstallVersion.ToString().GetData()).GetData());
|
|
|
+ LogWarn(Severity_Low, Error_Exception, WARN_TASK_START_NEW_MODE, CSimpleStringA::Format("init new upgradeTaskMgr, version = %s", info.InstallVersion.ToString().GetData()).GetData());
|
|
|
}
|
|
|
|
|
|
|
|
|
- if(Mgr->bNewUpgradeMgr){
|
|
|
- ErrorCodeEnum rc =Mgr->m_taskFSM.Init(Mgr);//启动新状态机
|
|
|
+ if (Mgr->bNewUpgradeMgr) {
|
|
|
+ ErrorCodeEnum rc = Mgr->m_taskFSM.Init(Mgr);//启动新状态机
|
|
|
if (rc != Error_Succeed)
|
|
|
{
|
|
|
LogWarn(Severity_Middle, Error_Exception, ERR_TASK_INIT_NEW_UPGRADE, "init new upgradeTaskMgr FSM fail");
|
|
|
- Mgr->m_testResult=Error_InvalidState;//自检失败
|
|
|
+ Mgr->m_testResult = Error_InvalidState;//自检失败
|
|
|
return;
|
|
|
- }else{
|
|
|
- DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("InitFSMTask")("init new upgradeTaskMgr FSM succ");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("InitFSMTask")("init new upgradeTaskMgr FSM succ");
|
|
|
Mgr->m_initSucc = true;
|
|
|
}
|
|
|
|
|
|
Mgr->m_beginSM3HashTime = CSmallDateTime::GetNow();
|
|
|
- }else{
|
|
|
+ }
|
|
|
+ else {
|
|
|
LogWarn(Severity_Low, Error_Exception, WARN_TASK_START_OLD_MODE, "init old upgradeTaskMgr");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -131,7 +133,70 @@ namespace Task
|
|
|
Sleep(30 * 1000);//继续循环
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("enter not main page, rollback version delay 30s");
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Mgr->m_taskFSM.m_bRollbackTask = false;//线程退出
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ struct RollBackDepTask : public ITaskSp {
|
|
|
+ CUpgradeMgrEntity* Mgr;
|
|
|
+ CSimpleStringA historyVersion;
|
|
|
+ explicit RollBackDepTask(CUpgradeMgrEntity* e, CSimpleStringA depVersion) : Mgr(e) {
|
|
|
+ historyVersion = depVersion;
|
|
|
+ }
|
|
|
+ void Process() {
|
|
|
+ bool loop = true;
|
|
|
+ while (loop) {
|
|
|
+ //判断是否继续执行
|
|
|
+ CSmartPointer<IConfigInfo> spConfig;
|
|
|
+ ErrorCodeEnum ret = Mgr->GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
|
|
|
+ int rollbackTemp = 0;
|
|
|
+ if (ret == Error_Succeed) {
|
|
|
+ spConfig->ReadConfigValueInt("UpgradeManager", "RollbackFlag", rollbackTemp);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get centerSetting RollbackFlag=%d", rollbackTemp);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get centerSetting RollbackFlag fail");
|
|
|
+ }
|
|
|
+ if (rollbackTemp == 0) {
|
|
|
+ //立即回退模式
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Immediate mode,begin rollback dep version");
|
|
|
+ ErrorCodeEnum rc = Mgr->m_taskFSM.RollBackToHistoryDepVersion(historyVersion);
|
|
|
+ if (rc == Error_Succeed)
|
|
|
+ {
|
|
|
+ // 通过事件通知健康实体
|
|
|
+ LogEvent(Severity_Middle, Event_DeviceAdapterRollBack_Framework_Restart, "rollback upgrade succeed");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LogWarn(Severity_Low, rc, Event_DeviceAdapterRollBack_Framework_Restart, "rollback upgrade fail");
|
|
|
+ }
|
|
|
+ loop = false;//退出
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //等待首页回退模式
|
|
|
+ CSimpleStringA strValue;
|
|
|
+ if (Mgr->GetFunction()->GetSysVar("UIState", strValue) == Error_Succeed && strValue.Compare("M") == 0) {
|
|
|
+ // 已经进入首页,开始回退
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("enter main page, begin rollback dep version");
|
|
|
+ ErrorCodeEnum rc = Mgr->m_taskFSM.RollBackToHistoryDepVersion(historyVersion);
|
|
|
+ if (rc == Error_Succeed)
|
|
|
+ {
|
|
|
+ // 通过事件通知健康实体
|
|
|
+ LogEvent(Severity_Middle, Event_DeviceAdapterRollBack_Framework_Restart, "rollback upgrade succeed");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LogWarn(Severity_Low, rc, Event_DeviceAdapterRollBack_Framework_Restart, "rollback upgrade fail");
|
|
|
+ }
|
|
|
+ loop = false;//退出
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Sleep(30 * 1000);//继续循环
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("enter not main page, rollback dep version delay 30s");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
Mgr->m_taskFSM.m_bRollbackTask = false;//线程退出
|
|
|
}
|
|
@@ -326,31 +391,48 @@ ErrorCodeEnum CUpgradeMgrEntity::RollbackUpdate(const CSimpleStringA &strVersion
|
|
|
LogWarn(Severity_Low, Error_NotImpl, ERR_TASK_ROLLBACK_FAIL, "version is empty , rollback upgrade fail");
|
|
|
return Error_NotImpl;
|
|
|
}else{
|
|
|
- ErrorCodeEnum rc = Error_Succeed;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("try rollback to version: [%s]", (const char*)strVersion);
|
|
|
- int w1, w2, w3, w4;
|
|
|
- int ret = sscanf(strVersion, "%d.%d.%d.%d", &w1, &w2, &w3, &w4);
|
|
|
- if (ret <4)
|
|
|
- {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("version [%s] parse fail", (const char*)strVersion);
|
|
|
- rc= Error_Param;
|
|
|
+ //判定适配器or应用心跳回退
|
|
|
+ string failReason = "";
|
|
|
+ CSimpleStringA strErrMsg = "";
|
|
|
+ ErrorCodeEnum err = this->m_taskFSM.judgeRollbackTaskClass(strVersion, failReason, strErrMsg);
|
|
|
+ if (err != Error_Succeed) {
|
|
|
+ LogWarn(Severity_Low, Error_Exception, ERR_TASK_ROLLBACK_FAIL, CSimpleStringA::Format("judgeRollbackTaskClass fail,err=%s", strErrMsg.GetData()).GetData());
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("judgeRollbackTaskClass fail,err=%s", strErrMsg.GetData());
|
|
|
+ return err;
|
|
|
}
|
|
|
- else
|
|
|
- { //回退放入线程当中
|
|
|
- if (!m_taskFSM.m_bRollbackTask) {
|
|
|
- Task::RollBackTask* rTask = new Task::RollBackTask(this, CVersion(w1, w2, w3, w4));
|
|
|
- ErrorCodeEnum rc = this->GetFunction()->PostThreadPoolTask(rTask);
|
|
|
- if (Error_Succeed == rc) {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread start succ");
|
|
|
- m_taskFSM.m_bRollbackTask = true;//启动线程
|
|
|
+ else {
|
|
|
+ if (!this->m_taskFSM.m_TempDepUpgradeFlag) {
|
|
|
+
|
|
|
+ ErrorCodeEnum rc = Error_Succeed;
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("try rollback to version: [%s]", (const char*)strVersion);
|
|
|
+ int w1, w2, w3, w4;
|
|
|
+ int ret = sscanf(strVersion, "%d.%d.%d.%d", &w1, &w2, &w3, &w4);
|
|
|
+ if (ret < 4)
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("version [%s] parse fail", (const char*)strVersion);
|
|
|
+ rc = Error_Param;
|
|
|
}
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread start fail : %d",(int)rc);
|
|
|
+ else
|
|
|
+ { //回退放入线程当中
|
|
|
+ if (!m_taskFSM.m_bRollbackTask) {
|
|
|
+ Task::RollBackTask* rTask = new Task::RollBackTask(this, CVersion(w1, w2, w3, w4));
|
|
|
+ ErrorCodeEnum rc = this->GetFunction()->PostThreadPoolTask(rTask);
|
|
|
+ if (Error_Succeed == rc) {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread start succ");
|
|
|
+ m_taskFSM.m_bRollbackTask = true;//启动线程
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread start fail : %d", (int)rc);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread is exist");
|
|
|
+ return Error_Succeed;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("RollbackUpdate")("RollbackFlag thread is exist");
|
|
|
- return Error_Succeed;
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|