<div dir="ltr"> SQUID_MAXFD == 256, but Sqid_MaxFD == 4096, and SQUID_MAXFD_LIMIT == 1024<br>it's like, that some code uses SQUID_MAXFD, and some Squid_MaxFD<br> it's looks that it is supposed, that SQUID_MAXFD always >= Squid_MaxFD, but in main.cc there is possibility to get Squis_MaxFD > SQUID_MAXFD (in getrlimit branch: setMaxFD)<br>so, it looks like architecture bug that we can't fix, sorry.<br>but in our case we will try to sync all values to 1024, hope it helps to fix bug in squid.<br></div><div class="gmail_extra"><br><div class="gmail_quote">2016-10-18 17:48 GMT+03:00 Alex Rousskov <span dir="ltr"><<a href="mailto:rousskov@measurement-factory.com" target="_blank">rousskov@measurement-factory.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 10/18/2016 03:44 AM, oleg gv wrote:<br>
<br>
> nfds=284, so loop ends on 283 and pfds[283] is buggy<br>
<br>
> I/o module is  src/comm/ModPoll.cc, method Comm::DoSelect(int msec)<br>
> On stack we see that pfds[SQUID_MAXFD=256], so is less than nfds in loop.<br>
> May be malloc nfds?<br>
<br>
</span>If your maxfd is bigger than SQUID_MAXFD than the bug is elsewhere and<br>
dynamically allocating pfds is not the right fix (even though it will<br>
"work").<br>
<br>
I suspect your Squid is creating creating or accepting a descriptor that<br>
exceeds SQUID_MAXFD-1. Biggest_FD+1 cannot be allowed to exceed the<br>
misnamed SQUID_MAXFD limit.<br>
<br>
This combination looks like a big red flag to me:<br>
<br>
    struct pollfd pfds[SQUID_MAXFD];<br>
    ...<br>
    maxfd = Biggest_FD + 1;<br>
    for (int i = 0; i < maxfd; ++i) {<br>
        ...<br>
        pfds[nfds].fd = i;<br>
<br>
That code is missing assert(maxfd <= SQUID_MAXFD) which will fail in<br>
your case.<br>
<br>
If you want a workaround, try building Squid with a reasonable number of<br>
maximum descriptors (e.g., 16K, 32K, or 64K). If that number is never<br>
reached in your environment, the code will appear to work.<br>
<br>
If you want to try a quick fix, replace SQUID_MAXFD with (Biggest_FD +<br>
1) when declaring pfds. You may need to ignore/disable compiler warnings<br>
about C++ arrays with dynamic sizes. Alternatively, you can allocate<br>
pfds dynamically (as you suggested).<br>
<br>
If you want to fix the bug, audit all Biggest_FD- and<br>
SQUID_MAXFD-related code to make sure the two are always in sync.<br>
<br>
<br>
HTH,<br>
<br>
Alex.<br>
<div><div class="h5"><br>
<br>
<br>
> 2016-10-18 8:29 GMT+03:00 Amos Jeffries:<br>
><br>
>     FYI: Squid-3.5.23 does not exist yet. What is the output of "squid -v" ?<br>
><br>
>     On 18/10/2016 5:01 a.m., oleg gv wrote:<br>
>     > I have big traffic (at least 100 computers) , and squid often crashed in<br>
>     > Comm::DoSelect(int msec) function.<br>
>     > I have interception mode and NAT redirect.<br>
>     ><br>
>     > In coredump I saw then bug is in next fragment of code:<br>
>     ><br>
>     > 446│         for (size_t loopIndex = 0; loopIndex < nfds; ++loopIndex) {<br>
>     > 447│             fde *F;<br>
>     > 448│             int revents = pfds[loopIndex].revents;<br>
>     > 449│             fd = pfds[loopIndex].fd;<br>
>     > 450│<br>
>     > 451│             if (fd == -1)<br>
>     > 452│                 continue;<br>
>     > 453│<br>
>     > 454├>            if (fd_table[fd].flags.read_<wbr>pending)<br>
>     > 455│                 revents |= POLLIN;<br>
>     ><br>
>     > SIGSEGV occured often (about 1 time in a minute) in line 454 : fd=-66012128<br>
>     > , loopindex=283<br>
>     ><br>
>     > (gdb) p pfds[282]<br>
>     > $17 = {fd = 291, events = 64, revents = 0}   -- looks ok<br>
>     ><br>
>     > (gdb) p pfds[283]<br>
>     > $18 = {fd = -66012128, events = 32595, revents = 0}  -- looks strange and<br>
>     > spoiled<br>
>     ><br>
>     > (gdb) p Biggest_FD<br>
>     > $19 = 292<br>
>     ><br>
><br>
>     What is the nfds value ?<br>
><br>
>     It looks to me like only 282 FD have operations to perform on this I/O<br>
>     cycle.<br>
><br>
>     What I/O module is being used?<br>
><br>
>      src/comm/ModDevPoll.cc:Comm::<wbr>DoSelect(int msec)<br>
>      src/comm/ModPoll.cc:Comm::<wbr>DoSelect(int msec)<br>
><br>
><br>
>     Amos<br>
><br>
>     ______________________________<wbr>_________________<br>
>     squid-dev mailing list<br>
</div></div>>     <a href="mailto:squid-dev@lists.squid-cache.org">squid-dev@lists.squid-cache.<wbr>org</a> <mailto:<a href="mailto:squid-dev@lists.squid-cache.org">squid-dev@lists.squid-<wbr>cache.org</a>><br>
>     <a href="http://lists.squid-cache.org/listinfo/squid-dev" rel="noreferrer" target="_blank">http://lists.squid-cache.org/<wbr>listinfo/squid-dev</a><br>
>     <<a href="http://lists.squid-cache.org/listinfo/squid-dev" rel="noreferrer" target="_blank">http://lists.squid-cache.org/<wbr>listinfo/squid-dev</a>><br>
<div class="HOEnZb"><div class="h5">><br>
><br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> squid-dev mailing list<br>
> <a href="mailto:squid-dev@lists.squid-cache.org">squid-dev@lists.squid-cache.<wbr>org</a><br>
> <a href="http://lists.squid-cache.org/listinfo/squid-dev" rel="noreferrer" target="_blank">http://lists.squid-cache.org/<wbr>listinfo/squid-dev</a><br>
><br>
<br>
</div></div></blockquote></div><br></div>