Brian Pane [Mon, 29 Apr 2002 01:57:39 +0000 (01:57 +0000)]
Removed some code from the mutex-protected block in ap_queue_pop().
If the worker thread synchronization is working properly, it's not
necessary to set these fields to NULL after removing an element from
the queue, and it's IMO more important to have a shorter code path
leading up to the mutex_unlock. I left in support for NULLing the
fields when debugging, though.
Brian Pane [Mon, 29 Apr 2002 01:03:17 +0000 (01:03 +0000)]
Because mod_imap's handler runs on every request in the default
configuration, rearrange the code to keep it from allocating a few
pages worth of local variables on the stack on requests that don't
use imagemaps
Rename the worker_stack_interrupt_all() function as worker_stack_terminate().
Also, broadcast a signal after we set the terminate flag on the worker stack.
Brian Pane [Sun, 28 Apr 2002 23:12:35 +0000 (23:12 +0000)]
Removed the "not_full" condition variable and associated conditional
logic from the file descriptor queue, now that we can rely on the
idle worker reference count to keep the listener from trying to
push connections into a full queue
Reviewed by: Aaron Bannert (concept)
- Add a "state" variable to the worker_wakeup_info struct. This is
used to make sure that we act on the correct signal, and to know when
to shut down a worker thread.
- Fix the call when the worker thread waits for a connection to use
the new state variable and use mutexes around the cond_wait() call.
- Change the interrupt_all() call to set the WORKER_TERMINATED state.
- Add two AP_DEBUG_ASSERT() to make sure that we aren't waking up
a worker thread before it is idle.
- We don't need the listener_blocked flag, just check if the element
we're adding makes the stack non-empty.
- When we are terminated, return APR_EOF; catch this event in the
worker thread and the listener thread.
- When shutting down, always signal a potential listener thread.
- Wait to signal the listener thread until after we add the worker
element to the stack.
Detect APR_EINTR from ap_queue_pop() and avoid calling
ap_queue_info_set_idle() more than once at a time per worker thread.
This fixes an assert coredump.
Submitted by: Aaron Bannert
Reviewed by: Brian Pane
When we signal a condition variable, we need to own the lock that
is associated with that condition variable. This isn't necessary
for Solaris, but for Posix it is.
If a subreq added a filter (say INCLUDES) and the subreq was promoted via
fast_redirect, the filter would still point at the subreq - rather than
the original r. So, we must update any filters pointing at rr to be r.
This would cause lots of problems with mod_include with mod_dir requests
such as seen in PR 7966. mod_include would be unsetting the headers_out
of rr instead of r. But, we disassociate rr->headers_out and r->headers_out.
Therefore, the C-L header in r->headers_out would remain - even though it
bears no relation to what we will be outputting - causing problems.
This also now permits chunked-encoding of mod_dir/mod_include requests
which could never happen before and fixes the content-length problem
seen in PR 7966.
As hinted at in PR 7966, there is a race condition - if for some reason
the server stalls reading an included file (or even better, placing a
sleep in the cgi-bin script!), the invalid C-L may get propogated to the
client.
(Note that internal_internal_redirect has this same code fragment.)
Brian Pane [Sun, 28 Apr 2002 05:28:18 +0000 (05:28 +0000)]
Moved the recycled pool list from the queue to the queue_info structure.
The advantage of doing this is that it enables us to guarantee that the
number of ptrans pools in existence at once is no greater than the
number of worker threads, and that we'll never have to delete ptrans
pools.
Modify the worker MPM to not accept() new connections until
there is an available worker thread. This prevents queued
connections from starving for processing time while long-running
connections were hogging all the available threads.
Add a "queue_info" structure to the worker MPM. This is used to prevent
the listener thread from accept()ing more connections than there are
available workers. This prevents long-running requests from starving
connections that have been accepted but not yet processed.
The queue_info is a simple counter, mutex, and condition variable. Only
the listener thread blocks on the condition, and only when there are no
idle workers. In the fast path there is a mutex lock, integer decrement,
and and unlock (among a few conditionals). The worker threads each notify
the queue_info when they are about to block on the normal worker_queue
waiting for some connection to process, which wakes up any sleeping
listener thread to go perform another accept() in parallel.
After review and testing against all of the PSDK examples (see
http://www.apache.org/~wrowe/ for commentary on building the
examples and making them work) ... this disable-optimization
should no longer be required.
Added a check to make sure that h_aliases is not NULL before we try to
dereference it in the for(...) loop. Attempting to dereference a NULL pointer
was causing a fault if there were no aliases found.
Graham Leggett [Fri, 26 Apr 2002 21:54:38 +0000 (21:54 +0000)]
Apply a patch to compile cleanly again against changes to the shared memory
implementation in APR.
PR:
Obtained from:
Submitted by: Eduardo Garcia Lopez <egarcia@stream18.com>
Reviewed by:
Convert the worker MPM's fdqueue from a LIFO back into a FIFO. Since
elements in the queue represent accept()ed connections, we want them
to be processed in the order that they were received. (I erroneously
converted it to a LIFO quite awhile ago in the hopes that it would
improve cache efficiency.)
Remember to perform a make clean in the worker directory after this patch,
since this patch changes the size of the fd_queue_t object (which is
allocated in worker.c).
Some of these worker bugs may or may not be showstoppers, but I'll let
Striker decide that. I hope to have the top two of these finished in
the next 24 hours, but the third I may need some help with.
Not yet added to the default build, but curious if they build and run.
mod_deflate tested with both zlib 1.1.3/1.1.4, unpacked in srclib/zlib/.
Zlib only seems to have .dll builds, not very efficient when a single
binary is built against sources, so we compile the appropriate sources.
Your mileage may vary.
I just posted a few bug fixes that need to go into the worker MPM, so
I'm -1 here until those are fixed. I also think we need to do a lot more
load/soak/burn testing on worker before we switch it to be the default.
(and maybe by that time we'll have a better candidate for the hybrid
MP/MT MPM).
During the 1.3->2.0 migragrion; ab its #defined VERSION own string was replaced
by that of the base server distribution it sits in. Propably by accident.
This is propably not a good idea - as ideally one would like to be able to compare
ab runs as much as possible - even across releases of apache 2.0 - assuming ab or
the dependent APR has not changed (note to self: we do not track APR in our version
structure). This commit decouples the version strings for now. Though the actual
value may be nicely confusing.
Fix suexec invocations from userdir - the ~ was not being prepended to the
uid per our convention. Therefore, bad things would happen (like we
wouldn't cd to the right directory).
Add a flag to the ap_unix_identity_t structure to indicate if we are in
a userdir - if so, prefix the ~.
(Modified by Justin, but Colm's patch pointed me in the right direction.)
Since UserDir is a raw argument, our config system allows it to be blank.
To save us all the hassle, just flat out reject this silliness. We could
treat blank as ".", but let the user shoot themselves in the foot
explicitly (and don't give them any ideas on how to do it).
We must always use case-insensitive comparisons in mod_mime even if
our platform is not "case-blind." This matches 1.3 behavior and our
docs say that the extension argument is case-insensitive anyway.
This is case where the code fix is easier than the doc fix. =)
Brian Havard [Thu, 25 Apr 2002 03:16:44 +0000 (03:16 +0000)]
Get proxy protocol modules to build on OS/2. This adds the mod_proxy dll's
import library to the link, making the public symbols in it available to the
protocol modules at build time.
Major improvement in concurrent processing for AB:
- Enable non-blocking connects.
- Prevent quasi-blocking mode apr_recv (which would prevent AB from
multiplexing over the entire descriptor set).
- Catch other fatal apr_recv() errors.
[This patch is slightly different than the one posted to the dev list,
but regardless thanks to the many people who reviewed this.]
A bug affecting any platform that had pre-lstat'ed the file or directory
in question. We neglected to clear the FINFO_LINK bit that told us this
was lstat()ed, but also causes stat() to follow an lstat() approach.
This is part 2 of 2 to correct the NTFS Junction (symlink) bug.
Bugz report 8014, identified by Sam Morris <sam@netcity.co.uk>
Clarify the remaining problems with Range: headers. The seg faults went away
when we changed ap_send_error_response to get rid of resource filters.
This was triggered because we generate a lot of invalid 416 responses for SSI.
That happens because the complete length of the entity body (response) isn't
known accurately until after the C/L filter runs. That's C/L's job, after all.
Flipping the order of the byterange and C/L filters fixes the invalid
Content-Range headers and 416's. But then the Content-Length header contains
the full length, rather than the sum of the returned ranges. That's wrong, but
doesn't seem too hard to fix.
Ryan Bloom [Mon, 22 Apr 2002 18:57:12 +0000 (18:57 +0000)]
Fix perchild MPM so that it can be configured with the move to the
experimental directory. Fix perchild MPM so that it uses ap_gname2id
for groups instead of ap_uname2id.
Small optimization, if we are behind (at the 5th segment, for example),
catch up the segment-count-sorted directory list without string compares.
Mostly affects win32 which jumps from seg 0 (root) to 4 for UNC path names.
AcceptPathInfo was totally backwards... it would reject when set to on and
by default and accept when set to off for the default handler, and would
reject only if set to accept for mod_cgi(d) and mod_isapi.
Brian Pane [Mon, 22 Apr 2002 04:48:11 +0000 (04:48 +0000)]
Skip a potentially heavyweight call to sysconf, plus some
local variable initializations, in the common case where the
request is not for the server status page
Bill Stoddard [Mon, 22 Apr 2002 03:25:40 +0000 (03:25 +0000)]
Added the APLOG_TOCLIENT flag to ap_log_rerror() to
explicitly tell the server that warning messages should be sent
to the client in addition to being recorded in the error log.
Prior to this change, ap_log_rerror() always sent warning
messages to the client. In one case, a faulty CGI script caused
the server to send a warning message to the client that contained
the full path to the CGI script. This could be considered a
minor security exposure.