Author: stefan2
Date: Thu Feb 19 22:16:45 2015
New Revision: 1661013

URL: http://svn.apache.org/r1661013
Log:
On the fsx-1.10 branch:
Never reset the NODE_REVISION element in FSX DAG nodes.

Because DAG nodes are now always kept in sync with modifications on disk,
we never need to re-read the noderev struct and may access it directly.
That greatly simplifies all DAG accessor functions.

* subversion/libsvn_fs_x/dag.c
  (dag_node_t): Update docstring.
  (get_node_revision): No longer needed.
  (svn_fs_x__dag_get_node_id,
   svn_fs_x__dag_get_copy_id,
   svn_fs_x__dag_same_line_of_history,
   svn_fs_x__dag_get_predecessor_id,
   svn_fs_x__dag_get_predecessor_count,
   svn_fs_x__dag_get_mergeinfo_count,
   svn_fs_x__dag_has_mergeinfo,
   svn_fs_x__dag_has_descendants_with_mergeinfo,
   svn_fs_x__dir_entry_id,
   set_entry,
   make_entry
   svn_fs_x__dag_dir_entries,
   svn_fs_x__dag_get_proplist,
   svn_fs_x__dag_set_proplist,
   svn_fs_x__dag_increment_mergeinfo_count,
   svn_fs_x__dag_set_has_mergeinfo,
   svn_fs_x__dag_clone_child,
   svn_fs_x__dag_delete,
   svn_fs_x__dag_get_contents,
   svn_fs_x__dag_get_file_delta_stream,
   svn_fs_x__dag_try_process_file_contents,
   svn_fs_x__dag_file_length,
   svn_fs_x__dag_file_checksum,
   svn_fs_x__dag_get_edit_stream): Directly use the NODE_REVISION.
  (svn_fs_x__dag_dup): Always copy the NODE_REVISION.
  (svn_fs_x__dag_copy,
   svn_fs_x__dag_things_different,
   svn_fs_x__dag_get_copyroot,
   svn_fs_x__dag_get_copyfrom_rev,
   svn_fs_x__dag_get_copyfrom_path,
   svn_fs_x__dag_update_ancestry): Directly use the NODE_REVISION.

Modified:
    subversion/branches/fsx-1.10/subversion/libsvn_fs_x/dag.c

Modified: subversion/branches/fsx-1.10/subversion/libsvn_fs_x/dag.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/fsx-1.10/subversion/libsvn_fs_x/dag.c?rev=1661013&r1=1661012&r2=1661013&view=diff
==============================================================================
--- subversion/branches/fsx-1.10/subversion/libsvn_fs_x/dag.c (original)
+++ subversion/branches/fsx-1.10/subversion/libsvn_fs_x/dag.c Thu Feb 19 
22:16:45 2015
@@ -64,13 +64,7 @@ struct dag_node_t
   /* The node's type (file, dir, etc.) */
   svn_node_kind_t kind;
 
-  /* The node's NODE-REVISION, or NULL if we haven't read it in yet.
-     This is allocated in this node's POOL.
-
-     If you're willing to respect all the rules above, you can munge
-     this yourself, but you're probably better off just calling
-     `get_node_revision' and `set_node_revision', which take care of
-     things for you.  */
+  /* The node's NODE-REVISION. */
   svn_fs_x__noderev_t *node_revision;
 
   /* The pool to allocate NODE_REVISION in. */
@@ -145,48 +139,13 @@ copy_node_revision(svn_fs_x__noderev_t *
 }
 
 
-/* Set *NODEREV_P to the cached node-revision for NODE.
-   If the node-revision was not already cached in NODE, read it in,
-   allocating the cache in NODE->NODE_POOL.
-
-   If you plan to change the contents of NODE, be careful!  We're
-   handing you a pointer directly to our cached node-revision, not
-   your own copy.  If you change it as part of some operation, but
-   then some Berkeley DB function deadlocks or gets an error, you'll
-   need to back out your changes, or else the cache will reflect
-   changes that never got committed.  It's probably best not to change
-   the structure at all.  */
-static svn_error_t *
-get_node_revision(svn_fs_x__noderev_t **noderev_p,
-                  dag_node_t *node)
-{
-  /* If we've already got a copy, there's no need to read it in.  */
-  if (! node->node_revision)
-    {
-      svn_fs_x__noderev_t *noderev;
-      apr_pool_t *scratch_pool = svn_pool_create(node->node_pool);
-
-      SVN_ERR(svn_fs_x__get_node_revision(&noderev, node->fs, &node->id,
-                                          node->node_pool, scratch_pool));
-      node->node_revision = noderev;
-      svn_pool_destroy(scratch_pool);
-    }
-
-  /* Now NODE->node_revision is set.  */
-  *noderev_p = node->node_revision;
-  return SVN_NO_ERROR;
-}
-
 /* Return the node revision ID of NODE.  The value returned is shared
    with NODE, and will be deallocated when NODE is.  */
 svn_error_t *
 svn_fs_x__dag_get_node_id(svn_fs_x__id_t *node_id,
                           dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-  SVN_ERR(get_node_revision(&noderev, node));
-
-  *node_id = noderev->node_id;
+  *node_id = node->node_revision->node_id;
   return SVN_NO_ERROR;
 }
 
@@ -196,10 +155,7 @@ svn_error_t *
 svn_fs_x__dag_get_copy_id(svn_fs_x__id_t *copy_id,
                           dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-  SVN_ERR(get_node_revision(&noderev, node));
-
-  *copy_id = noderev->copy_id;
+  *copy_id = node->node_revision->copy_id;
   return SVN_NO_ERROR;
 }
 
@@ -224,10 +180,8 @@ svn_fs_x__dag_same_line_of_history(svn_b
                                    dag_node_t *lhs,
                                    dag_node_t *rhs)
 {
-  svn_fs_x__noderev_t *lhs_noderev, *rhs_noderev;
-
-  SVN_ERR(get_node_revision(&lhs_noderev, lhs));
-  SVN_ERR(get_node_revision(&rhs_noderev, rhs));
+  svn_fs_x__noderev_t *lhs_noderev = lhs->node_revision;
+  svn_fs_x__noderev_t *rhs_noderev = rhs->node_revision;
 
   *same = svn_fs_x__id_eq(&lhs_noderev->node_id, &rhs_noderev->node_id)
        && svn_fs_x__id_eq(&lhs_noderev->copy_id, &rhs_noderev->copy_id);
@@ -299,10 +253,7 @@ svn_error_t *
 svn_fs_x__dag_get_predecessor_id(svn_fs_x__id_t *id_p,
                                  dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  SVN_ERR(get_node_revision(&noderev, node));
-  *id_p = noderev->predecessor_id;
+  *id_p = node->node_revision->predecessor_id;
 
   return SVN_NO_ERROR;
 }
@@ -312,10 +263,7 @@ svn_error_t *
 svn_fs_x__dag_get_predecessor_count(int *count,
                                     dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  SVN_ERR(get_node_revision(&noderev, node));
-  *count = noderev->predecessor_count;
+  *count = node->node_revision->predecessor_count;
   return SVN_NO_ERROR;
 }
 
@@ -323,10 +271,7 @@ svn_error_t *
 svn_fs_x__dag_get_mergeinfo_count(apr_int64_t *count,
                                   dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  SVN_ERR(get_node_revision(&noderev, node));
-  *count = noderev->mergeinfo_count;
+  *count = node->node_revision->mergeinfo_count;
   return SVN_NO_ERROR;
 }
 
@@ -334,10 +279,7 @@ svn_error_t *
 svn_fs_x__dag_has_mergeinfo(svn_boolean_t *has_mergeinfo,
                             dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  SVN_ERR(get_node_revision(&noderev, node));
-  *has_mergeinfo = noderev->has_mergeinfo;
+  *has_mergeinfo = node->node_revision->has_mergeinfo;
   return SVN_NO_ERROR;
 }
 
@@ -345,7 +287,7 @@ svn_error_t *
 svn_fs_x__dag_has_descendants_with_mergeinfo(svn_boolean_t *do_they,
                                              dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
+  svn_fs_x__noderev_t *noderev = node->node_revision;
 
   if (node->kind != svn_node_dir)
     {
@@ -353,7 +295,6 @@ svn_fs_x__dag_has_descendants_with_merge
       return SVN_NO_ERROR;
     }
 
-  SVN_ERR(get_node_revision(&noderev, node));
   if (noderev->mergeinfo_count > 1)
     *do_they = TRUE;
   else if (noderev->mergeinfo_count == 1 && !noderev->has_mergeinfo)
@@ -377,9 +318,8 @@ svn_fs_x__dir_entry_id(svn_fs_x__id_t *i
                        apr_pool_t *scratch_pool)
 {
   svn_fs_x__dirent_t *dirent;
-  svn_fs_x__noderev_t *noderev;
+  svn_fs_x__noderev_t *noderev = parent->node_revision;
 
-  SVN_ERR(get_node_revision(&noderev, parent));
   if (noderev->kind != svn_node_dir)
     return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
                             _("Can't get entries of non-directory"));
@@ -419,10 +359,7 @@ set_entry(dag_node_t *parent,
           svn_fs_x__txn_id_t txn_id,
           apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *parent_noderev;
-
-  /* Get the parent's node-revision. */
-  SVN_ERR(get_node_revision(&parent_noderev, parent));
+  svn_fs_x__noderev_t *parent_noderev = parent->node_revision;
 
   /* Set the new entry. */
   SVN_ERR(svn_fs_x__set_entry(parent->fs, txn_id, parent_noderev, name, id,
@@ -478,7 +415,7 @@ make_entry(dag_node_t **child_p,
   new_noderev.kind = is_dir ? svn_node_dir : svn_node_file;
   new_noderev.created_path = svn_fspath__join(parent_path, name, result_pool);
 
-  SVN_ERR(get_node_revision(&parent_noderev, parent));
+  parent_noderev = parent->node_revision;
   new_noderev.copyroot_path = apr_pstrdup(result_pool,
                                           parent_noderev->copyroot_path);
   new_noderev.copyroot_rev = parent_noderev->copyroot_rev;
@@ -509,9 +446,7 @@ svn_fs_x__dag_dir_entries(apr_array_head
                           apr_pool_t *result_pool,
                           apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  SVN_ERR(get_node_revision(&noderev, node));
+  svn_fs_x__noderev_t *noderev = node->node_revision;
 
   if (noderev->kind != svn_node_dir)
     return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, NULL,
@@ -555,16 +490,8 @@ svn_fs_x__dag_get_proplist(apr_hash_t **
                            apr_pool_t *result_pool,
                            apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *noderev;
-  apr_hash_t *proplist = NULL;
-
-  SVN_ERR(get_node_revision(&noderev, node));
-
-  SVN_ERR(svn_fs_x__get_proplist(&proplist, node->fs, noderev, result_pool,
-                                 scratch_pool));
-
-  *proplist_p = proplist;
-
+  SVN_ERR(svn_fs_x__get_proplist(proplist_p, node->fs, node->node_revision,
+                                 result_pool, scratch_pool));
   return SVN_NO_ERROR;
 }
 
@@ -574,8 +501,6 @@ svn_fs_x__dag_set_proplist(dag_node_t *n
                            apr_hash_t *proplist,
                            apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *noderev;
-
   /* Sanity check: this node better be mutable! */
   if (! svn_fs_x__dag_check_mutable(node))
     {
@@ -586,11 +511,9 @@ svn_fs_x__dag_set_proplist(dag_node_t *n
          idstr->data);
     }
 
-  /* Go get a fresh NODE-REVISION for this node. */
-  SVN_ERR(get_node_revision(&noderev, node));
-
   /* Set the new proplist. */
-  SVN_ERR(svn_fs_x__set_proplist(node->fs, noderev, proplist, scratch_pool));
+  SVN_ERR(svn_fs_x__set_proplist(node->fs, node->node_revision, proplist,
+                                 scratch_pool));
 
   update_revision(node);
   svn_fs_x__update_dag_cache(node);
@@ -616,7 +539,7 @@ svn_fs_x__dag_increment_mergeinfo_count(
                                         apr_int64_t increment,
                                         apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *noderev;
+  svn_fs_x__noderev_t *noderev = node->node_revision;
 
   /* Sanity check: this node better be mutable! */
   if (! svn_fs_x__dag_check_mutable(node))
@@ -631,9 +554,6 @@ svn_fs_x__dag_increment_mergeinfo_count(
   if (increment == 0)
     return SVN_NO_ERROR;
 
-  /* Go get a fresh NODE-REVISION for this node. */
-  SVN_ERR(get_node_revision(&noderev, node));
-
   noderev->mergeinfo_count += increment;
   if (noderev->mergeinfo_count < 0)
     {
@@ -667,8 +587,6 @@ svn_fs_x__dag_set_has_mergeinfo(dag_node
                                 svn_boolean_t has_mergeinfo,
                                 apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *noderev;
-
   /* Sanity check: this node better be mutable! */
   if (! svn_fs_x__dag_check_mutable(node))
     {
@@ -679,10 +597,7 @@ svn_fs_x__dag_set_has_mergeinfo(dag_node
          idstr->data);
     }
 
-  /* Go get a fresh NODE-REVISION for this node. */
-  SVN_ERR(get_node_revision(&noderev, node));
-
-  noderev->has_mergeinfo = has_mergeinfo;
+  node->node_revision->has_mergeinfo = has_mergeinfo;
 
   /* Flush it out. */
   return noderev_changed(node, scratch_pool);
@@ -765,14 +680,11 @@ svn_fs_x__dag_clone_child(dag_node_t **c
     }
   else
     {
-      svn_fs_x__noderev_t *noderev, *parent_noderev;
-
-      /* Go get a fresh NODE-REVISION for current child node. */
-      SVN_ERR(get_node_revision(&noderev, cur_entry));
+      svn_fs_x__noderev_t *noderev = cur_entry->node_revision;
 
       if (is_parent_copyroot)
         {
-          SVN_ERR(get_node_revision(&parent_noderev, parent));
+          svn_fs_x__noderev_t *parent_noderev = parent->node_revision;
           noderev->copyroot_rev = parent_noderev->copyroot_rev;
           noderev->copyroot_path = apr_pstrdup(scratch_pool,
                                                parent_noderev->copyroot_path);
@@ -860,7 +772,7 @@ svn_fs_x__dag_delete(dag_node_t *parent,
                      svn_fs_x__txn_id_t txn_id,
                      apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *parent_noderev;
+  svn_fs_x__noderev_t *parent_noderev = parent->node_revision;
   svn_fs_t *fs = parent->fs;
   svn_fs_x__dirent_t *dirent;
   apr_pool_t *subpool;
@@ -883,9 +795,6 @@ svn_fs_x__dag_delete(dag_node_t *parent,
       (SVN_ERR_FS_NOT_SINGLE_PATH_COMPONENT, NULL,
        "Attempted to delete a node with an illegal name '%s'", name);
 
-  /* Get a fresh NODE-REVISION for the parent node. */
-  SVN_ERR(get_node_revision(&parent_noderev, parent));
-
   /* We allocate a few potentially heavy temporary objects (file buffers
      and directories).  Make sure we don't keep them around for longer
      than necessary. */
@@ -950,23 +859,16 @@ svn_fs_x__dag_get_contents(svn_stream_t
                            dag_node_t *file,
                            apr_pool_t *result_pool)
 {
-  svn_fs_x__noderev_t *noderev;
-  svn_stream_t *contents;
-
   /* Make sure our node is a file. */
   if (file->kind != svn_node_file)
     return svn_error_createf
       (SVN_ERR_FS_NOT_FILE, NULL,
        "Attempted to get textual contents of a *non*-file node");
 
-  /* Go get a fresh node-revision for FILE. */
-  SVN_ERR(get_node_revision(&noderev, file));
-
   /* Get a stream to the contents. */
-  SVN_ERR(svn_fs_x__get_contents(&contents, file->fs,
-                                 noderev->data_rep, TRUE, result_pool));
-
-  *contents_p = contents;
+  SVN_ERR(svn_fs_x__get_contents(contents_p, file->fs,
+                                 file->node_revision->data_rep, TRUE,
+                                 result_pool));
 
   return SVN_NO_ERROR;
 }
@@ -979,8 +881,8 @@ svn_fs_x__dag_get_file_delta_stream(svn_
                                     apr_pool_t *result_pool,
                                     apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *src_noderev;
-  svn_fs_x__noderev_t *tgt_noderev;
+  svn_fs_x__noderev_t *src_noderev = source ? source->node_revision : NULL;
+  svn_fs_x__noderev_t *tgt_noderev = target->node_revision;
 
   /* Make sure our nodes are files. */
   if ((source && source->kind != svn_node_file)
@@ -989,13 +891,6 @@ svn_fs_x__dag_get_file_delta_stream(svn_
       (SVN_ERR_FS_NOT_FILE, NULL,
        "Attempted to get textual contents of a *non*-file node");
 
-  /* Go get fresh node-revisions for the nodes. */
-  if (source)
-    SVN_ERR(get_node_revision(&src_noderev, source));
-  else
-    src_noderev = NULL;
-  SVN_ERR(get_node_revision(&tgt_noderev, target));
-
   /* Get the delta stream. */
   return svn_fs_x__get_file_delta_stream(stream_p, target->fs,
                                          src_noderev, tgt_noderev,
@@ -1010,13 +905,8 @@ svn_fs_x__dag_try_process_file_contents(
                                         void* baton,
                                         apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  /* Go get fresh node-revisions for the nodes. */
-  SVN_ERR(get_node_revision(&noderev, node));
-
   return svn_fs_x__try_process_file_contents(success, node->fs,
-                                             noderev,
+                                             node->node_revision,
                                              processor, baton, scratch_pool);
 }
 
@@ -1025,18 +915,13 @@ svn_error_t *
 svn_fs_x__dag_file_length(svn_filesize_t *length,
                           dag_node_t *file)
 {
-  svn_fs_x__noderev_t *noderev;
-
   /* Make sure our node is a file. */
   if (file->kind != svn_node_file)
     return svn_error_createf
       (SVN_ERR_FS_NOT_FILE, NULL,
        "Attempted to get length of a *non*-file node");
 
-  /* Go get a fresh node-revision for FILE, and . */
-  SVN_ERR(get_node_revision(&noderev, file));
-
-  return svn_fs_x__file_length(length, noderev);
+  return svn_fs_x__file_length(length, file->node_revision);
 }
 
 
@@ -1046,16 +931,13 @@ svn_fs_x__dag_file_checksum(svn_checksum
                             svn_checksum_kind_t kind,
                             apr_pool_t *result_pool)
 {
-  svn_fs_x__noderev_t *noderev;
-
   if (file->kind != svn_node_file)
     return svn_error_createf
       (SVN_ERR_FS_NOT_FILE, NULL,
        "Attempted to get checksum of a *non*-file node");
 
-  SVN_ERR(get_node_revision(&noderev, file));
-
-  return svn_fs_x__file_checksum(checksum, noderev, kind, result_pool);
+  return svn_fs_x__file_checksum(checksum, file->node_revision, kind,
+                                 result_pool);
 }
 
 
@@ -1064,9 +946,6 @@ svn_fs_x__dag_get_edit_stream(svn_stream
                               dag_node_t *file,
                               apr_pool_t *result_pool)
 {
-  svn_fs_x__noderev_t *noderev;
-  svn_stream_t *ws;
-
   /* Make sure our node is a file. */
   if (file->kind != svn_node_file)
     return svn_error_createf
@@ -1079,13 +958,8 @@ svn_fs_x__dag_get_edit_stream(svn_stream
       (SVN_ERR_FS_NOT_MUTABLE, NULL,
        "Attempted to set textual contents of an immutable node");
 
-  /* Get the node revision. */
-  SVN_ERR(get_node_revision(&noderev, file));
-
-  SVN_ERR(svn_fs_x__set_contents(&ws, file->fs, noderev, result_pool));
-
-  *contents = ws;
-
+  SVN_ERR(svn_fs_x__set_contents(contents, file->fs, file->node_revision,
+                                 result_pool));
   return SVN_NO_ERROR;
 }
 
@@ -1121,19 +995,10 @@ svn_fs_x__dag_dup(const dag_node_t *node
   /* Allocate our new node. */
   dag_node_t *new_node = apr_pmemdup(result_pool, node, sizeof(*new_node));
 
-  /* Only copy cached svn_fs_x__noderev_t for immutable nodes. */
-  if (node->node_revision && !svn_fs_x__dag_check_mutable(node))
-    {
-      new_node->node_revision = copy_node_revision(node->node_revision,
-                                                   result_pool);
-      new_node->created_path = new_node->node_revision->created_path;
-    }
-  else
-    {
-      new_node->node_revision = NULL;
-      new_node->created_path = apr_pstrdup(result_pool, node->created_path);
-    }
-
+  /* Copy sub-structures. */
+  new_node->node_revision = copy_node_revision(node->node_revision,
+                                               result_pool);
+  new_node->created_path = new_node->node_revision->created_path;
   new_node->node_pool = result_pool;
 
   return new_node;
@@ -1185,13 +1050,12 @@ svn_fs_x__dag_copy(dag_node_t *to_node,
 
   if (preserve_history)
     {
-      svn_fs_x__noderev_t *from_noderev, *to_noderev;
+      svn_fs_x__noderev_t *to_noderev;
       svn_fs_x__id_t copy_id;
       svn_fs_t *fs = svn_fs_x__dag_get_fs(from_node);
 
       /* Make a copy of the original node revision. */
-      SVN_ERR(get_node_revision(&from_noderev, from_node));
-      to_noderev = copy_node_revision(from_noderev, scratch_pool);
+      to_noderev = copy_node_revision(from_node->node_revision, scratch_pool);
 
       /* Reserve a copy ID for this new copy. */
       SVN_ERR(svn_fs_x__reserve_copy_id(&copy_id, fs, txn_id, scratch_pool));
@@ -1235,7 +1099,8 @@ svn_fs_x__dag_things_different(svn_boole
                                svn_boolean_t strict,
                                apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *noderev1, *noderev2;
+  svn_fs_x__noderev_t *noderev1 = node1->node_revision;
+  svn_fs_x__noderev_t *noderev2 = node2->node_revision;
   svn_fs_t *fs;
   svn_boolean_t same;
 
@@ -1246,10 +1111,6 @@ svn_fs_x__dag_things_different(svn_boole
 
   fs = svn_fs_x__dag_get_fs(node1);
 
-  /* The node revision skels for these two nodes. */
-  SVN_ERR(get_node_revision(&noderev1, node1));
-  SVN_ERR(get_node_revision(&noderev2, node2));
-
   /* Compare property keys. */
   if (props_changed != NULL)
     {
@@ -1271,13 +1132,8 @@ svn_fs_x__dag_get_copyroot(svn_revnum_t
                            const char **path,
                            dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  /* Go get a fresh node-revision for NODE. */
-  SVN_ERR(get_node_revision(&noderev, node));
-
-  *rev = noderev->copyroot_rev;
-  *path = noderev->copyroot_path;
+  *rev = node->node_revision->copyroot_rev;
+  *path = node->node_revision->copyroot_path;
 
   return SVN_NO_ERROR;
 }
@@ -1286,13 +1142,7 @@ svn_error_t *
 svn_fs_x__dag_get_copyfrom_rev(svn_revnum_t *rev,
                                dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  /* Go get a fresh node-revision for NODE. */
-  SVN_ERR(get_node_revision(&noderev, node));
-
-  *rev = noderev->copyfrom_rev;
-
+  *rev = node->node_revision->copyfrom_rev;
   return SVN_NO_ERROR;
 }
 
@@ -1300,13 +1150,7 @@ svn_error_t *
 svn_fs_x__dag_get_copyfrom_path(const char **path,
                                 dag_node_t *node)
 {
-  svn_fs_x__noderev_t *noderev;
-
-  /* Go get a fresh node-revision for NODE. */
-  SVN_ERR(get_node_revision(&noderev, node));
-
-  *path = noderev->copyfrom_path;
-
+  *path = node->node_revision->copyfrom_path;
   return SVN_NO_ERROR;
 }
 
@@ -1315,16 +1159,14 @@ svn_fs_x__dag_update_ancestry(dag_node_t
                               dag_node_t *source,
                               apr_pool_t *scratch_pool)
 {
-  svn_fs_x__noderev_t *source_noderev, *target_noderev;
+  svn_fs_x__noderev_t *source_noderev = source->node_revision;
+  svn_fs_x__noderev_t *target_noderev = target->node_revision;
 
   if (! svn_fs_x__dag_check_mutable(target))
     return svn_error_createf
       (SVN_ERR_FS_NOT_MUTABLE, NULL,
        _("Attempted to update ancestry of non-mutable node"));
 
-  SVN_ERR(get_node_revision(&source_noderev, source));
-  SVN_ERR(get_node_revision(&target_noderev, target));
-
   target_noderev->predecessor_id = source_noderev->noderev_id;
   target_noderev->predecessor_count = source_noderev->predecessor_count;
   target_noderev->predecessor_count++;


Reply via email to