Пример #1
0
void CCommandPra::CmdAppLogLevel(CProtocol& a_clsRecvP, CProcessManager& a_clsPM)
{
	CConfigPra& clsCfg = CConfigPra::Instance();
	CAppQueue& clsQ = CAppQueue::Instance();
	
	CCmdAppLogLevel clsLog;				// Notify parsing
	string strBody;

	CCmdAppCtl clsCtl;					// APP에 보낼 body 메세지
	CProtocol clsSendP;					// APP에 보낼 message


	if (a_clsRecvP.IsFlagNotify() == false) {
		g_pclsLogPra->WARNING("CMD, 'LOG_LEVEL' not set notify flag");
	}

	if (clsLog.NotifyParse(a_clsRecvP.GetPayload().c_str()) == false) {
		g_pclsLogPra->ERROR("CMD, 'LOG_LEVEL' invalied body format");
		return;
	}
	
	// 프로세스 보낼 메세지 구성
	clsCtl.m_strAction = "LOG_LEVEL";
	clsCtl.m_nOption = clsLog.m_nLogLevel;

	clsSendP.SetCommand(CMD_APP_CTL);
	clsSendP.SetFlagRequest();
	clsSendP.SetSource(clsCfg.m_nNodeNo, clsCfg.m_nProcNo);
	clsSendP.SetSequence();
	clsSendP.SetPayload(clsCtl.RequestGen());

	if (clsLog.m_bIsAll) {
		// 전체 프로세스 loglevel 변경 요청
		vector<CProcessManager::ST_APPINFO> vecInfo;
		a_clsPM.GetAppInfo(vecInfo, CProcStatus::RUNNING);
		for (size_t i=0; i < vecInfo.size(); ++i) {
			clsSendP.SetDestination(clsCfg.m_nNodeNo, vecInfo[i].m_nProcNo);
			
			if (clsQ.SendCmd(clsSendP, vecInfo[i].m_strProcName.c_str()) == false) {
				g_pclsLogPra->ERROR("APP loglevel send failed");
			}
		}

	} else {
		// 지정 프로세스의 loglevel 변경 요청
		list<pair<int, string> >::iterator iter = clsLog.m_lstTarget.begin();
		for (; iter != clsLog.m_lstTarget.end(); ++iter) {
			clsSendP.SetDestination(clsCfg.m_nNodeNo, iter->first);
			
			if (clsQ.SendCmd(clsSendP, iter->second.c_str()) == false) {
				g_pclsLogPra->ERROR("APP loglevel send failed");
			}
		}
	}

	return;
}
Пример #2
0
void CProcessManager::CheckAlive(void)
{
	CConfigPra& clsCfg = CConfigPra::Instance();
	CAppQueue& clsQ = CAppQueue::Instance();
	
	// Alive check를 위한 Ping 메세지 생성
	CProtocol clsProto;
	clsProto.SetCommand(CMD_PING);
	clsProto.SetFlagRequest();
	clsProto.SetSource(clsCfg.m_nNodeNo, clsCfg.m_nProcNo);
	clsProto.SetPayload(NULL, 0);
	
	time_t curtime = time(NULL);

	auto iter = m_mapProcess.begin();
	for (; iter != m_mapProcess.end(); iter++) {

		if (iter->second.m_pclsApp->GetStatus() != CProcStatus::RUNNING) {
			continue;
		}
		
		// Alive 체크
		// 조건1) 마지막 alive 시간 + hangup 시간 이내 인가?
		// 조건2) alive 체크 주기 인가?
		if (curtime <= (iter->second.m_nAliveTime + m_nHangupTime)) {
			if (curtime >= (iter->second.m_nAliveTime + m_nAlivePeriod)) {
				clsProto.SetDestination(clsCfg.m_nNodeNo, iter->first);
				clsProto.SetSequence();
				
				auto miter = m_mapProcess.find(iter->first);
				if (miter == m_mapProcess.end()) {
					continue;
				}
				
				if (clsQ.SendCmd(clsProto, 
						miter->second.m_stAppInfo.m_strProcName.c_str()) == false) {
					g_pclsLogPra->ERROR("PM, CMD 'PING' send failed");
					continue;
				}
			}
			continue;
		}

		// HANGUP 처리
		g_pclsLogPra->CRITICAL("PM, process hangup, pno: %d, pname: %s",
							iter->first, 
							iter->second.m_stAppInfo.m_strProcName.c_str());
		iter->second.m_pclsApp->SetStatus(CProcStatus::HANGUP);
		iter->second.m_pclsApp->SendSignal(SIGSEGV);
	}
	
	return;
}
Пример #3
0
void CCommandPra::CmdCli_InitProc(CProtocol& a_clsRecvP, CCliReq& clsCliReq,
													CProcessManager& a_clsPM)
{
	CConfigPra& clsCfg = CConfigPra::Instance();

	// 프로세스 보낼 메세지 구성
	CCmdAppCtl clsCtl;					// APP에 보낼 body 메세지
	clsCtl.m_strAction = "INIT";

	CProtocol clsSendP;					// APP에 보낼 message
	clsSendP.SetCommand(CMD_APP_CTL);
	clsSendP.SetFlagNotify();
	clsSendP.SetSource(clsCfg.m_nNodeNo, clsCfg.m_nProcNo);
	clsSendP.SetSequence();
	clsSendP.SetPayload(clsCtl.RequestGen());
	
	// CLI response 메세지 구성
	CCliRsp	clsCliRsp;
	clsCliRsp.SetSessionId(clsCliReq.GetSessionId());
	clsCliRsp.SetResultCode(1, "SUCCESS");
	clsCliRsp.SetText      ("");
	clsCliRsp.SetTextAppend("================================\n");
	clsCliRsp.SetTextAppend("    procno   procname    success\n");
	clsCliRsp.SetTextAppend("---------- ---------- ----------\n");
	
	CAppQueue& clsQ = CAppQueue::Instance();
	string strProcName;
	int nProcNo = -1;
	
	for (uint32_t i=0; i < clsCliReq.GetCount(); i++) {
		// Argument
		if (clsCliReq[i].GetName().compare("SERVICE_NAME") == 0) {
			// TODO
			// sevice name process invoke
			continue;
			
		} else if (clsCliReq[i].GetName().compare("PROCESS_NAME") == 0) {
			// Parameter
			for (uint32_t j=0; j < clsCliReq[i].GetCount(); j++) {
				strProcName = clsCliReq[i][j].GetString();
				
				nProcNo = a_clsPM.FindProcNo(strProcName);
				if (nProcNo <= 0) {
					g_pclsLogPra->ERROR("CMD 'CLI' uknown process no, pname: %s",
															strProcName.c_str());
					clsCliRsp.NPrintf(1024, "%10d %10s %10s\n",
						   					-1, strProcName.c_str(), "FAILED");
					continue;
				}

				// 프로세스의 init 요청
				clsSendP.SetDestination(clsCfg.m_nNodeNo, nProcNo);
				if (clsQ.SendCmd(clsSendP, clsCliReq[i][j].GetString().c_str()) == false) {
					g_pclsLogPra->ERROR("APP init send failed");
					clsCliRsp.NPrintf(1024, "%10d %10s %10s\n",
						   					-1, strProcName.c_str(), "FAILED");
					continue;
				}

				clsCliRsp.NPrintf(1024, "%10d %10s %10s\n", 
										nProcNo, strProcName.c_str(), "OK");
			}
		}
	}
	clsCliRsp.SetTextAppend("================================\n");
	
	string strBody;
	clsCliRsp.EncodeMessage(strBody);

	// 응답 메세지 생성
	clsSendP.SetResponse(a_clsRecvP);
	clsSendP.SetPayload(strBody);
	
	if (CModuleIPC::Instance().SendMesg(clsSendP) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsSendP.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsSendP.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif
	
	return;	
}
Пример #4
0
void CCommandPra::CmdAppInit(CProtocol& a_clsRecvP, CProcessManager& a_clsPM)
{
	CConfigPra& clsCfg = CConfigPra::Instance();
	CAppQueue& clsQ = CAppQueue::Instance();
	
	CCmdAppInit clsInit;				// Request body parsing
	CCmdAppInit::ST_RESPONSE stResponse;
	string strBody;
	bool bIsError = false;
			
	CCmdAppCtl clsCtl;					// APP에 보낼 body 메세지
	CProtocol clsSendP;					// APP에 보낼 message


	if (a_clsRecvP.IsFlagRequest() == false) {
		strBody = clsInit.ErrorGen(1, "CMD 'APP_INIT', not set request flag");
		bIsError = true;
		goto JumpSend;
	}

	if (clsInit.RequestParse(a_clsRecvP.GetPayload().c_str()) == false) {
		strBody = clsInit.ErrorGen(1, "CMD 'APP_INIT', invalied body format");
		bIsError = true;
		goto JumpSend;
	}
	
	// 프로세스 보낼 메세지 구성
	clsCtl.m_strAction = "INIT";
	clsSendP.SetCommand(CMD_APP_CTL);
	clsSendP.SetFlagNotify();
	clsSendP.SetSource(clsCfg.m_nNodeNo, clsCfg.m_nProcNo);
	clsSendP.SetSequence();
	clsSendP.SetPayload(clsCtl.RequestGen());

	if (clsInit.m_bIsAll) {
		// 전체 프로세스 init 요청
		vector<CProcessManager::ST_APPINFO> vecInfo;
		a_clsPM.GetAppInfo(vecInfo, CProcStatus::RUNNING);
		for (size_t i=0; i < vecInfo.size(); ++i) {
			clsSendP.SetDestination(clsCfg.m_nNodeNo, vecInfo[i].m_nProcNo);
			
			stResponse.m_nProcNo = vecInfo[i].m_nProcNo;
			stResponse.m_strProcName = vecInfo[i].m_strProcName;
			stResponse.m_bSuccess = true;
			
			if (clsQ.SendCmd(clsSendP, vecInfo[i].m_strProcName.c_str()) == false) {
				g_pclsLogPra->ERROR("APP init send failed");
				stResponse.m_bSuccess = false;
			}
			
			clsInit.m_lstResponse.push_back(stResponse);
		}

	} else {
		// 지정 프로세스의 init 요청
		list<pair<int, string> >::iterator iter = clsInit.m_lstTarget.begin();
		for (; iter != clsInit.m_lstTarget.end(); ++iter) {
			clsSendP.SetDestination(clsCfg.m_nNodeNo, iter->first);
			
			stResponse.m_nProcNo = iter->first;
			stResponse.m_strProcName = iter->second;
			stResponse.m_bSuccess = true;
			
			if (clsQ.SendCmd(clsSendP, iter->second.c_str()) == false) {
				g_pclsLogPra->ERROR("APP init send failed");
				stResponse.m_bSuccess = false;
			}

			clsInit.m_lstResponse.push_back(stResponse);
		}
	}
	strBody = clsInit.ResponseGen();

JumpSend:
	CProtocol clsResp;
	clsResp.SetResponse(a_clsRecvP);
	if (bIsError) {
		clsResp.SetFlagError();
	}
	clsResp.SetPayload(strBody);

	if (CModuleIPC::Instance().SendMesg(clsResp) == false) {
		g_pclsLogPra->ERROR("CMD, send message failed, %s", 
								CModuleIPC::Instance().m_strErrorMsg.c_str());
		clsResp.Print(g_pclsLogPra, LV_ERROR, true);
	}

	#ifdef PRA_DEBUG
	g_pclsLogPra->DEBUG("Send message");
	clsResp.Print(g_pclsLogPra, LV_DEBUG, true);
	#endif
	
	return;
}
Пример #5
0
int CMain::ReceiveIpcHandler()
{
	int cmdCode = 0;
	string strCmdCode;
	CGlobal *cGlob = NULL;
	CModuleIPC *cIpc = NULL;
	CProtocol cProto;
	char chFlag = 0;
	int nRet = 0;

	cGlob = CGlobal::GetInstance();

	cIpc = cGlob->GetModuleIPC();

	nRet = cIpc->RecvMesg(cGlob->GetLocalProcNo(), cProto, -1);
	if(nRet < 0){
		CLA_LOG(CLA_ERR,false,"Message receive failed(ERR:%s)\n", cIpc->m_strErrorMsg.c_str());
		return CLA_NOK;
	}
	else if(nRet == 0){
		return CLA_OK;
	}

	chFlag = cProto.GetFlag();

	if((chFlag != CProtocol::FLAG_RESPONSE)){
		CLA_LOG(CLA_ERR,false,"Invalid Flag(flag=%d)\n",chFlag);
		return CLA_NOK;
	}

	strCmdCode = cProto.GetCommand();

	cmdCode = CGlobal::GetCmdCode(strCmdCode);

	switch(cmdCode){
		case CMD_CLI_COMMAND:
			{
				unsigned int fd = 0;
				unsigned int nSessionId = 0;
				CCliPeer *cPeer = NULL;
				CSession *cSession = NULL;
				CCliRsp decRsp;
				string strPayload;

				nSessionId = cProto.GetSequence();

				cSession = FindSession(nSessionId);
				if(cSession == NULL){
					CLA_LOG(CLA_ERR,false,"Can not find session(id=%d)\n",nSessionId);
					return CLA_NOK;
				}

				strPayload = cProto.GetPayload();

				decRsp.DecodeMessage(strPayload);

				decRsp.SetSessionId(cSession->GetClcSessionId());

				decRsp.EncodeMessage(strPayload);

				cProto.SetPayload(strPayload);
				cProto.SetSequence(cSession->GetClcSessionId());

				fd = cSession->GetPeerFd();

				cPeer = FindPeerByFd(fd);
				if(cPeer == NULL){
					CLA_LOG(CLA_ERR,false,"Can not find peer(fd=%d)\n",fd);
					delete cSession;
					return CLA_NOK;
				}

				if(cPeer->GetTimestamp() != cSession->GetPeerTimestamp()){
					CLA_LOG(CLA_ERR,false,"Can not find peer(timestamp=%lu, %lu)\n", 
							cPeer->GetTimestamp() ,cSession->GetPeerTimestamp());
					delete cSession;
					return CLA_NOK;
				}

				/* update hist */
				UpdateHist(cPeer, cSession, &decRsp);

				cPeer->Send(cProto);

				delete cSession;
			}
			break;
		default :
			CLA_LOG(CLA_ERR,false,"Invalid cmdCode(%s)\n",cProto.GetCommand().c_str());
			return CLA_NOK;

	};


	return CLA_OK;
}