Philip Martin <philip.mar...@wandisco.com> writes: > So that indicates that we > have a scaling problem, and I suspect the ORDER/GROUP part of > STMT_SELECT_NODE_CHILDREN_WALKER_INFO. I don't know whether that is > enough to explain the extreme runtime you are getting.
Michael, are you building 1.7 from source? Will you try a patch? The following patch against 1.7 addresses the above problem and improves the speed of recursive info on my machine: Index: subversion/libsvn_wc/wc-queries.sql =================================================================== --- subversion/libsvn_wc/wc-queries.sql (revision 1164384) +++ subversion/libsvn_wc/wc-queries.sql (working copy) @@ -126,13 +126,10 @@ WHERE wc_id = ?1 AND parent_relpath = ?2 -- STMT_SELECT_NODE_CHILDREN_WALKER_INFO -/* ### See comment at STMT_SELECT_NODE_CHILDREN_INFO. - ### Should C code handle GROUP BY local_relpath ORDER BY op_depths DESC? */ +/* See comment at STMT_SELECT_NODE_CHILDREN_INFO about GROUP/ORDER */ SELECT local_relpath, op_depth, presence, kind FROM nodes WHERE wc_id = ?1 AND parent_relpath = ?2 -GROUP BY local_relpath -ORDER BY op_depth DESC -- STMT_SELECT_ACTUAL_CHILDREN_INFO SELECT prop_reject, changelist, conflict_old, conflict_new, Index: subversion/libsvn_wc/wc_db.c =================================================================== --- subversion/libsvn_wc/wc_db.c (revision 1164384) +++ subversion/libsvn_wc/wc_db.c (working copy) @@ -7156,6 +7156,11 @@ svn_sqlite__reset(stmt))); } +struct read_children_walker_info_item_t { + struct svn_wc__db_walker_info_t child; + apr_int64_t op_depth; +}; + svn_error_t * svn_wc__db_read_children_walker_info(apr_hash_t **nodes, svn_wc__db_t *db, @@ -7167,7 +7172,6 @@ const char *dir_relpath; svn_sqlite__stmt_t *stmt; svn_boolean_t have_row; - apr_int64_t op_depth; SVN_ERR_ASSERT(svn_dirent_is_absolute(dir_abspath)); @@ -7184,26 +7188,38 @@ *nodes = apr_hash_make(result_pool); while (have_row) { - struct svn_wc__db_walker_info_t *child; + struct read_children_walker_info_item_t *child_item; const char *child_relpath = svn_sqlite__column_text(stmt, 0, NULL); const char *name = svn_relpath_basename(child_relpath, NULL); + apr_int64_t op_depth; + svn_boolean_t new_item; svn_error_t *err; - child = apr_hash_get(*nodes, name, APR_HASH_KEY_STRING); - if (child == NULL) - child = apr_palloc(result_pool, sizeof(*child)); + child_item = apr_hash_get(*nodes, name, APR_HASH_KEY_STRING); + if (child_item) + new_item = FALSE; + else + { + child_item = apr_palloc(result_pool, sizeof(*child_item)); + apr_hash_set(*nodes, apr_pstrdup(result_pool, name), + APR_HASH_KEY_STRING, child_item); + new_item = TRUE; + } op_depth = svn_sqlite__column_int(stmt, 1); - child->status = svn_sqlite__column_token(stmt, 2, presence_map); - if (op_depth > 0) + if (new_item || op_depth > child_item->op_depth) { - err = convert_to_working_status(&child->status, child->status); - if (err) - SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt))); + struct svn_wc__db_walker_info_t *child = &child_item->child; + child_item->op_depth = op_depth; + child->status = svn_sqlite__column_token(stmt, 2, presence_map); + if (op_depth > 0) + { + err = convert_to_working_status(&child->status, child->status); + if (err) + SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt))); + } + child->kind = svn_sqlite__column_token(stmt, 3, kind_map); } - child->kind = svn_sqlite__column_token(stmt, 3, kind_map); - apr_hash_set(*nodes, apr_pstrdup(result_pool, name), - APR_HASH_KEY_STRING, child); err = svn_sqlite__step(&have_row, stmt); if (err) -- uberSVN: Apache Subversion Made Easy http://www.uberSVN.com