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 2014/12/21 09:52:08 UTC

svn commit: r1647111 - in /subversion/branches/fsx-id/subversion/libsvn_fs_x: dag.c dag.h fs.h low_level.c noderevs.c temp_serializer.c transaction.c tree.c

Author: stefan2
Date: Sun Dec 21 08:52:07 2014
New Revision: 1647111

URL: http://svn.apache.org/r1647111
Log:
On the fsx-id branch:  In our noderev struct, use our internal ID part type
instead of the FS API ID to represent predecessor IDs.  Construct the FS API
level object on demand.

* subversion/libsvn_fs_x/fs.h
  (node_revision_t): Predecessor-ID has now the same type as the noderev-ID.

* subversion/libsvn_fs_x/low_level.c
  (svn_fs_x__read_noderev,
   svn_fs_x__write_noderev): Update parser / writer.  Take into account that
                             "unused" predecessor IDs are no longer simply
                             indicated by a NULL pointer.

* subversion/libsvn_fs_x/temp_serializer.c
  (svn_fs_x__noderev_serialize,
   svn_fs_x__noderev_deserialize): One sub-structure less to (de-)serialize.

* subversion/libsvn_fs_x/noderevs.c
  (svn_fs_x__noderevs_add,
   svn_fs_x__noderevs_get,
   svn_fs_x__noderevs_get_func): Predecessor IDs can now be read / set like
                                 any other ID part.  No temporaries needed.

* subversion/libsvn_fs_x/transaction.c
  (create_new_txn_noderev_from_rev): Update assignment.
  (svn_fs_x__get_txn): Construct the base ID on demand.
  (shards_spanned,
   choose_delta_base): Contents of the predecessor ID is now directly
                       accessible.

* subversion/libsvn_fs_x/dag.h
  (svn_fs_x__dag_get_predecessor_id): Since we will now construct the ID
                                      here, we need a result pool.

* subversion/libsvn_fs_x/dag.c
  (copy_node_revision): One sub-struct less to copy.
  (svn_fs_x__dag_get_node): Matching types simplifies assigment.
  (svn_fs_x__dag_get_predecessor_id): Construct the FS API level ID here.
  (make_entry): The NULL value is no longer the default for predecessor IDs.
                ID parts must be reset manually.
  (svn_fs_x__dag_clone_child,
   svn_fs_x__dag_copy,
   svn_fs_x__dag_update_ancestry): Update assignments.

* subversion/libsvn_fs_x/tree.c
  (x_closest_copy,
   history_prev,
   verify_node,
   svn_fs_x__verify_root): Update svn_fs_x__dag_get_predecessor_id callers.

Modified:
    subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h
    subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h
    subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c Sun Dec 21 08:52:07 2014
@@ -122,8 +122,6 @@ copy_node_revision(node_revision_t *node
   node_revision_t *nr = apr_pmemdup(pool, noderev, sizeof(*noderev));
   nr->id = svn_fs_x__id_copy(noderev->id, pool);
 
-  if (noderev->predecessor_id)
-    nr->predecessor_id = svn_fs_x__id_copy(noderev->predecessor_id, pool);
   if (noderev->copyfrom_path)
     nr->copyfrom_path = apr_pstrdup(pool, noderev->copyfrom_path);
 
@@ -269,8 +267,7 @@ svn_fs_x__dag_get_node(dag_node_t **node
   new_node->created_path = apr_pstrdup(pool, noderev->created_path);
 
   if (noderev->is_fresh_txn_root)
-    new_node->fresh_root_predecessor_id
-      = *svn_fs_x__id_noderev_id(noderev->predecessor_id);
+    new_node->fresh_root_predecessor_id = noderev->predecessor_id;
   else
     svn_fs_x__id_part_reset(&new_node->fresh_root_predecessor_id);
 
@@ -298,12 +295,15 @@ svn_fs_x__dag_get_revision(const dag_nod
 
 svn_error_t *
 svn_fs_x__dag_get_predecessor_id(const svn_fs_id_t **id_p,
-                                 dag_node_t *node)
+                                 dag_node_t *node,
+                                 apr_pool_t *result_pool)
 {
   node_revision_t *noderev;
 
   SVN_ERR(get_node_revision(&noderev, node));
-  *id_p = noderev->predecessor_id;
+  *id_p = svn_fs_x__id_create(&noderev->node_id, &noderev->predecessor_id,
+                              result_pool);
+
   return SVN_NO_ERROR;
 }
 
@@ -463,6 +463,7 @@ make_entry(dag_node_t **child_p,
   new_noderev.copyroot_rev = parent_noderev->copyroot_rev;
   new_noderev.copyfrom_rev = SVN_INVALID_REVNUM;
   new_noderev.copyfrom_path = NULL;
+  svn_fs_x__id_part_reset(&new_noderev.predecessor_id);
 
   SVN_ERR(svn_fs_x__create_node
           (&new_node_id, svn_fs_x__dag_get_fs(parent), &new_noderev,
@@ -778,8 +779,7 @@ svn_fs_x__dag_clone_child(dag_node_t **c
       noderev->copyfrom_path = NULL;
       noderev->copyfrom_rev = SVN_INVALID_REVNUM;
 
-      SVN_ERR(svn_fs_x__dag_get_fs_id(&noderev->predecessor_id, cur_entry,
-                                      pool));
+      noderev->predecessor_id = noderev->noderev_id;
       if (noderev->predecessor_count != -1)
         noderev->predecessor_count++;
       noderev->created_path = svn_fspath__join(parent_path, name, pool);
@@ -1275,7 +1275,7 @@ svn_fs_x__dag_copy(dag_node_t *to_node,
 
       /* Create a successor with its predecessor pointing at the copy
          source. */
-      to_noderev->predecessor_id = to_noderev->id;
+      to_noderev->predecessor_id = to_noderev->noderev_id;
       to_noderev->id = NULL;
       if (to_noderev->predecessor_count != -1)
         to_noderev->predecessor_count++;
@@ -1404,7 +1404,7 @@ svn_fs_x__dag_update_ancestry(dag_node_t
   SVN_ERR(get_node_revision(&source_noderev, source));
   SVN_ERR(get_node_revision(&target_noderev, target));
 
-  target_noderev->predecessor_id = source_noderev->id;
+  target_noderev->predecessor_id = source_noderev->noderev_id;
   target_noderev->predecessor_count = source_noderev->predecessor_count;
   if (target_noderev->predecessor_count != -1)
     target_noderev->predecessor_count++;

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h Sun Dec 21 08:52:07 2014
@@ -152,10 +152,11 @@ const char *svn_fs_x__dag_get_created_pa
 
 
 /* Set *ID_P to the node revision ID of NODE's immediate predecessor,
-   or NULL if NODE has no predecessor.
+   or NULL if NODE has no predecessor.  Allocate the ID in RESULT_POOL.
  */
 svn_error_t *svn_fs_x__dag_get_predecessor_id(const svn_fs_id_t **id_p,
-                                              dag_node_t *node);
+                                              dag_node_t *node,
+                                              apr_pool_t *result_pool);
 
 
 /* Set *COUNT to the number of predecessors NODE has (recursively), or

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h Sun Dec 21 08:52:07 2014
@@ -489,9 +489,9 @@ typedef struct node_revision_t
   /* The node-id for this node-rev. */
   const svn_fs_id_t *id;
 
-  /* predecessor node revision id, or NULL if there is no predecessor
-     for this node revision */
-  const svn_fs_id_t *predecessor_id;
+  /* Predecessor node revision id.  Will be "unused" if there is no
+     predecessor for this node revision. */
+  svn_fs_x__id_part_t predecessor_id;
 
   /* The ID of this noderev */
   svn_fs_x__noderev_id_t noderev_id;

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c Sun Dec 21 08:52:07 2014
@@ -512,8 +512,9 @@ svn_fs_x__read_noderev(node_revision_t *
   /* Get the predecessor ID. */
   value = svn_hash_gets(headers, HEADER_PRED);
   if (value)
-    SVN_ERR(svn_fs_x__id_parse(&noderev->predecessor_id, value,
-                               result_pool));
+    SVN_ERR(svn_fs_x__id_part_parse(&noderev->predecessor_id, value));
+  else
+    svn_fs_x__id_part_reset(&noderev->predecessor_id);
 
   /* Get the copyroot. */
   value = svn_hash_gets(headers, HEADER_COPYROOT);
@@ -646,10 +647,10 @@ svn_fs_x__write_noderev(svn_stream_t *ou
                             (noderev->kind == svn_node_file) ?
                             SVN_FS_X__KIND_FILE : SVN_FS_X__KIND_DIR));
 
-  if (noderev->predecessor_id)
+  if (svn_fs_x__id_part_used(&noderev->predecessor_id))
     SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PRED ": %s\n",
-                              svn_fs_x__id_unparse(noderev->predecessor_id,
-                                                   scratch_pool)->data));
+                          svn_fs_x__id_part_unparse(&noderev->predecessor_id,
+                                                    scratch_pool)->data));
 
   SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COUNT ": %d\n",
                             noderev->predecessor_count));

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c Sun Dec 21 08:52:07 2014
@@ -266,21 +266,8 @@ svn_fs_x__noderevs_add(svn_fs_x__noderev
     = store_id(container->ids, container->ids_dict, &noderev->node_id);
   binary_noderev.copy_id
     = store_id(container->ids, container->ids_dict, &noderev->copy_id);
-
-  if (noderev->predecessor_id)
-    {
-      binary_noderev.predecessor_id
-        = store_id(container->ids, container->ids_dict,
-                  svn_fs_x__id_noderev_id(noderev->predecessor_id));
-    }
-  else
-    {
-      svn_fs_x__id_part_t unused;
-      svn_fs_x__id_part_reset(&unused);
-
-      binary_noderev.predecessor_id
-        = store_id(container->ids, container->ids_dict, &unused);
-    }
+  binary_noderev.predecessor_id
+    = store_id(container->ids, container->ids_dict, &noderev->predecessor_id);
 
   if (noderev->copyfrom_path)
     {
@@ -416,7 +403,6 @@ svn_fs_x__noderevs_get(node_revision_t *
 {
   node_revision_t *noderev;
   binary_noderev_t *binary_noderev;
-  svn_fs_x__id_part_t predecessor_id;
 
   /* CONTAINER must be in 'finalized' mode */
   SVN_ERR_ASSERT(container->builder == NULL);
@@ -441,14 +427,11 @@ svn_fs_x__noderevs_get(node_revision_t *
                  binary_noderev->node_id));
   SVN_ERR(get_id(&noderev->copy_id, container->ids,
                  binary_noderev->copy_id));
-  SVN_ERR(get_id(&predecessor_id, container->ids,
+  SVN_ERR(get_id(&noderev->predecessor_id, container->ids,
                  binary_noderev->predecessor_id));
 
   noderev->id = svn_fs_x__id_create(&noderev->node_id, &noderev->noderev_id,
                                     pool);
-  noderev->predecessor_id = svn_fs_x__id_create(&noderev->node_id,
-                                                &predecessor_id,
-                                                pool);
 
   if (binary_noderev->flags & NODEREV_HAS_COPYFROM)
     {
@@ -868,7 +851,6 @@ svn_fs_x__noderevs_get_func(void **out,
 {
   node_revision_t *noderev;
   binary_noderev_t *binary_noderev;
-  svn_fs_x__id_part_t predecessor_id;
 
   apr_array_header_t ids;
   apr_array_header_t reps;
@@ -894,13 +876,11 @@ svn_fs_x__noderevs_get_func(void **out,
   SVN_ERR(get_id(&noderev->noderev_id, &ids, binary_noderev->id));
   SVN_ERR(get_id(&noderev->node_id, &ids, binary_noderev->node_id));
   SVN_ERR(get_id(&noderev->copy_id, &ids, binary_noderev->copy_id));
-  SVN_ERR(get_id(&predecessor_id, &ids, binary_noderev->predecessor_id));
+  SVN_ERR(get_id(&noderev->predecessor_id, &ids,
+                 binary_noderev->predecessor_id));
 
   noderev->id = svn_fs_x__id_create(&noderev->node_id, &noderev->noderev_id,
                                     pool);
-  noderev->predecessor_id = svn_fs_x__id_create(&noderev->node_id,
-                                                &predecessor_id,
-                                                pool);
 
   if (binary_noderev->flags & NODEREV_HAS_COPYFROM)
     {

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c Sun Dec 21 08:52:07 2014
@@ -339,7 +339,6 @@ svn_fs_x__noderev_serialize(svn_temp_ser
 
   /* serialize sub-structures */
   svn_fs_x__id_serialize(context, &noderev->id);
-  svn_fs_x__id_serialize(context, &noderev->predecessor_id);
   serialize_representation(context, &noderev->prop_rep);
   serialize_representation(context, &noderev->data_rep);
 
@@ -370,9 +369,6 @@ svn_fs_x__noderev_deserialize(void *buff
 
   /* fixup of sub-structures */
   svn_fs_x__id_deserialize(noderev, (svn_fs_id_t **)&noderev->id, pool);
-  svn_fs_x__id_deserialize(noderev,
-                           (svn_fs_id_t **)&noderev->predecessor_id,
-                           pool);
   svn_temp_deserializer__resolve(noderev, (void **)&noderev->prop_rep);
   svn_temp_deserializer__resolve(noderev, (void **)&noderev->data_rep);
 

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c Sun Dec 21 08:52:07 2014
@@ -1167,7 +1167,7 @@ create_new_txn_noderev_from_rev(svn_fs_t
     return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                             _("Copying from transactions not allowed"));
 
-  noderev->predecessor_id = noderev->id;
+  noderev->predecessor_id = noderev->noderev_id;
   noderev->predecessor_count++;
   noderev->copyfrom_path = NULL;
   noderev->copyfrom_rev = SVN_INVALID_REVNUM;
@@ -1427,7 +1427,8 @@ svn_fs_x__get_txn(transaction_t **txn_p,
                                       pool, pool));
 
   txn->root_id = svn_fs_x__id_copy(noderev->id, pool);
-  txn->base_id = svn_fs_x__id_copy(noderev->predecessor_id, pool);
+  txn->base_id = svn_fs_x__id_create(&noderev->node_id,
+                                     &noderev->predecessor_id, pool);
   txn->copies = NULL;
 
   *txn_p = txn;
@@ -1931,13 +1932,11 @@ shards_spanned(int *spanned,
   iterpool = svn_pool_create(pool);
   while (walk-- && noderev->predecessor_count)
     {
-      const svn_fs_x__noderev_id_t *predecessor_id
-        = svn_fs_x__id_noderev_id(noderev->predecessor_id);
+      svn_fs_x__id_part_t id = noderev->predecessor_id;
 
       svn_pool_clear(iterpool);
-      SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, predecessor_id,
-                                          pool, iterpool));
-      shard = svn_fs_x__get_revnum(predecessor_id->change_set) / shard_size;
+      SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, &id, pool, iterpool));
+      shard = svn_fs_x__get_revnum(id.change_set) / shard_size;
       if (shard != last_shard)
         {
           ++count;
@@ -2021,12 +2020,9 @@ choose_delta_base(representation_t **rep
   iterpool = svn_pool_create(pool);
   while ((count++) < noderev->predecessor_count)
     {
-      const svn_fs_x__noderev_id_t *predecessor_id
-        = svn_fs_x__id_noderev_id(noderev->predecessor_id);
-
+      svn_fs_x__id_part_t id = noderev->predecessor_id;
       svn_pool_clear(iterpool);
-      SVN_ERR(svn_fs_x__get_node_revision(&base, fs, predecessor_id, pool,
-                                          iterpool));
+      SVN_ERR(svn_fs_x__get_node_revision(&base, fs, &id, pool, iterpool));
     }
   svn_pool_destroy(iterpool);
 

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c Sun Dec 21 08:52:07 2014
@@ -3465,7 +3465,7 @@ svn_error_t *x_closest_copy(svn_fs_root_
   if (created_rev == copy_dst_rev)
     {
       const svn_fs_id_t *pred;
-      SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred, copy_dst_node));
+      SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred, copy_dst_node, pool));
       if (! pred)
         return SVN_NO_ERROR;
     }
@@ -3566,7 +3566,8 @@ history_prev(svn_fs_history_t **prev_his
              no predecessor, in which case we're all done!). */
           const svn_fs_id_t *pred_id;
 
-          SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node));
+          SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node,
+                                                   scratch_pool));
           if (! pred_id)
             return SVN_NO_ERROR;
 
@@ -4277,7 +4278,7 @@ verify_node(dag_node_t *node,
   /* Fetch some data. */
   SVN_ERR(svn_fs_x__dag_has_mergeinfo(&has_mergeinfo, node));
   SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_count, node));
-  SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node));
+  SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node, pool));
   SVN_ERR(svn_fs_x__dag_get_predecessor_count(&pred_count, node));
   kind = svn_fs_x__dag_node_kind(node);
 
@@ -4417,7 +4418,7 @@ svn_fs_x__verify_root(svn_fs_root_t *roo
     const svn_fs_id_t *pred_id;
 
     /* Only r0 should have no predecessor. */
-    SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, root_dir));
+    SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, root_dir, pool));
     if (! root->is_txn_root && !!pred_id != !!root->rev)
       return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
                                "r%ld's root node's predecessor is "