
yuzhichang at gmail
Jul 17, 2012, 10:55 PM
Post #1 of 1
(158 views)
Permalink
|
|
Disk full due to epoll_ctl failure
|
|
Hi all, I noticed a rsyslog problem. /var/log/syslog eats the whole root partition. Following message repeats endlessly in this log file: Jul 12 17:01:34 shg10a rsyslogd-2163: epoll_ctl failed on fd 1023, id 0/0x15^C65f00, op 1 with File exists : File exists [try http://www.rsyslog.com/e/2163 ] Meantime, rsyslogd occupies about 60 percents CPU time. The rsyslog version is 5.8.3 on a Debian variant. I readed the code. The error message comes from nsdpoll_ptcp.c:176. I suspected it's due to following abnormal case: 1. tcpsrv.c:389, in SessAccept(), netstrm.AcceptConnReq(...) fails. So that SessAccept() retuns without executing line 442 "*ppSess = pSess". 2. tcpsrv.c:696, in Run(). pNewSess is the previous added one. 3. nsdpoll_ptcp.c:173, in Ctl(). epoll_ctl(EPOLL_CTL_ADD) fails with EEXIST. I propose following patch: diff -NU5 rsyslog-5.8.3/tcpsrv.c rsyslog-5.8.3_mod/tcpsrv.c --- rsyslog-5.8.3/tcpsrv.c 2011-07-11 15:49:49.000000000 +0800 +++ rsyslog-5.8.3_mod/tcpsrv.c 2012-07-18 13:37:42.000000000 +0800 @@ -690,11 +690,11 @@ dbgprintf("poll returned with i %d, pUsr %p\n", i, pUsr); if(pUsr == pThis->ppLstn) { DBGPRINTF("New connect on NSD %p.\n", pThis->ppLstn[i]); - SessAccept(pThis, pThis->ppLstnPort[i], &pNewSess, pThis->ppLstn[i]); + CHKiRet(SessAccept(pThis, pThis->ppLstnPort[i], &pNewSess, pThis->ppLstn[i])); CHKiRet(nspoll.Ctl(pPoll, pNewSess->pStrm, 0, pNewSess, NSDPOLL_IN, NSDPOLL_ADD)); DBGPRINTF("New session created with NSD %p.\n", pNewSess); } else { pNewSess = (tcps_sess_t*) pUsr; doReceive(pThis, &pNewSess, pPoll); Regards, Zhichang Yu _______________________________________________ rsyslog mailing list http://lists.adiscon.net/mailman/listinfo/rsyslog http://www.rsyslog.com/professional-services/ What's up with rsyslog? Follow https://twitter.com/rgerhards
|