Example #1
0
void CClientManager::OnAckPoll( CMessageBase* pMsg ){
	CObjLocker<CClientManager> locker(this);
	TOKEN_INFO* pinfo = (TOKEN_INFO*)(pMsg+1);

	IN_ADDR addrHost = pMsg->GetSrcAddr().m_addrHost;
	//update the host set
	if( m_HostAddrs.find( addrHost )==m_HostAddrs.end() )m_HostAddrs.insert( addrHost );

	//mark all the existing idle tokens from the host as dead
	map<CSessionAddr, CServerToken*>::iterator pos = m_PeerTokens.lower_bound( CSessionAddr(addrHost,0) );
	while( pos!=m_PeerTokens.end() && ( pos->second->GetServAddr().m_addrHost==addrHost) ){
		if( pos->second->IsIdle() )pos->second->SetState(CTF_DEAD);
		++pos;
	}

	//reset the tokens to idle
	int nInfos = pMsg->GetResult();
	for( int i=0; i<nInfos; i++ ){
		pinfo[i].ntoh();
		CSessionAddr addrPeer( pMsg->GetSrcAddr().m_addrHost, pinfo[i].nServId );
		pos = m_PeerTokens.find( addrPeer );
		if( pos==m_PeerTokens.end() ){
			AddToken( addrPeer, pinfo[i].nCpuType, pinfo[i].nCpuMhz );
		}else{
			if( !pos->second->IsRunning() )pos->second->SetState( CTS_IDLE );
		}
	}
	cdump<<"get poll back from host:"<<GetHostByAddr(addrHost).c_str()<<" with "<<nInfos<<" tokens"<<endl;
}
Example #2
0
LOCAL void* GetHostByAddrThread_Func(void* _HostInfo)
{
  sHostInfo *HostInfo = (sHostInfo *) _HostInfo;

  GetHostByAddr(HostInfo->HostMachineAddress, HostInfo->szHostMachineName);

  return 0;
}
Example #3
0
void CHostSet::DumpAllHosts()
{
	Lock();
	cdump<<lock<<"dumping alive hosts:"<<endl;

	POSITION pos = m_trAliveHosts.GetHeadPosition();
	while( pos ){
		CHostObject* pHostObj = m_trAliveHosts.GetNext( pos );
		IN_ADDR addr = pHostObj->GetAddr();
		char* pname = GetHostByAddr( addr );
		cdump<<"\t("<<pHostObj->GetSpeedHint()<<")"<<pname<<endl;
	}


	cdump<<"dumping running hosts:"<<endl;
//	pos = m_trRunningHosts.GetHeadPosition();
//	while( pos ){
//		CHostObject* pHostObj = m_trRunningHosts.GetNext( pos );
//		IN_ADDR addr = pHostObj->GetAddr();
//		struct hostent * phent = GetHostByAddr( (char*)&addr, sizeof(IN_ADDR), AF_INET );
//		cdump<<"\t("<<pHostObj->GetSpeedHint()<<")"<<phent->h_name<<endl;
//	}

	list<CHostObject*>::iterator iter = m_lsRunningHosts.begin();
	while( iter!=m_lsRunningHosts.end() ){
		CHostObject* pHostObj = *iter++;
		IN_ADDR addr = pHostObj->GetAddr();
		char* pname = GetHostByAddr( addr );
		cdump<<"\t("<<pHostObj->GetSpeedHint()<<")"<<pname<<endl;
	}

	cdump<<"dumping dead hosts:"<<endl;
	pos = m_trDeadHosts.GetHeadPosition();
	while( pos ){
		CHostObject* pHostObj = m_trDeadHosts.GetNext( pos );
		IN_ADDR addr = pHostObj->GetAddr();
		char* pname = GetHostByAddr( addr );
		cdump<<"\t("<<pHostObj->GetSpeedHint()<<")"<<pname<<endl;
	}

	cdump<<unlock;

	Unlock();
}
Example #4
0
void cmdSysInfo( CClientSession* pSession )
{
	SERVERINFO sysinfo;
	if( pSession->ServerInfo( sysinfo ) ){
		cout<<GetHostByAddr(sysinfo.ipAddr)<<endl<<"OS:"<<sysinfo.nOpSystem<<"\t"<<"DISK:"<<sysinfo.bShareDisk<<"\t"<<"STAT:"<<sysinfo.nSysStat<<endl;
		cout<<"SESS:"<<sysinfo.nSessions<<"\t"<<"PROC:"<<sysinfo.nChildPorcs<<"\tIDLE:"<<sysinfo.bSysIdle<<endl;
	}else{
		cout<<"\tcmd failed"<<endl;
	}
}
void CFindServersDlg::AddServer(const WFindServers::SERVER_INFO& Info, CServerInfoArray& List)
{
	CServerInfo	si;
	si.m_HostName = Info.Name;
	si.m_HostName.MakeUpper();
	si.m_IPAddress = Info.IPAddress;
	si.m_BinIPAddr = ntohl(inet_addr(Info.IPAddress));
	si.m_Status = Info.Status;
	if (si.m_Status) {
		si.m_ClientHostName = GetHostByAddr(Info.ExtStatus.ClientIPAddress);
		si.m_ClientBinIPAddr = ntohl(Info.ExtStatus.ClientIPAddress.S_un.S_addr);
		si.m_ClientIPAddress = inet_ntoa(Info.ExtStatus.ClientIPAddress);
	}
	List.Add(si);
}
Example #6
0
CHostObject::~CHostObject()
{
	IN_ADDR addr = GetAddr();
	char* pname = GetHostByAddr( addr );
	if( m_pSession ){
		try{
			cdump<<lock<<pname<<"\tdisconnecting..."<<endl<<unlock;
			m_pSession->Disconnect();
		}catch( CSockException* e ){
			printf( "error disconnecting...\n" );
			e->Delete();
		}
		delete m_pSession;
		m_pSession = NULL;
	}else{
		cdump<<lock<<pname<<"\t session pointer NULL"<<endl<<unlock;
	}
}
Example #7
0
void CHostSet::DumpRunningHosts()
{
	Lock();
//	POSITION pos = m_trRunningHosts.GetHeadPosition();
//	while( pos ){
//		CHostObject* pHostObj = m_trRunningHosts.GetNext( pos );
//		IN_ADDR addr = pHostObj->GetAddr();
//		struct hostent * phent = GetHostByAddr( (char*)&addr, sizeof(IN_ADDR), AF_INET );
//		cdump<<lock<<"running job on "<<phent->h_name<<endl<<unlock;
//	}

	list<CHostObject*>::iterator iter = m_lsRunningHosts.begin();
	while( iter!=m_lsRunningHosts.end() ){
		CHostObject* pHostObj = *iter++;
		IN_ADDR addr = pHostObj->GetAddr();
		char* pname = GetHostByAddr( addr );
		cdump<<lock<<"running job on "<<pname<<endl<<unlock;
	}
	Unlock();
}
Example #8
0
void CHostSet::CancelRunningHosts( int nMaxHosts )
{
	Lock();

	//sort the running hosts in trRunningHosts.
	CAvlHostSpeedTree	trRunningHosts;	//running hosts ordered by their speed
	list<CHostObject*>::iterator iter = m_lsRunningHosts.begin();
	while( iter!=m_lsRunningHosts.end() ){
		CHostObject* pHostObj = *iter++;
		trRunningHosts.Insert( pHostObj );
	}

	POSITION posRun = trRunningHosts.GetTailPosition();
	POSITION posAlv = m_trAliveHosts.GetHeadPosition();
	//list<CHostObject*>::iterator iter = m_lsRunningHosts.begin();
//	int nCanceled = 0;
//	while( iter!=m_lsRunningHosts.end() && nCanceled<nMaxHosts ){
//		CHostObject* pHostObj = *iter++;
//	while( posRun && posAlv && nCanceled<nMaxHosts ){
	while( posRun && posAlv ){
		CHostObject* pHostObj = trRunningHosts.GetPrev( posRun );		//this is the canceled host
		CHostObject* pHostObjAlv = m_trAliveHosts.GetNext( posAlv );	//this is the preempting host
		bool bCancelIt = false;
		if( pHostObjAlv->GetSpeedHint()==-1 ){
			bCancelIt = (double)rand() / RAND_MAX < 0.3;
		}else if( 2*pHostObjAlv->GetSpeedHint()<pHostObj->GetSpeedHint() ){
			bCancelIt = true;
		}
		//do the preemption.
		if( bCancelIt && (pHostObj->m_pSession!=NULL) ){
			IN_ADDR addr = pHostObj->GetAddr();
			char* pname = GetHostByAddr( addr );
			cdump<<lock<<"killing host connection "<<pname<<endl<<unlock;
			pHostObj->m_pSession->KillConnect();
			cdump<<lock<<pname<<" killed"<<endl<<unlock;

			//kill the running processes
			SOCKADDR_IN sockaddr;
			sockaddr.sin_family = AF_INET;
			sockaddr.sin_addr = pHostObj->GetAddr();
			sockaddr.sin_port = htons( NCP_SERVER_PORT );

			CClientSession* pSession = new CClientSession();
			int nRet;
			try{
				cdump<<lock<<"killing processes on "<<pname<<endl<<unlock;
				nRet = pSession->Connect( &sockaddr, "root", "" );
				if( nRet==0 ){
					pSession->KillProcs();
					pSession->Disconnect();
				}
				cdump<<lock<<"processes killed on "<<pname<<endl<<unlock;
			}catch( CSockException* e){
				e->Delete();
			}
			delete pSession;

//			nCanceled++;
		}
	}
	Unlock();
}