fix excessive looping when calling makeCallbacks()

on niceness 1 or above when none are available.
This commit is contained in:
Matt 2015-04-03 12:12:58 -06:00
parent c991a2dcdd
commit dad1cb15f4
3 changed files with 29 additions and 10 deletions

View File

@ -358,7 +358,7 @@ void printUdpTable ( SafeBuf *p, char *title, UdpServer *server ,
"<center>"
//"<font size=+1>"
"<b>%s</b> (%"INT32" transactions)"
"(%"INT32" replies ready)"
"(%"INT32" reads ready)"
//"</font>"
"</td></tr>"
"<tr bgcolor=#%s>"

View File

@ -1069,6 +1069,8 @@ void UdpServer::process_ass ( int64_t now , int32_t maxNiceness) {
// bail if no main sock
if ( m_sock < 0 ) return ;
//log("process_ass");
// if we call this while in the sighandler it crashes since
// gettimeofdayInMillisecondsLocal() is not async safe
int64_t startTimer;
@ -1108,6 +1110,7 @@ void UdpServer::process_ass ( int64_t now , int32_t maxNiceness) {
// if we read something, try for more
if ( something ) {
//if ( slot->m_errno || slot->isTransactionComplete())
//log("got something");
needCallback = true;
goto loop;
}
@ -1131,6 +1134,8 @@ void UdpServer::process_ass ( int64_t now , int32_t maxNiceness) {
if ( makeCallbacks_ass ( /*niceness level*/ 0 ) ) {
// set flag to call low priority callbacks
m_needBottom = true;
// note it
//log("made callback");
// but not now, only when we don't call any high priorities
goto bigloop;
}
@ -1140,17 +1145,19 @@ void UdpServer::process_ass ( int64_t now , int32_t maxNiceness) {
// gettimeofdayInMillisecondsLocal() is not async safe
int64_t elapsed = 0;
if ( ! g_inSigHandler )
elapsed = gettimeofdayInMillisecondsLocal() - startTimer;
elapsed = gettimeofdayInMillisecondsLocal() - startTimer;
if(elapsed < 10) {
// we did not call any, so resort to nice callbacks
makeCallbacks_ass ( /*niceness level*/ 1 ) ;
// . only go to bigloop if we called a callback
if ( makeCallbacks_ass ( /*niceness level*/ 1 ) )
goto bigloop;
// no longer need to be called
// if we did anything loop back up
// . but only if we haven't been looping forever,
// . if so we need to relinquish control to loop.
// log(LOG_WARN, "udp: give back control. after %"INT64"",
// elapsed);
goto bigloop;
//goto bigloop;
}
else {
m_needBottom = true;
@ -1239,12 +1246,19 @@ int32_t UdpServer::readSock_ass ( UdpSlot **slotPtr , int64_t now ) {
log("loop: readsock_ass: peekSize=%i m_sock/fd=%i",
peekSize,m_sock);
//static int s_ss = 0;
// cancel silly g_errnos and return 0 since we blocked
if ( peekSize < 0 ) {
g_errno = errno;
if ( flipped ) interruptsOn();
if ( g_errno == EAGAIN || g_errno == 0 ) { g_errno = 0; return 0; }
if ( g_errno == EILSEQ ) { g_errno = 0; return 0; }
if ( g_errno == EAGAIN || g_errno == 0 ) {
// if ( s_ss++ == 100 ) {
// log("foo");char *xx=NULL;*xx=0; }
// log("udp: EAGAIN");
g_errno = 0; return 0; }
if ( g_errno == EILSEQ ) {
g_errno = 0; return 0; }
// Interrupted system call (4) (from valgrind)
#ifdef _VALGRIND_
if ( g_errno == 4 ) { g_errno = 0; return 0;}
@ -1709,7 +1723,7 @@ int32_t UdpServer::readSock_ass ( UdpSlot **slotPtr , int64_t now ) {
// must not be in there already, lest we double add it
! isInCallbackLinkedList ( slot ) ) {
// debug log
if ( slot->m_errno )
if ( slot->m_errno && g_conf.m_logDebugUdp )
log("udp: adding slot with err = %s to callback list"
, mstrerror(slot->m_errno) );
if ( g_conf.m_logDebugUdp )
@ -1742,6 +1756,7 @@ int32_t UdpServer::readSock_ass ( UdpSlot **slotPtr , int64_t now ) {
// discard if we should
if ( discard ) {
readSize=recvfrom(m_sock,tmpbuf,DGRAM_SIZE_CEILING,0,NULL,NULL);
//log("udp: recvfrom3 = %i",(int)readSize);
}
// . update stats, just put them all in g_udpServer
// . do not count acks
@ -1925,9 +1940,9 @@ void UdpServer::resume ( ) {
bool UdpServer::makeCallbacks_ass ( int32_t niceness ) {
// if nothing to call, forget it
if ( ! m_head3 ) return true;
if ( ! m_head3 ) return false;
if ( g_conf.m_logDebugUdp )
//if ( g_conf.m_logDebugUdp )
log(LOG_DEBUG,"udp: makeCallbacks_ass: start. nice=%"INT32" "
"inquickpoll=%"INT32"",
niceness,(int32_t)g_loop.m_inQuickPoll);
@ -2443,7 +2458,9 @@ bool UdpServer::makeCallback_ass ( UdpSlot *slot ) {
// . if transaction has not fully completed, keep sending
// . unless there was an error
if ( ! g_errno && ! slot->isTransactionComplete()) {
log("udp: why calling handler when not ready?");
if ( g_conf.m_logDebugUdp )
log("udp: why calling handler "
"when not ready?");
return false;
}
// we should not destroy the slot here on ENOMEM error,

View File

@ -1572,6 +1572,7 @@ bool UdpSlot::readDatagramOrAck ( int sock ,
0 ,
NULL ,
NULL );
//log("udp: recvfrom1 = %i",(int)numRead);
// let caller know how much we read for stats purposes
*readSize = numRead;
// restore what was at the header before we stored it there
@ -1614,6 +1615,7 @@ bool UdpSlot::readDatagramOrAck ( int sock ,
0 ,
NULL ,
NULL );
//log("udp: recvfrom2 = %i",(int)dgramSize);
// bail on error, how could this happen?
if ( dgramSize < 0 ) {
// valgrind