On Mon, 2011-03-21 at 22:28 +0000, Julian Foad wrote:
> On Mon, 2011-03-21 at 17:23 -0400, C. Michael Pilato wrote:
> > Recently (last week or so), I've noticed that 'svn commit' has gotten
> > *really* slow.  As in, it takes a full 30 seconds for 'svn commit' to return
> > when asked to perform a no-op commit of my Subversion trunk directory.
> > 
> > I was able to discern through code-stepping that the lion's share of the
> > time spent was in the harvest_committables() code.  I sorta suspected
> > svn_wc__node_get_children_of_working_node() as the problem point, given that
> > that's the only thing that's really changed in the harvest_committables()
> > codepath recently, but I didn't really know how to verify that.
> > 
> > So today I started trying to mess with callgrind a bit.  Here's some heavily
> > filtered output from callgrind_annotate on a no-op commit of just our
> > trunk/subversion/tests/cmdline directory (committing at higher levels was
> > taking FOREVER while profiling):
> > 
> > 4,357,656,366  112,781     756  subversion/svn/main.c:main
> > 4,352,930,262  112,657     753  subversion/svn/commit-cmd.c:svn_cl__commit
> > 4,350,334,930  112,511     751
> > subversion/libsvn_client/commit.c:svn_client_commit5
> > 4,349,499,552  112,341     751
> > subversion/libsvn_client/commit_util.c:svn_client__harvest_committables
> > 4,348,470,026  112,079     748
> > subversion/libsvn_client/commit_util.c:harvest_committables
> > 4,269,103,898  108,354     729  
> > subversion/libsvn_subr/sqlite.c:svn_sqlite__step
> > 4,189,859,746   85,024     604
> > subversion/libsvn_wc/node.c:svn_wc__node_get_children_of_working_node
> > 4,179,862,166   83,354     592
> > subversion/libsvn_wc/wc_db.c:svn_wc__db_read_children_of_working_node
> > 4,179,834,710   83,354     592  
> > subversion/libsvn_wc/wc_db.c:gather_children2
> > 4,179,798,573   83,354     592
> > subversion/libsvn_wc/wc_db.c:add_children_to_hash
> > 4,046,859,894  116,411     761
> > subversion/libsvn_client/commit_util.c:harvest_committables'2
> >    90,828,539   16,308      85
> > subversion/libsvn_wc/wc_db.c:svn_wc__db_read_info
> >    83,508,483   18,868     101  subversion/libsvn_wc/wc_db.c:read_info
> >    32,672,951      492       6
> > subversion/libsvn_wc/wc_db_wcroot.c:svn_wc__db_wcroot_parse_local_abspath
> >    29,042,308    3,196      17
> > subversion/libsvn_wc/wc_db.c:svn_wc__db_read_props
> >    26,587,135    3,253      17
> > subversion/libsvn_wc/wc_db_txn.c:svn_wc__db_with_txn
> >    26,561,409    3,253      17
> > subversion/libsvn_subr/sqlite.c:svn_sqlite__with_lock
> > [...]
> > 
> > I *think* this supports my hypothesis regarding
> > svn_wc__node_get_children_of_working_node().  I have yet to try reverting
> > the introduction of this function to see if that helps, but (because I'm out
> > of time for today) I wanted to at least get this data out there for someone
> > else to see.
> 
> Ah, that would be me then.  Bert mentioned just now on IRC that
> "STMT_SELECT_WORKING_CHILDREN should perform a max(op_depth) on the
> parent node or it might create a huge join which just returns the same
> thing as the old gather children but then a lot slower".
> 
> I think that's what I meant it to do but it looks like I forgot the
> "max".  Testing with a "max" now.

Bah, I think I misunderstood.  I hadn't forgotten the "max", I had used
the "nodes_current" view instead of "max".  And you meant the use of
"nodes_current" might create a huge join ....

Thanks Bert for finding much more efficient ways today to do this.

- Julian


Reply via email to