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; }
LOCAL void* GetHostByAddrThread_Func(void* _HostInfo) { sHostInfo *HostInfo = (sHostInfo *) _HostInfo; GetHostByAddr(HostInfo->HostMachineAddress, HostInfo->szHostMachineName); return 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(); }
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); }
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; } }
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(); }
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(); }