Bug 3906: Filedescriptor leaks on snmp
author: Alex Rousskov <rousskov@measurement-factory.com>, Christos Tsantilas <chtsanti@users.sourceforge.net>
Coordinator should not send SNMP client FD to strands when broadcasting SNMP
requests. Strands do not need the descriptor and were forgetting to close it,
causing one FD leak on every SNMP query in SMP mode.
Enhance Ipc::TypedMsgHdr to be able to tell whether the message has a FD.
Amos Jeffries [Fri, 1 Nov 2013 23:47:58 +0000 (16:47 -0700)]
Make Http parser incremental
This makes the parser track the start of the un-parsed buffer region and
resume parsing at that point instead of reset to the beginning.
- add state to mark completion of the first line (request-line)
- add unit test for incremental parse states including BWS
- make the state tracking member of HttpParser private
Amos Jeffries [Fri, 1 Nov 2013 15:32:58 +0000 (08:32 -0700)]
Convert HttpParser to dynamic reference counted class
This creates a dedicated HttpParser object for each new request in
preparation for incremental parsing of the client connection buffer.
NP: incremental parse is not yet done so when requests require multiple
calls of the parse routine it will for now generate a new parser state
object and discard the previous partial parse details.
Amos Jeffries [Thu, 31 Oct 2013 19:13:17 +0000 (13:13 -0600)]
Drop String::undefined()
It appears that all code using String::undefined() for boolean tests can
remain logically consistent using checks on string size() instead.
This helps by removing part of the
undefined-empty/defined-empty/0-length-empty string state
differentiation.
Alex Rousskov [Thu, 31 Oct 2013 16:22:17 +0000 (10:22 -0600)]
Avoid "hot idle": A series of rapid select() calls with zero timeout.
Squid uses "infinite" precision when it comes to deciding whether the next
timed event is ready but uses millisecond (1e-3) precision when deciding how
long to wait before the next event will be ready. This inconsistency results
in the EventScheduler engine telling the main loop that it has 0 milliseconds
to poll pending I/O, but when asked again (after the I/O is quickly polled),
the EventScheduler engine often does not schedule the promised event and tells
the main loop to poll for another 0 milliseconds again. This cycling may
happen many times in a row (until enough time is wasted for the next event to
become ready using higher precision).
The fixed code adds a minimum 1ms delay for not-yet-ready events. It also
places both decisions into one method (EventScheduler::timeRemaining), and
tries to polish/document decision logic (which is more complex than it may
seem) because the code has to avoid both inconsistent decisions and hot idle
loops while maintaining the traditional "no event is fired before it is due"
guarantee.
TODO: Idle Squid still runs hotter than it should because the maximum waiting
time is artificially capped outside the event queue to EVENT_LOOP_TIMEOUT=1s.
This causes at most one extra loop iteration per second.
Amos Jeffries [Sun, 27 Oct 2013 05:08:49 +0000 (22:08 -0700)]
Receive annotations from authentication helpers
This saves the kv-pair from authentication helper responses as
annotations on the HttpRequest which was authenticated and pass
on from there to logging.
Added a method appendNewOnly() to ensure duplicate-free addition
to a NotePairs list.
Also, fixes a bug in hasPair() accessor which was returning true
if either the key OR the value matched.
ie. hasPair("a","1") would match true for notes "a=2 b=1"
This uses the include ordering sort script to enforce blocks of include
statements being in alphasymbolic order with squid.h at teh top if it is
present.