Browse Source

Z991239-5406 #comment 调整定时重启系统逻辑:计算操作系统启动以来的tick,在设定的定期重启10分钟内,重启系统

oilyang 1 year ago
parent
commit
0fdbeed014

+ 3 - 11
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -28,15 +28,7 @@ using namespace std;
 const int MAX_AYSNC_TIMEOUT = 60000;
 const int MAX_IGNORE_TIMEOUT = 100;
 
-unsigned long long GetTickCountRVC() {
-#if defined(RVC_OS_WIN)
-	return GetTickCount64();
-#else
-	struct timespec ts;
-	clock_gettime(CLOCK_MONOTONIC, &ts);
-	return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
-#endif //RVC_OS_WIN
-}
+
 unsigned long long GetLastErrorRVC() {
 #if defined(RVC_OS_WIN)
 	return GetLastError();
@@ -893,7 +885,7 @@ void CHealthManagerFSM::ToLogWarnTermAboutInfo()
 			if (strEntityIdx[i] == 0)
 			{
 				shellStartTime = Infos[i].startTime;
-				ULONGLONG dwElapseNow = GetTickCount64();
+				ULONGLONG dwElapseNow = SP::Module::Comm::RVCGetTickCount();
 				totalCost = dwElapseNow - m_ullElapseFromOSStart;
 				LogWarn(Severity_Low, Error_Debug, LOG_TRACE_ENTITY_START_TIME,
 					SP::Module::Util::generateConsumeTimeJson("total", SP::Module::Util::formatTime(shellStartTime).c_str(), totalCost).GetData());
@@ -983,7 +975,7 @@ void CHealthManagerFSM::ToLogWarnTermAboutInfo()
 	char xOSTime[64] = {0};
 
 	char elapseTime[64] = {0};//使用机器启动时间秒数
-	ULONGLONG dwElapse = GetTickCountRVC();
+	ULONGLONG dwElapse = SP::Module::Comm::RVCGetTickCount();
 	DWORD elapseTimeTemp = dwElapse / 1000;
 #if defined(RVC_OS_WIN)
 	termInfo["OSTime"] = itoa(m_elapseTimeFromOSStart, xOSTime, 10);

+ 18 - 28
Module/mod_healthmanager/mod_healthmanager.cpp

@@ -62,7 +62,7 @@ const DWORD HEALTHMANAGER_WAIT_MAINPAGE_OPEN_TIMER_ID = 2;
 const DWORD HEALTHMANAGER_SELFCHECK_TIMER_ID = 3;
 const DWORD HEALTHMANAGER_TIMER_INTERVAL = 60000;
 const DWORD HEALTHMANAGER_WAIT_MAINPAGE_OPEN_TIMER_INTERVAL = 60000;
-const DWORD HEALTHMANAGER_TIMER_INTERVAL_MINUTE = (HEALTHMANAGER_TIMER_INTERVAL/60000)*3;
+const DWORD HEALTHMANAGER_REBOOT_OS_IN_MINUTES_AFTER_TIME = 10;
 const DWORD HEALTHMANAGER_SELFCHECK_TIMER_INTERVAL = 60000;
 const int MAX_STOP_AYSNC_TIMEOUT = 20000;
 const int MAX_TERM_AYSNC_TIMEOUT = 30000;
@@ -350,7 +350,7 @@ ErrorCodeEnum CHealthManagerEntity::RestartModule(const char* pEntityName)
 	if (it == m_modRunInfo.end())
 	{
 		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("add %s to modfuninfo(%d).",pEntityName,m_modRunInfo.size());
-		m_modRunInfo[pEntityName].dwStart = GetTickCountRVC();
+		m_modRunInfo[pEntityName].dwStart = SP::Module::Comm::RVCGetTickCount();
 	}
 	else
 	{
@@ -426,31 +426,25 @@ void CHealthManagerEntity::OnCheckTimeTimeout()
 			FrameworkShutdown();
 		}
 	}
-	SYSTEMTIME localTime;
-	GetLocalTimeRVC(localTime);
+
+	m_OSRunTicks = SP::Module::Comm::RVCGetTickCount();
+	//oilyang@20240603 reboot os after reaching setting time in 10 minutes
+	if (m_OSRunTicks > (m_restartHour * 60 * 60 * 1000 + m_restartMinute * 60 * 1000)
+		&& m_OSRunTicks < (m_restartHour * 60 * 60 * 1000 + (m_restartMinute + HEALTHMANAGER_REBOOT_OS_IN_MINUTES_AFTER_TIME) * 60 * 1000))
+	{
+		m_eRebootTrigger = RebootTrigger_Period;
+		m_eRebootWay = RebootWay_Power;
+		BOOL bRet = SystemRestart(true);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnCheckTimeTimeout")("restart machine bRet=%d, LastError=%d", bRet, GetLastError());
+	}
+
 	ErrorCodeEnum eErr = Error_Unexpect;
 
-	//99 is initial value of m_preDay
-	m_preDay = localTime.wDayOfWeek;
 	CSmartPointer<IConfigInfo> spConfigRun;
 	eErr = GetFunction()->OpenConfig(Config_Run, spConfigRun);
 	if (eErr != Error_Succeed)
 		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("timer open cfg file failed!");
 
-
-	if (m_wDayOfWeek != localTime.wDayOfWeek)
-	{
-		if (localTime.wHour == m_restartHour && localTime.wMinute >= m_restartMinute
-			&& localTime.wMinute <= (m_restartMinute + HEALTHMANAGER_TIMER_INTERVAL_MINUTE))
-		{
-			m_wDayOfWeek = localTime.wDayOfWeek;
-			m_eRebootTrigger = RebootTrigger_Period;
-			m_eRebootWay = RebootWay_Power;
-			BOOL bRet = SystemRestart(true);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnCheckTimeTimeout")("restart machine[%d][%d] bRet=%d, LastError=%d", localTime.wHour, localTime.wMinute, bRet, GetLastError());
-		}
-	}
-
 	if (!m_bSayIdle)
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_fsm.GetFSMState():%d", m_fsm.GetFSMState());
 	int iCheckGuardian = 0;
@@ -936,11 +930,7 @@ bool CHealthManagerEntity::DoRestart()
 	DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("[NonExclusive],NonGuardian=%s", csimpleStrMachineTypeCfg.GetData());
 	SYSTEMTIME localTime;
 	GetLocalTimeRVC(localTime);
-	if (m_bInit)
-	{
-		m_bInit = false;
-		m_wDayOfWeek = localTime.wDayOfWeek;
-	}
+
 
 	ITimerListener *pListener = new TimerOutHelper<CHealthManagerEntity>(this, &CHealthManagerEntity::OnCheckTimeTimeout);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set check timer %d(ms)", HEALTHMANAGER_TIMER_INTERVAL);
@@ -1328,7 +1318,7 @@ void CHealthManagerEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nL
 		m_fsm.SetAccessAuth(AccessAuth_Suc);
 		m_bNeedAuthRetry = false;
 		m_bNeedGuardianRestart = true;
-		m_dwTimeOfAuthSuc = GetTickCount64() / 1000;
+		m_dwTimeOfAuthSuc = SP::Module::Comm::RVCGetTickCount() / 1000;
 		GetFunction()->SetTimer(HEALTHMANAGER_WAIT_MAINPAGE_OPEN_TIMER_ID, this, m_maxWaitMainpageTime);
 
 		CSimpleStringA msg(true);
@@ -1443,7 +1433,7 @@ void CHealthManagerEntity::OnSysVarEvent(const char *pszKey, const char *pszValu
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Z10401")(m_sysStaticInfo.InstallVersion.ToString().GetData());
 				m_bHaveThrowMainPage = true;
 				
-				ULONGLONG dwElapse = GetTickCount64();//使用机器启动时间秒数
+				ULONGLONG dwElapse = SP::Module::Comm::RVCGetTickCount();//使用机器启动时间秒数
 				DWORD elapseTimeTemp = dwElapse / 1000;
 				DWORD dwToMainPageCostTime = elapseTimeTemp - m_dwTimeOfAuthSuc;//从准入通过到首次收到进入首页事件
 				CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"the first enter main page from HealthManger started.\",\"version\":\"%s\",\"elapseTime\":\"%d\",\"enterMainPageTime\":\"%d\"}"
@@ -1466,7 +1456,7 @@ void CHealthManagerEntity::OnSysVarEvent(const char *pszKey, const char *pszValu
 				m_bBrowserIdleFirst = false;
 				m_bEnterMainPageEver = true;
 				LogEvent(Severity_Middle, LOG_EVT_HEALTH_FIRST_ENTER_MAINPADE, "enter main page");
-				ULONGLONG dwElapse = GetTickCount64();//使用机器启动时间秒数
+				ULONGLONG dwElapse = SP::Module::Comm::RVCGetTickCount();//使用机器启动时间秒数
 				DWORD elapseTimeTemp = dwElapse / 1000;
 				CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"the first enter main page from browser started.\",\"version\":\"%s\",\"elapseTime\":\"%d\"}"
 					, m_sysStaticInfo.InstallVersion.ToString().GetData(), elapseTimeTemp);

+ 8 - 7
Module/mod_healthmanager/mod_healthmanager.h

@@ -85,13 +85,13 @@ class CHealthManagerEntity : public CEntityBase, public ILogListener, public IEn
 	,public ITimerListener, public ICallbackListener
 {
 public:
-	CHealthManagerEntity() :m_bInit(true)
-		, m_bWaitRestartPC(false)
+	CHealthManagerEntity() :
+		m_bWaitRestartPC(false)
 		, m_bScreenLock(false)
 		, m_bSayIdle(false), m_bGuardianRun(false), m_guardianCount(1), m_pUpgMgr(NULL)
 		, m_bVerRollback(false), m_eRebootTrigger(RebootTrigger_Resource), m_eRebootWay(RebootWay_Unknown)
 		, m_menuChoice(""), m_menuPre(""), m_netState("N"), m_bBrowserIdleFirst(true)
-		, m_preDay(99), m_bInMainPage(false), m_stopSelfCheck(0)
+		, m_bInMainPage(false), m_stopSelfCheck(0)
 		, m_bEnterMainPageEver(false),m_bHaveThrowMainPage(false)
 		,m_bNeedAuthRetry(false), m_bNeedGuardianRestart(true), m_bNeedGuardian(true)
 		, m_bToRestartByCenterSetting(false){}
@@ -183,7 +183,7 @@ public:
 	{
 		if (ctx->Req.code == Event_VtmLoader_EntityLoad_Finished || ctx->Req.code == Event_VtmLoader_EntityLoad_Failed)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("receive %x,entityList:%s", ctx->Req.code,ctx->Req.entityList.GetData());
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("receive %x,entityList:%s", ctx->Req.code,ctx->Req.entityList.GetData());
 			if (!ctx->Req.entityList.IsNullOrEmpty())
 				m_fsm.SetLoadEntityList(ctx->Req.entityList);
 			FSMEvent* pEvt = new FSMEvent(USER_EVT_VTMLOADER_FINISHED);
@@ -267,13 +267,14 @@ private:
 		, m_uuidRemoteController, m_uuidGUIConsole, m_uuidHeartBeat, m_uuidIE, m_uuidCenterS, m_uuidVtmLoader;
 	CUUID m_uuidPublic, m_uuid4SIPPhone;
 	int m_stopSelfCheck;
-	int m_restartHour, m_restartMinute, m_lastHour, m_preDay,m_guardianCount, m_maxAbnormalTimes;
-	bool m_bInit, m_bWaitRestartPC, m_bScreenLock, m_bSayIdle
+	int m_restartHour, m_restartMinute, m_lastHour, m_guardianCount, m_maxAbnormalTimes;
+	bool m_bWaitRestartPC, m_bScreenLock, m_bSayIdle
 		, m_bGuardianRun, m_bVerRollback, m_bBrowserIdleFirst
 		, m_bInMainPage, m_bEnterMainPageEver, m_bHaveThrowMainPage, m_bToRestartByCenterSetting;
 	bool m_bNeedAuthRetry/*需要重试准入*/, m_bNeedGuardianRestart/*需要重启*/, m_bNeedGuardian;
-	DWORD m_wDayOfWeek,m_dwTimeOfAuthSuc;
+	DWORD m_dwTimeOfAuthSuc;
 	int m_maxWaitMainpageTime;
+	ULONGLONG m_OSRunTicks;
 	RebootTriggerEnum m_eRebootTrigger;
 	RebootWayEnum m_eRebootWay;
 	CSimpleStringA m_menuChoice,m_currentVer,m_menuPre,m_netState, m_versionEx;