Jack Repenning witnessed this bug once when fooling with svn privately on Linux,
and so has a Collabnet customer on win32. And now D.J. Heap has managed to
reproduce the bug on both win32 and fedora. Apparently it's possible to hit
"control-C" during a checkout cause apache to spike up to 100% cpu, some sort of
infinite loop.
I'm filing this as a P1, because this is a major showstopper: it prevents work
from being done (i.e. a client can bring down an entire server), and there's no
workaround. We need a mod_dav_svn or apache expert to hunt this down ASAP. A
client should *never* be able to bring down a server.
Here's DJ's report:
-------------------------------------------
I was able to recreate the problem I think -- if you cancel a checkout
from Apache it looks to me like mod_dav_svn keeps going.
After cancelling it at the client I attached to Apache and followed the
loops around a few times, but I couldn't see how mod_dav_svn would be
able to tell if the socket was dead. I'm not sure if it's supposed to
check something or if Apache tells it the client died or what. Also, I
get the same behavior on Linux (Fedora Core 1).
With svnserve, the client process and server thread exit almost immediately.
The mod_dav_svn stacktrace (a few seconds after the client has been
Ctrl-C'd) looked like this and just kept looping and sending the xml
until complete:
> mod_dav_svn.so!svn_fs__parse_entries_skel
mod_dav_svn.so!get_dir_entries
mod_dav_svn.so!dir_entry_id_from_node
mod_dav_svn.so!svn_fs__dag_open
mod_dav_svn.so!open_path
mod_dav_svn.so!txn_body_node_id
mod_dav_svn.so!do_retry
mod_dav_svn.so!svn_fs__retry_txn
mod_dav_svn.so!svn_fs_node_id
mod_dav_svn.so!dav_svn_get_safe_cr
mod_dav_svn.so!send_vsn_url
mod_dav_svn.so!add_helper
mod_dav_svn.so!upd_add_file
mod_dav_svn.so!add_file_or_dir
mod_dav_svn.so!delta_dirs
mod_dav_svn.so!add_file_or_dir
mod_dav_svn.so!delta_dirs
mod_dav_svn.so!add_file_or_dir
mod_dav_svn.so!delta_dirs
mod_dav_svn.so!add_file_or_dir
mod_dav_svn.so!delta_dirs
mod_dav_svn.so!add_file_or_dir
mod_dav_svn.so!delta_dirs
mod_dav_svn.so!svn_repos_dir_delta
mod_dav_svn.so!finish_report
mod_dav_svn.so!svn_repos_finish_report
mod_dav_svn.so!dav_svn__update_report
mod_dav_svn.so!dav_svn_deliver_report
mod_dav.so!dav_method_report