Пример #1
0
// returns false if blocked, true otherwise
bool Msg28::doSendLoop ( ) {
	// only send once if we should
	//if ( m_hostId >= 0 && m_numRequests >= MAX_OUT_MSG28 ) return true;
	if ( m_hostId>=0 && m_numRequests>=1 && m_hostId2 == -1) return true;
	// nothing to do if we sent a request to each host
	//int32_t numHosts = g_hostdb.getNumHosts();
	if ( m_numRequests >= m_sendTotal ) return true;
	// send to ourselves last iff m_ourselvesLast is true
	int32_t total = m_numHosts ;
	if ( m_ourselvesLast ) total++;
	// . now send it to all! allow up to 16 outstanding requests.
	// . only allow 1 outstanding, and do ourselves last in case of
	//   save & exit...
	for ( int32_t i = m_i ; i < total && 
		      m_numRequests - m_numReplies < MAX_OUT_MSG28 ; i++ ){
		// skip it for next call, but stick to the last host, that's us
		if ( i != m_numHosts ) m_i++;
		// if we have a range and i is not in it, skip, but watch
		// out when i==m_numHosts, because that is when we send the
		// request to ourselves, provided we are in the range
		if ( m_hostId >= 0 && m_hostId2 >= 0 && i < m_numHosts )
			if ( i < m_hostId || i > m_hostId2 ) continue;
		// do not send to ourselves until sent to others
		if ( m_ourselvesLast && i == g_hostdb.m_hostId && i<m_numHosts)
			continue;
		// if we are now sending to ourselves, check to make sure
		// all replies are back and we ourselves are in the docid range
		// if one was given
		if ( m_ourselvesLast && i == total-1 ) {
			// and we must have gotten back all the replies...
			// or at least error messages like ETIMEDOUT
			if ( m_numReplies < m_sendTotal - 1 ) continue;
			// and we must be in range, if one was given
			if ( m_hostId >= 0 && m_hostId2 >= 0 ) {
				if ( g_hostdb.m_hostId < m_hostId  ) continue;
				if ( g_hostdb.m_hostId > m_hostId2 ) continue;
			}
		}
		// count it
		m_numRequests++;
		// get the ith host
		Host *h = g_hostdb.getHost ( i );
		if ( m_sendToProxy )
			h = g_hostdb.getProxy(i);
		// . if we are the "last i", that means us
		// . we do ourselves last in case of a "save & exit" request
		if ( i == m_numHosts ) {
			h = g_hostdb.getHost(g_hostdb.m_hostId);
			if (m_sendToProxy)
				h = g_hostdb.getProxy(g_hostdb.m_hostId);
		}
		// did we have one explicitly given?
		// ... and make sure we are not a range of hostids...
		if ( m_hostId >= 0 && m_hostId2 == -1 ) {
			h = g_hostdb.getHost (m_hostId);
			if ( m_sendToProxy )
				h = g_hostdb.getProxy ( m_hostId );
		}
		// debug
		log(LOG_INIT,"admin: sending to hostid #%"INT32".",h->m_hostId);
		// timeout is int16_ter if host is dead
		int32_t timeout = 30000; // 30 seconds
		// only 7 seconds if it is dead seemingly
		if ( g_hostdb.isDead ( h ) ) timeout = 7000;
		//	continue;
		// . launch it
		// . returns false if blocked, true otherwise
		// . sets g_errno on error
		TcpServer *tcp = &g_httpServer.m_tcp;
		if ( tcp->sendMsg ( h->m_ip      ,
				    h->m_httpPort,
				    m_buf        ,
				    m_bufSize    ,
				    m_bufLen     ,
				    m_bufLen     ,
				    this         ,   // state
				    gotReply     ,
				    timeout      ,   // 5000, timeout
				    100*1024     ,   // maxTextDocLen
				    100*1024     )){ // maxOtherDocLen
			log("admin: Could not send configuration request "
			    "to hostId #%"INT32" (%s:%"INT32"): %s.",h->m_hostId,
			    iptoa(h->m_ip),(int32_t)h->m_port,mstrerror(g_errno));
			g_errno = 0;//return true;
			m_numReplies++;
		}
		// all done if only one host... and not a range
		if ( m_hostId >= 0 && m_hostId2 == -1 ) break;
		// it blocked
		//return false;
	}
	// return false if we blocked
	//if ( m_numReplies < m_numRequests ) return false;
	// do not finish until we got them all
	if ( m_numReplies < m_sendTotal ) return false;
	return true;
}