You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2014/12/30 17:06:43 UTC

svn commit: r1648542 - /subversion/trunk/subversion/libsvn_fs_fs/tree.c

Author: stefan2
Date: Tue Dec 30 16:06:43 2014
New Revision: 1648542

URL: http://svn.apache.org/r1648542
Log:
In FSFS, remove the L1 DAG cache locking parameters.

* subversion/libsvn_fs_fs/tree.c
  (get_dag): Remove NEEDS_LOCK_CACHE parameter.
  (dag_node_cache_get): Same. Update docstring.
  (get_copy_inheritance,
   open_path,
   make_path_mutable): Update callers.
  (get_dag): Remove NEEDS_LOCK_CACHE parameter and update sub-routine calls.
  (svn_fs_fs__node_id,
   fs_node_relation,
   svn_fs_fs__node_created_rev,
   fs_node_created_path,
   fs_node_prop,
   fs_node_proplist,
   fs_props_changed,
   get_root,
   fs_dir_entries,
   copy_helper,
   fs_copied_from,
   fs_file_length,
   fs_file_checksum,
   fs_file_contents,
   fs_try_process_file_contents,
   fs_contents_changed,
   fs_get_file_delta_stream,
   history_prev,
   crawl_directory_dag_for_mergeinfo,
   add_descendant_mergeinfo): Update caller.

Modified:
    subversion/trunk/subversion/libsvn_fs_fs/tree.c

Modified: subversion/trunk/subversion/libsvn_fs_fs/tree.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/tree.c?rev=1648542&r1=1648541&r2=1648542&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/tree.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/tree.c Tue Dec 30 16:06:43 2014
@@ -100,7 +100,6 @@ typedef struct fs_txn_root_data_t
 static svn_error_t * get_dag(dag_node_t **dag_node_p,
                              svn_fs_root_t *root,
                              const char *path,
-                             svn_boolean_t needs_lock_cache,
                              apr_pool_t *pool);
 
 static svn_fs_root_t *make_revision_root(svn_fs_t *fs, svn_revnum_t rev,
@@ -377,15 +376,11 @@ locate_cache(svn_cache__t **cache,
 /* Return NODE for PATH from ROOT's node cache, or NULL if the node
    isn't cached; read it from the FS. *NODE remains valid until either
    POOL or the FS gets cleared or destroyed (whichever comes first).
-
-   Since locking can be expensive and POOL may be long-living, for
-   nodes that will not need to survive the next call to this function,
-   set NEEDS_LOCK_CACHE to FALSE. */
+ */
 static svn_error_t *
 dag_node_cache_get(dag_node_t **node_p,
                    svn_fs_root_t *root,
                    const char *path,
-                   svn_boolean_t needs_lock_cache,
                    apr_pool_t *pool)
 {
   svn_boolean_t found;
@@ -771,7 +766,7 @@ get_copy_inheritance(copy_id_inherit_t *
   SVN_ERR(svn_fs_fs__dag_get_copyroot(&copyroot_rev, &copyroot_path,
                                       child->node));
   SVN_ERR(svn_fs_fs__revision_root(&copyroot_root, fs, copyroot_rev, pool));
-  SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path, FALSE, pool));
+  SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path, pool));
   copyroot_id = svn_fs_fs__dag_get_id(copyroot_node);
 
   if (svn_fs_fs__id_compare(copyroot_id, child_id) == svn_fs_node_unrelated)
@@ -979,7 +974,7 @@ open_path(parent_path_t **parent_path_p,
       directory = svn_dirent_dirname(path, pool);
       if (directory[1] != 0) /* root nodes are covered anyway */
         {
-          SVN_ERR(dag_node_cache_get(&here, root, directory, TRUE, pool));
+          SVN_ERR(dag_node_cache_get(&here, root, directory, pool));
 
           /* Did the shortcut work? */
           if (here)
@@ -1046,7 +1041,7 @@ open_path(parent_path_t **parent_path_p,
              complete path. */
           if (next || !(flags & open_path_uncached))
             SVN_ERR(dag_node_cache_get(&cached_node, root, path_so_far->data,
-                                       TRUE, pool));
+                                       pool));
           if (cached_node)
             child = cached_node;
           else
@@ -1185,8 +1180,7 @@ make_path_mutable(svn_fs_root_t *root,
                                           parent_path->node));
       SVN_ERR(svn_fs_fs__revision_root(&copyroot_root, root->fs,
                                        copyroot_rev, pool));
-      SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path,
-                      FALSE, pool));
+      SVN_ERR(get_dag(&copyroot_node, copyroot_root, copyroot_path, pool));
 
       child_id = svn_fs_fs__dag_get_id(parent_path->node);
       copyroot_id = svn_fs_fs__dag_get_id(copyroot_node);
@@ -1224,15 +1218,11 @@ make_path_mutable(svn_fs_root_t *root,
 /* Open the node identified by PATH in ROOT.  Set DAG_NODE_P to the
    node we find, allocated in POOL.  Return the error
    SVN_ERR_FS_NOT_FOUND if this node doesn't exist.
-
-   Since locking can be expensive and POOL may be long-living, for
-   nodes that will not need to survive the next call to this function,
-   set NEEDS_LOCK_CACHE to FALSE. */
+ */
 static svn_error_t *
 get_dag(dag_node_t **dag_node_p,
         svn_fs_root_t *root,
         const char *path,
-        svn_boolean_t needs_lock_cache,
         apr_pool_t *pool)
 {
   parent_path_t *parent_path;
@@ -1241,7 +1231,7 @@ get_dag(dag_node_t **dag_node_p,
   /* First we look for the DAG in our cache
      (if the path may be canonical). */
   if (*path == '/')
-    SVN_ERR(dag_node_cache_get(&node, root, path, needs_lock_cache, pool));
+    SVN_ERR(dag_node_cache_get(&node, root, path, pool));
 
   if (! node)
     {
@@ -1251,8 +1241,7 @@ get_dag(dag_node_t **dag_node_p,
        * performance benefit over previously checking path for being
        * canonical. */
       path = svn_fs__canonicalize_abspath(path, pool);
-      SVN_ERR(dag_node_cache_get(&node, root, path, needs_lock_cache,
-                                 pool));
+      SVN_ERR(dag_node_cache_get(&node, root, path, pool));
 
       if (! node)
         {
@@ -1331,7 +1320,7 @@ svn_fs_fs__node_id(const svn_fs_id_t **i
     {
       dag_node_t *node;
 
-      SVN_ERR(get_dag(&node, root, path, FALSE, pool));
+      SVN_ERR(get_dag(&node, root, path, pool));
       *id_p = svn_fs_fs__id_copy(svn_fs_fs__dag_get_id(node), pool);
     }
   return SVN_NO_ERROR;
@@ -1380,12 +1369,12 @@ fs_node_relation(svn_fs_node_relation_t
 
   /* We checked for all separations between ID spaces (repos, txn).
    * Now, we can simply test for the ID values themselves. */
-  SVN_ERR(get_dag(&node, root_a, path_a, FALSE, pool));
+  SVN_ERR(get_dag(&node, root_a, path_a, pool));
   id = svn_fs_fs__dag_get_id(node);
   rev_item_a = *svn_fs_fs__id_rev_item(id);
   node_id_a = *svn_fs_fs__id_node_id(id);
 
-  SVN_ERR(get_dag(&node, root_b, path_b, FALSE, pool));
+  SVN_ERR(get_dag(&node, root_b, path_b,  pool));
   id = svn_fs_fs__dag_get_id(node);
   rev_item_b = *svn_fs_fs__id_rev_item(id);
   node_id_b = *svn_fs_fs__id_node_id(id);
@@ -1408,7 +1397,7 @@ svn_fs_fs__node_created_rev(svn_revnum_t
 {
   dag_node_t *node;
 
-  SVN_ERR(get_dag(&node, root, path, FALSE, pool));
+  SVN_ERR(get_dag(&node, root, path, pool));
   return svn_fs_fs__dag_get_revision(revision, node, pool);
 }
 
@@ -1423,7 +1412,7 @@ fs_node_created_path(const char **create
 {
   dag_node_t *node;
 
-  SVN_ERR(get_dag(&node, root, path, TRUE, pool));
+  SVN_ERR(get_dag(&node, root, path, pool));
   *created_path = svn_fs_fs__dag_get_created_path(node);
 
   return SVN_NO_ERROR;
@@ -1487,7 +1476,7 @@ fs_node_prop(svn_string_t **value_p,
   dag_node_t *node;
   apr_hash_t *proplist;
 
-  SVN_ERR(get_dag(&node, root, path, FALSE, pool));
+  SVN_ERR(get_dag(&node, root, path,  pool));
   SVN_ERR(svn_fs_fs__dag_get_proplist(&proplist, node, pool));
   *value_p = NULL;
   if (proplist)
@@ -1510,7 +1499,7 @@ fs_node_proplist(apr_hash_t **table_p,
   apr_hash_t *table;
   dag_node_t *node;
 
-  SVN_ERR(get_dag(&node, root, path, FALSE, pool));
+  SVN_ERR(get_dag(&node, root, path, pool));
   SVN_ERR(svn_fs_fs__dag_get_proplist(&table, node, pool));
   *table_p = table ? table : apr_hash_make(pool);
 
@@ -1631,8 +1620,8 @@ fs_props_changed(svn_boolean_t *changed_
       (SVN_ERR_FS_GENERAL, NULL,
        _("Cannot compare property value between two different filesystems"));
 
-  SVN_ERR(get_dag(&node1, root1, path1, TRUE, pool));
-  SVN_ERR(get_dag(&node2, root2, path2, TRUE, pool));
+  SVN_ERR(get_dag(&node1, root1, path1, pool));
+  SVN_ERR(get_dag(&node2, root2, path2, pool));
   return svn_fs_fs__dag_things_different(changed_p, NULL,
                                          node1, node2, strict, pool);
 }
@@ -1645,7 +1634,7 @@ fs_props_changed(svn_boolean_t *changed_
 static svn_error_t *
 get_root(dag_node_t **node, svn_fs_root_t *root, apr_pool_t *pool)
 {
-  return get_dag(node, root, "/", TRUE, pool);
+  return get_dag(node, root, "/", pool);
 }
 
 
@@ -2376,7 +2365,7 @@ fs_dir_entries(apr_hash_t **table_p,
   int i;
 
   /* Get the entries for this path in the caller's pool. */
-  SVN_ERR(get_dag(&node, root, path, FALSE, pool));
+  SVN_ERR(get_dag(&node, root, path, pool));
   SVN_ERR(svn_fs_fs__dag_dir_entries(&table, node, pool));
 
   /* Convert directory array to hash. */
@@ -2576,7 +2565,7 @@ copy_helper(svn_fs_root_t *from_root,
        _("Copy immutable tree not supported"));
 
   /* Get the NODE for FROM_PATH in FROM_ROOT.*/
-  SVN_ERR(get_dag(&from_node, from_root, from_path, TRUE, pool));
+  SVN_ERR(get_dag(&from_node, from_root, from_path, pool));
 
   /* Build up the parent path from TO_PATH in TO_ROOT.  If the last
      component does not exist, it's not that big a deal.  We'll just
@@ -2653,7 +2642,7 @@ copy_helper(svn_fs_root_t *from_root,
                                             pool));
 
       /* Make a record of this modification in the changes table. */
-      SVN_ERR(get_dag(&new_node, to_root, to_path, TRUE, pool));
+      SVN_ERR(get_dag(&new_node, to_root, to_path, pool));
       SVN_ERR(add_change(to_root->fs, txn_id, to_path,
                          svn_fs_fs__dag_get_id(new_node), kind, FALSE,
                          FALSE, FALSE, svn_fs_fs__dag_node_kind(from_node),
@@ -2734,7 +2723,7 @@ fs_copied_from(svn_revnum_t *rev_p,
 
   /* There is no cached entry, look it up the old-fashioned
       way. */
-  SVN_ERR(get_dag(&node, root, path, TRUE, pool));
+  SVN_ERR(get_dag(&node, root, path, pool));
   SVN_ERR(svn_fs_fs__dag_get_copyfrom_rev(rev_p, node));
   SVN_ERR(svn_fs_fs__dag_get_copyfrom_path(path_p, node));
 
@@ -2805,7 +2794,7 @@ fs_file_length(svn_filesize_t *length_p,
   dag_node_t *file;
 
   /* First create a dag_node_t from the root/path pair. */
-  SVN_ERR(get_dag(&file, root, path, FALSE, pool));
+  SVN_ERR(get_dag(&file, root, path, pool));
 
   /* Now fetch its length */
   return svn_fs_fs__dag_file_length(length_p, file, pool);
@@ -2824,7 +2813,7 @@ fs_file_checksum(svn_checksum_t **checks
 {
   dag_node_t *file;
 
-  SVN_ERR(get_dag(&file, root, path, FALSE, pool));
+  SVN_ERR(get_dag(&file, root, path, pool));
   return svn_fs_fs__dag_file_checksum(checksum, file, kind, pool);
 }
 
@@ -2843,7 +2832,7 @@ fs_file_contents(svn_stream_t **contents
   svn_stream_t *file_stream;
 
   /* First create a dag_node_t from the root/path pair. */
-  SVN_ERR(get_dag(&node, root, path, FALSE, pool));
+  SVN_ERR(get_dag(&node, root, path, pool));
 
   /* Then create a readable stream from the dag_node_t. */
   SVN_ERR(svn_fs_fs__dag_get_contents(&file_stream, node, pool));
@@ -2866,7 +2855,7 @@ fs_try_process_file_contents(svn_boolean
                              apr_pool_t *pool)
 {
   dag_node_t *node;
-  SVN_ERR(get_dag(&node, root, path, FALSE, pool));
+  SVN_ERR(get_dag(&node, root, path, pool));
 
   return svn_fs_fs__dag_try_process_file_contents(success, node,
                                                   processor, baton, pool);
@@ -3190,8 +3179,8 @@ fs_contents_changed(svn_boolean_t *chang
         (SVN_ERR_FS_GENERAL, NULL, _("'%s' is not a file"), path2);
   }
 
-  SVN_ERR(get_dag(&node1, root1, path1, TRUE, pool));
-  SVN_ERR(get_dag(&node2, root2, path2, TRUE, pool));
+  SVN_ERR(get_dag(&node1, root1, path1, pool));
+  SVN_ERR(get_dag(&node2, root2, path2, pool));
   return svn_fs_fs__dag_things_different(NULL, changed_p,
                                          node1, node2, strict, pool);
 }
@@ -3211,10 +3200,10 @@ fs_get_file_delta_stream(svn_txdelta_str
   dag_node_t *source_node, *target_node;
 
   if (source_root && source_path)
-    SVN_ERR(get_dag(&source_node, source_root, source_path, TRUE, pool));
+    SVN_ERR(get_dag(&source_node, source_root, source_path, pool));
   else
     source_node = NULL;
-  SVN_ERR(get_dag(&target_node, target_root, target_path, TRUE, pool));
+  SVN_ERR(get_dag(&target_node, target_root, target_path, pool));
 
   /* Create a delta stream that turns the source into the target.  */
   return svn_fs_fs__dag_get_file_delta_stream(stream_p, source_node,
@@ -3678,7 +3667,7 @@ history_prev(svn_fs_history_t **prev_his
 
       SVN_ERR(svn_fs_fs__revision_root(&copyroot_root, fs, copyroot_rev,
                                        scratch_pool));
-      SVN_ERR(get_dag(&node, copyroot_root, copyroot_path, FALSE, scratch_pool));
+      SVN_ERR(get_dag(&node, copyroot_root, copyroot_path, scratch_pool));
       copy_dst = svn_fs_fs__dag_get_created_path(node);
 
       /* If our current path was the very destination of the copy,
@@ -3872,7 +3861,7 @@ crawl_directory_dag_for_mergeinfo(svn_fs
       svn_pool_clear(iterpool);
 
       kid_path = svn_fspath__join(this_path, dirent->name, iterpool);
-      SVN_ERR(get_dag(&kid_dag, root, kid_path, TRUE, iterpool));
+      SVN_ERR(get_dag(&kid_dag, root, kid_path, iterpool));
 
       SVN_ERR(svn_fs_fs__dag_has_mergeinfo(&has_mergeinfo, kid_dag));
       SVN_ERR(svn_fs_fs__dag_has_descendants_with_mergeinfo(&go_down, kid_dag));
@@ -4118,7 +4107,7 @@ add_descendant_mergeinfo(svn_mergeinfo_c
   dag_node_t *this_dag;
   svn_boolean_t go_down;
 
-  SVN_ERR(get_dag(&this_dag, root, path, TRUE, scratch_pool));
+  SVN_ERR(get_dag(&this_dag, root, path, scratch_pool));
   SVN_ERR(svn_fs_fs__dag_has_descendants_with_mergeinfo(&go_down,
                                                         this_dag));
   if (go_down)



Re: svn commit: r1648542 - /subversion/trunk/subversion/libsvn_fs_fs/tree.c

Posted by Stefan Fuhrmann <st...@wandisco.com>.
On Tue, Dec 30, 2014 at 5:47 PM, Evgeny Kotkov <ev...@visualsvn.com>
wrote:

> Stefan Fuhrmann <st...@apache.org> writes:
>
> > URL: http://svn.apache.org/r1648542
> > Log:
> > In FSFS, remove the L1 DAG cache locking parameters.
>
> [...]
>
> As of this revision, I am also seeing random Apache HTTPD Server segfaults.
> I tested two Subversion 1.9.0-dev builds from r1648532 and r1648542.  I
> could
> not reproduce the crashes with the first build, but the second one *does*
> crash
> occasionally.  Here is a sample backtrace:
>

I get it to crash somewhat reproducibly now by setting MaxMemFree=4
and SVN_ALLOCATOR_RECOMMENDED_MAX_FREE to 4096.

Then release builds of mod_dav_svn and svnserve will segfault on
svn diff --summarize -r0:300000 $ApacheRepo. It does not segfault
in debug build, though. Continue investigation ...

-- Stefan^2.

Re: svn commit: r1648542 - /subversion/trunk/subversion/libsvn_fs_fs/tree.c

Posted by Stefan Fuhrmann <st...@wandisco.com>.
On Wed, Dec 31, 2014 at 12:48 AM, Bert Huijben <be...@qqmail.nl> wrote:

> Any idea what causes this difference?
>

Yep, found it. The OS came with a 1.7.9 client.
Using a /trunk client, we are down to ~4min.

Most of that 3 min overhead seems to be HTTP processing
(the client CPU is much busier than against svnserve)
but I haven't actually measured it.


>  Is it all in the security walk?
>
>
>
> The diff --summarize should result in a single report from server to
> client, without additional get requests for data
>
> (except for the one time ra session setup, revision lookup, etc. at the
> start)
>

Well, 1.7.9 seems to behave differently: 3..4min
of server-side processing with no output on the
client console, followed (slowly) sending data to
the client for display. No actual delta seems to
be transferred as the total amount of data is
about the same as with /trunk.

-- Stefan^2.


>
>
> *From:* Stefan Fuhrmann [mailto:stefan.fuhrmann@wandisco.com]
> *Sent:* woensdag 31 december 2014 00:11
> *To:* Evgeny Kotkov
> *Cc:* Stefan Fuhrman; Subversion Development
> *Subject:* Re: svn commit: r1648542 -
> /subversion/trunk/subversion/libsvn_fs_fs/tree.c
>
>
>
> On Tue, Dec 30, 2014 at 5:47 PM, Evgeny Kotkov <
> evgeny.kotkov@visualsvn.com> wrote:
>
> Stefan Fuhrmann <st...@apache.org> writes:
>
> > URL: http://svn.apache.org/r1648542
> > Log:
> > In FSFS, remove the L1 DAG cache locking parameters.
>
> [...]
>
> As of this revision, I am also seeing random Apache HTTPD Server segfaults.
> I tested two Subversion 1.9.0-dev builds from r1648532 and r1648542.  I
> could
> not reproduce the crashes with the first build, but the second one *does*
> crash
> occasionally.  Here is a sample backtrace:
>
>
> [...]
>
> Should be fixed with r1648612.
>
> Interesting observation: svnserve completes the test case in 1 minute
>
> while mod_dav_svn eats a whopping 30 CPU minutes. Everything with
>
> default settings on a format 7 repo with deltified directories.
>
>
>
> -- Stefan^2.
>
>
>

RE: svn commit: r1648542 - /subversion/trunk/subversion/libsvn_fs_fs/tree.c

Posted by Bert Huijben <be...@qqmail.nl>.
Any idea what causes this difference?

 

Is it all in the security walk?

 

The diff --summarize should result in a single report from server to client, without additional get requests for data

(except for the one time ra session setup, revision lookup, etc. at the start)

 

                Bert

 

From: Stefan Fuhrmann [mailto:stefan.fuhrmann@wandisco.com] 
Sent: woensdag 31 december 2014 00:11
To: Evgeny Kotkov
Cc: Stefan Fuhrman; Subversion Development
Subject: Re: svn commit: r1648542 - /subversion/trunk/subversion/libsvn_fs_fs/tree.c

 

On Tue, Dec 30, 2014 at 5:47 PM, Evgeny Kotkov <evgeny.kotkov@visualsvn.com <ma...@visualsvn.com> > wrote:

Stefan Fuhrmann <stefan2@apache.org <ma...@apache.org> > writes:

> URL: http://svn.apache.org/r1648542
> Log:
> In FSFS, remove the L1 DAG cache locking parameters.

[...]

As of this revision, I am also seeing random Apache HTTPD Server segfaults.
I tested two Subversion 1.9.0-dev builds from r1648532 and r1648542.  I could
not reproduce the crashes with the first build, but the second one *does* crash
occasionally.  Here is a sample backtrace:


[...]

Should be fixed with r1648612.

Interesting observation: svnserve completes the test case in 1 minute

while mod_dav_svn eats a whopping 30 CPU minutes. Everything with

default settings on a format 7 repo with deltified directories.

 

-- Stefan^2.

 


Re: svn commit: r1648542 - /subversion/trunk/subversion/libsvn_fs_fs/tree.c

Posted by Stefan Fuhrmann <st...@wandisco.com>.
On Tue, Dec 30, 2014 at 5:47 PM, Evgeny Kotkov <ev...@visualsvn.com>
wrote:

> Stefan Fuhrmann <st...@apache.org> writes:
>
> > URL: http://svn.apache.org/r1648542
> > Log:
> > In FSFS, remove the L1 DAG cache locking parameters.
>
> [...]
>
> As of this revision, I am also seeing random Apache HTTPD Server segfaults.
> I tested two Subversion 1.9.0-dev builds from r1648532 and r1648542.  I
> could
> not reproduce the crashes with the first build, but the second one *does*
> crash
> occasionally.  Here is a sample backtrace:
>

[...]

Should be fixed with r1648612.

Interesting observation: svnserve completes the test case in 1 minute
while mod_dav_svn eats a whopping 30 CPU minutes. Everything with
default settings on a format 7 repo with deltified directories.

-- Stefan^2.

Re: svn commit: r1648542 - /subversion/trunk/subversion/libsvn_fs_fs/tree.c

Posted by Evgeny Kotkov <ev...@visualsvn.com>.
Stefan Fuhrmann <st...@apache.org> writes:

> URL: http://svn.apache.org/r1648542
> Log:
> In FSFS, remove the L1 DAG cache locking parameters.

[...]

As of this revision, I am also seeing random Apache HTTPD Server segfaults.
I tested two Subversion 1.9.0-dev builds from r1648532 and r1648542.  I could
not reproduce the crashes with the first build, but the second one *does* crash
occasionally.  Here is a sample backtrace:

  libsvn_fs-1.dll!get_node_revision_body(..., fs=0x0000000, ...)
  libsvn_fs-1.dll!svn_fs_fs__get_node_revision()
  libsvn_fs-1.dll!get_node_revision()
  libsvn_fs-1.dll!svn_fs_fs__dag_get_node()
  libsvn_fs-1.dll!svn_fs_fs__dag_open()
  libsvn_fs-1.dll!open_path()
  libsvn_fs-1.dll!history_prev()
  libsvn_fs-1.dll!fs_history_prev()
  libsvn_fs-1.dll!svn_fs_history_prev2()
  mod_dav_svn.so!get_last_history_rev()
  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()
  libsvn_repos-1.dll!add_file_smartly()
  libsvn_repos-1.dll!update_entry()
  libsvn_repos-1.dll!delta_dirs()
  libsvn_repos-1.dll!update_entry()
  libsvn_repos-1.dll!delta_dirs()
  libsvn_repos-1.dll!update_entry()
  libsvn_repos-1.dll!delta_dirs()
  libsvn_repos-1.dll!update_entry()
  libsvn_repos-1.dll!delta_dirs()
  (...)
  libsvn_repos-1.dll!delta_dirs()
  libsvn_repos-1.dll!update_entry()
  libsvn_repos-1.dll!delta_dirs()
  libsvn_repos-1.dll!update_entry()
  libsvn_repos-1.dll!delta_dirs()
  libsvn_repos-1.dll!drive()
  libsvn_repos-1.dll!finish_report()
  libsvn_repos-1.dll!svn_repos_finish_report()
  mod_dav_svn.so!dav_svn__update_report()
  mod_dav_svn.so!deliver_report()
  mod_dav.so!dav_method_report()
  ...


Regards,
Evgeny Kotkov