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 2016/01/30 16:05:18 UTC

svn commit: r1727709 - /subversion/trunk/subversion/libsvn_fs_x/tree.c

Author: stefan2
Date: Sat Jan 30 15:05:18 2016
New Revision: 1727709

URL: http://svn.apache.org/viewvc?rev=1727709&view=rev
Log:
In FSX, begin getting rid of the redundant noderev IDs within changed
paths lists.

This change dynamically determines the ID for the changed_paths API
implementation, effectively rendering the stored IDs unnecessary.

* subversion/libsvn_fs_x/tree.c
  (construct_fs_id): New function to construct the ID object dynamically.
  (construct_fs_path_change): Update to call the new utility instead of
                              using the info provided in CHANGE.  Add a
                              few pass-through parameters.
  (x_paths_changed): Update the next level caller.

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=1727709&r1=1727708&r2=1727709&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/trunk/subversion/libsvn_fs_x/tree.c Sat Jan 30 15:05:18 2016
@@ -2244,19 +2244,77 @@ x_get_file_delta_stream(svn_txdelta_stre
 
 /* Finding Changes */
 
-/* Copy CHANGE into a FS API object allocated in RESULT_POOL and return
-   it in *RESULT_P.  Pass CONTEXT to the ID API object being created. */
+/* Construct a new FS API ID object for CHANGE in ROOT using CONTEXT.
+   Allocate the result in RESULT_POOL and use SCRATCH_POOL for temporaries.
+ */
+static svn_error_t *
+construct_fs_id(const svn_fs_id_t **id,
+                svn_fs_root_t *root,
+                svn_fs_x__id_context_t *context,
+                svn_fs_x__change_t *change,
+                apr_pool_t *result_pool,
+                apr_pool_t *scratch_pool)
+{
+  dag_node_t *node;
+  if (change->change_kind == svn_fs_path_change_delete)
+    {
+      /* CHANGE->PATH got deleted.  Its ID is the one it had previously,
+       * i.e. the ID of the same relative child within the parent's
+       * predecessor. */
+      const char *parent_path;
+      const char *basename;
+      const svn_fs_x__id_t *parent_predecessor_id;
+      dag_node_t *parent_predecessor;
+
+      SVN_ERR_ASSERT(!svn_fspath__is_root(change->path.data,
+                                          change->path.len));
+      parent_path = svn_fspath__dirname(change->path.data, scratch_pool);
+      basename = svn_fspath__basename(change->path.data, scratch_pool);
+
+      /* Get the predecessor of CHANGE->PATH's parent. */
+      SVN_ERR(svn_fs_x__get_temp_dag_node(&node, root, parent_path,
+                                          scratch_pool));
+      parent_predecessor_id = svn_fs_x__dag_get_predecessor_id(node);
+      SVN_ERR(svn_fs_x__dag_get_node(&parent_predecessor, root->fs,
+                                     parent_predecessor_id,
+                                     scratch_pool, scratch_pool));
+
+      /* Get the node's predecessor. */
+      SVN_ERR(svn_fs_x__dag_open(&node, parent_predecessor, basename,
+                                 scratch_pool, scratch_pool));
+      SVN_ERR_ASSERT(node);
+    }
+  else
+    {
+      SVN_ERR(svn_fs_x__get_temp_dag_node(&node, root, change->path.data,
+                                          scratch_pool));
+    }
+ 
+  *id = svn_fs_x__id_create(context, svn_fs_x__dag_get_id(node),
+                            result_pool);
+
+  return SVN_NO_ERROR;
+}
+
+/* Copy CHANGE within ROOT into a FS API object allocated in RESULT_POOL
+   and return it in *RESULT_P.  Pass CONTEXT to the ID API object being
+   created and use SCRATCH_POOL for temporary allocations. */
 static svn_error_t *
 construct_fs_path_change(svn_fs_path_change2_t **result_p,
+                         svn_fs_root_t *root,
                          svn_fs_x__id_context_t *context,
                          svn_fs_x__change_t *change,
-                         apr_pool_t *result_pool)
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool)
 {
-  const svn_fs_id_t *id
-    = svn_fs_x__id_create(context, &change->noderev_id, result_pool);
-  svn_fs_path_change2_t *result
-    = svn_fs__path_change_create_internal(id, change->change_kind,
-                                          result_pool);
+  const svn_fs_id_t *id;
+  svn_fs_path_change2_t *result;
+ 
+  SVN_ERR(construct_fs_id(&id, root, context, change, result_pool,
+                          scratch_pool));
+
+  result = svn_fs__path_change_create_internal(id, change->change_kind,
+                                               result_pool);
 
   result->text_mod = change->text_mod;
   result->prop_mod = change->prop_mod;
@@ -2286,6 +2344,7 @@ x_paths_changed(apr_hash_t **changed_pat
   svn_fs_path_change2_t *path_change;
   svn_fs_x__id_context_t *context
     = svn_fs_x__id_create_context(root->fs, pool);
+  apr_pool_t *iterpool = svn_pool_create(pool);
 
   if (root->is_txn_root)
     {
@@ -2298,8 +2357,10 @@ x_paths_changed(apr_hash_t **changed_pat
            hi = apr_hash_next(hi))
         {
           svn_fs_x__change_t *change = apr_hash_this_val(hi);
-          SVN_ERR(construct_fs_path_change(&path_change, context, change,
-                                           pool));
+
+          svn_pool_clear(iterpool);
+          SVN_ERR(construct_fs_path_change(&path_change, root, context,
+                                           change, pool, iterpool));
           apr_hash_set(changed_paths,
                        apr_hash_this_key(hi), apr_hash_this_key_len(hi),
                        path_change);
@@ -2317,13 +2378,16 @@ x_paths_changed(apr_hash_t **changed_pat
         {
           svn_fs_x__change_t *change = APR_ARRAY_IDX(changes, i,
                                                      svn_fs_x__change_t *);
-          SVN_ERR(construct_fs_path_change(&path_change, context, change,
-                                           pool));
+
+          svn_pool_clear(iterpool);
+          SVN_ERR(construct_fs_path_change(&path_change, root, context,
+                                           change, pool, iterpool));
           apr_hash_set(changed_paths, change->path.data, change->path.len,
                        path_change);
         }
     }
 
+   svn_pool_destroy(iterpool);
   *changed_paths_p = changed_paths;
 
   return SVN_NO_ERROR;