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 2015/01/17 21:25:48 UTC
svn commit: r1652664 - /subversion/trunk/subversion/libsvn_fs_x/tree.c
Author: stefan2
Date: Sat Jan 17 20:25:48 2015
New Revision: 1652664
URL: http://svn.apache.org/r1652664
Log:
Make FSX revision roots lightweight objects.
The DAG node for the revision's root directory is easy to construct,
relatively large and rarely used. Therefore, don't store it in the
svn_fs_root_t but construct it on demand. This patch covers all code
that would previously access svn_fs_root_t's FSAP_DATA.
* subversion/libsvn_fs_x/tree.c
(make_revision_root): We won't need the ROOT_DIR DAG node.
(svn_fs_x__revision_root): Update caller. Make sure we reject calls
for invalid / non-existent revisions.
(root_node): Construct the DAG node instead of taking it from ROOT.
(x_node_id): Directly construct revision root IDs.
(make_revision_root): Don't store the root node; leave FSAP_DATA NULL.
(svn_fs_x__verify_root): Call common function to get the root node.
Modified:
subversion/trunk/subversion/libsvn_fs_x/tree.c
Modified: subversion/trunk/subversion/libsvn_fs_x/tree.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_x/tree.c?rev=1652664&r1=1652663&r2=1652664&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/tree.c Sat Jan 17 20:25:48 2015
@@ -106,7 +106,6 @@ get_dag(dag_node_t **dag_node_p,
static svn_fs_root_t *
make_revision_root(svn_fs_t *fs,
svn_revnum_t rev,
- dag_node_t *root_dir,
apr_pool_t *pool);
static svn_error_t *
@@ -541,13 +540,10 @@ svn_fs_x__revision_root(svn_fs_root_t **
svn_revnum_t rev,
apr_pool_t *pool)
{
- dag_node_t *root_dir;
-
SVN_ERR(svn_fs__check_fs(fs, TRUE));
+ SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, pool));
- SVN_ERR(svn_fs_x__dag_revision_root(&root_dir, fs, rev, pool));
-
- *root_p = make_revision_root(fs, rev, root_dir, pool);
+ *root_p = make_revision_root(fs, rev, pool);
return SVN_NO_ERROR;
}
@@ -583,9 +579,8 @@ root_node(dag_node_t **node_p,
{
/* It's a revision root, so we already have its root directory
opened. */
- dag_node_t *root_dir = root->fsap_data;
- *node_p = svn_fs_x__dag_dup(root_dir, pool);
- return SVN_NO_ERROR;
+ return svn_fs_x__dag_revision_root(node_p, root->fs, root->rev,
+ pool);
}
}
@@ -1293,7 +1288,7 @@ x_node_id(const svn_fs_id_t **id_p,
const char *path,
apr_pool_t *pool)
{
- const svn_fs_x__id_t *noderev_id;
+ svn_fs_x__id_t noderev_id;
if ((! root->is_txn_root)
&& (path[0] == '\0' || ((path[0] == '/') && (path[1] == '\0'))))
@@ -1302,19 +1297,18 @@ x_node_id(const svn_fs_id_t **id_p,
The root directory ("" or "/") node is stored in the
svn_fs_root_t object, and never changes when it's a revision
root, so we can just reach in and grab it directly. */
- dag_node_t *root_dir = root->fsap_data;
- noderev_id = svn_fs_x__dag_get_id(root_dir);
+ svn_fs_x__init_rev_root(&noderev_id, root->rev);
}
else
{
dag_node_t *node;
SVN_ERR(get_dag(&node, root, path, pool));
- noderev_id = svn_fs_x__dag_get_id(node);
+ noderev_id = *svn_fs_x__dag_get_id(node);
}
*id_p = svn_fs_x__id_create(svn_fs_x__id_create_context(root->fs, pool),
- noderev_id, pool);
+ &noderev_id, pool);
return SVN_NO_ERROR;
}
@@ -4230,14 +4224,12 @@ make_root(svn_fs_t *fs,
static svn_fs_root_t *
make_revision_root(svn_fs_t *fs,
svn_revnum_t rev,
- dag_node_t *root_dir,
apr_pool_t *pool)
{
svn_fs_root_t *root = make_root(fs, pool);
root->is_txn_root = FALSE;
root->rev = rev;
- root->fsap_data = root_dir;
return root;
}
@@ -4429,7 +4421,6 @@ svn_error_t *
svn_fs_x__verify_root(svn_fs_root_t *root,
apr_pool_t *scratch_pool)
{
- svn_fs_t *fs = root->fs;
dag_node_t *root_dir;
apr_array_header_t *parent_nodes;
@@ -4443,17 +4434,7 @@ svn_fs_x__verify_root(svn_fs_root_t *roo
When this code is called in the library, we want to ensure we
use the on-disk data --- rather than some data that was read
in the possibly-distance past and cached since. */
-
- if (root->is_txn_root)
- {
- fs_txn_root_data_t *frd = root->fsap_data;
- SVN_ERR(svn_fs_x__dag_txn_root(&root_dir, fs, frd->txn_id,
- scratch_pool));
- }
- else
- {
- root_dir = root->fsap_data;
- }
+ SVN_ERR(root_node(&root_dir, root, scratch_pool));
/* Recursively verify ROOT_DIR. */
parent_nodes = apr_array_make(scratch_pool, 16, sizeof(dag_node_t *));