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/24 09:18:56 UTC

svn commit: r1647744 - in /subversion/branches/fsx-id/subversion/libsvn_fs_x: cached_data.c dag.c dag.h fs.h temp_serializer.c transaction.c transaction.h tree.c

Author: stefan2
Date: Wed Dec 24 08:18:56 2014
New Revision: 1647744

URL: http://svn.apache.org/r1647744
Log:
On the fsx-id branch:
Use noderev-IDs instead of svn_fs_id_t within FSX' dirents.

This has a knock-on effect on various function signatures that now need
the internal instead of the FS API ID type (the alternative would have
been to add just as many type conversions / constructions).  The actual
code changes are simple and revolve around where to get the ID in the
right format with the occasional conversion and changed function to call.

* subversion/libsvn_fs_x/fs.h
  (dirent_t): Switch ID type.

* subversion/libsvn_fs_x/temp_serializer.c
  (serialize_dir_entry,
   deserialize_dir,
   svn_fs_x__extract_dir_entry): The ID element is no longer a sub-struct.

* subversion/libsvn_fs_x/cached_data.c
  (read_dir_entries): Switch ID type to parse.
  (svn_fs_x__rep_contents_dir_entry): Dirents are easier to copy now.

* subversion/libsvn_fs_x/transaction.h
  (svn_fs_x__create_node): Drop the obsolete FS API ID return value.
  (svn_fs_x__set_entry): Switch to internal ID type.
  (svn_fs_x__create_successor): Drop the obsolete FS API ID return value.
  (svn_fs_x__delete_node_revision): Switch to internal ID type.

* subversion/libsvn_fs_x/transaction.c
  (unparse_dir_entry): Switch ID type to serialize.
  (svn_fs_x__create_node): Don't generate the redundant FS API ID anymore.
  (svn_fs_x__set_entry): Update ID assignment.
  (svn_fs_x__create_successor): Don't generate the redundant FS API ID
                                anymore.
  (write_final_rev): Switch the ID of the noderev to serialize to our
                     internal type.  Update ID usage and assignments.
  (commit_body): Update caller.
  (svn_fs_x__delete_node_revision): Switch to our more easily accessible
                                    internal ID type and simplify the code.

* subversion/libsvn_fs_x/dag.h
  (svn_fs_x__dag_get_node,
   svn_fs_x__dag_set_entry,
   svn_fs_x__dag_remove_node,
   svn_fs_x__dag_delete_if_mutable): Switch to internal ID type.

* subversion/libsvn_fs_x/dag.c
  (svn_fs_x__dag_get_node): Same, simplifying implementation.
  (dir_entry_id_from_node): The internal ID type has a different "unused"
                            representation.
  (set_entry): Update pass-through parameter type.
  (make_entry): Simplify caller using the noderev-ID provided in the noderev.
  (svn_fs_x__dag_set_entry): Update pass-through parameter type.
  (svn_fs_x__dag_txn_root,
   svn_fs_x__dag_txn_base_root): Convert IDs in function call.
  (svn_fs_x__dag_clone_child): Switch logic to internal ID type.
  (svn_fs_x__dag_clone_root): Convert IDs in function call.
  (svn_fs_x__dag_delete): Update & simplify caller.
  (svn_fs_x__dag_remove_node): Update pass-through parameter type.
  (svn_fs_x__dag_delete_if_mutable): Same. Plus, update recursive call.
  (svn_fs_x__dag_open,
   svn_fs_x__dag_copy): Update callers.

* subversion/libsvn_fs_x/tree.c
  (node_kind): Convert ID type in function call.
  (compare_dir_structure,
   merge): Use appropriate ID comparison functions and update DAG calls.
  (x_dir_entries): Convert from internal to FS API ID type. 
  (history_prev): Convert ID type in function call.
  (crawl_directory_dag_for_mergeinfo): Call appropriate function.
  (verify_node): Same. Plus, update DAG function calls.

Modified:
    subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c
    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/temp_serializer.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
    subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h
    subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c?rev=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/cached_data.c Wed Dec 24 08:18:56 2014
@@ -2505,7 +2505,7 @@ read_dir_entries(apr_array_header_t *ent
                       _("Directory entry corrupt in '%s'"),
                       svn_fs_x__id_part_unparse(id, scratch_pool)->data);
 
-      SVN_ERR(svn_fs_x__id_parse(&dirent->id, str, result_pool));
+      SVN_ERR(svn_fs_x__id_part_parse(&dirent->id, str));
 
       /* In incremental mode, update the hash; otherwise, write to the
        * final array. */
@@ -2702,10 +2702,8 @@ svn_fs_x__rep_contents_dir_entry(dirent_
       entry = svn_fs_x__find_dir_entry(entries, name, NULL);
       if (entry)
         {
-          entry_copy = apr_palloc(result_pool, sizeof(*entry_copy));
+          entry_copy = apr_pmemdup(result_pool, entry, sizeof(*entry_copy));
           entry_copy->name = apr_pstrdup(result_pool, entry->name);
-          entry_copy->id = svn_fs_x__id_copy(entry->id, result_pool);
-          entry_copy->kind = entry->kind;
         }
 
       *dirent = entry_copy;

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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c Wed Dec 24 08:18:56 2014
@@ -247,7 +247,7 @@ svn_boolean_t svn_fs_x__dag_check_mutabl
 svn_error_t *
 svn_fs_x__dag_get_node(dag_node_t **node,
                        svn_fs_t *fs,
-                       const svn_fs_id_t *id,
+                       const svn_fs_x__noderev_id_t *id,
                        apr_pool_t *pool)
 {
   dag_node_t *new_node;
@@ -256,7 +256,7 @@ svn_fs_x__dag_get_node(dag_node_t **node
   /* Construct the node. */
   new_node = apr_pcalloc(pool, sizeof(*new_node));
   new_node->fs = fs;
-  new_node->id = *svn_fs_x__id_noderev_id(id);
+  new_node->id = *id;
 
   /* Grab the contents so we can inspect the node's kind and created path. */
   new_node->node_pool = pool;
@@ -368,11 +368,10 @@ svn_fs_x__dag_has_descendants_with_merge
 
 /* Some of these are helpers for functions outside this section. */
 
-/* Set *ID_P to the node-id for entry NAME in PARENT.  If no such
-   entry, set *ID_P to NULL but do not error.  The node-id is
-   allocated in POOL. */
+/* Set *ID_P to the noderev-id for entry NAME in PARENT.  If no such
+   entry, set *ID_P to NULL but do not error. */
 static svn_error_t *
-dir_entry_id_from_node(const svn_fs_id_t **id_p,
+dir_entry_id_from_node(svn_fs_x__noderev_id_t *id_p,
                        dag_node_t *parent,
                        const char *name,
                        apr_pool_t *result_pool,
@@ -382,7 +381,10 @@ dir_entry_id_from_node(const svn_fs_id_t
 
   SVN_ERR(svn_fs_x__dag_dir_entry(&dirent, parent, name, result_pool,
                                   scratch_pool));
-  *id_p = dirent ? dirent->id : NULL;
+  if (dirent)
+    *id_p = dirent->id;
+  else
+    svn_fs_x__id_part_reset(id_p);
 
   return SVN_NO_ERROR;
 }
@@ -399,7 +401,7 @@ dir_entry_id_from_node(const svn_fs_id_t
 static svn_error_t *
 set_entry(dag_node_t *parent,
           const char *name,
-          const svn_fs_id_t *id,
+          const svn_fs_x__noderev_id_t *id,
           svn_node_kind_t kind,
           svn_fs_x__txn_id_t txn_id,
           apr_pool_t *pool)
@@ -431,7 +433,6 @@ make_entry(dag_node_t **child_p,
            svn_fs_x__txn_id_t txn_id,
            apr_pool_t *pool)
 {
-  const svn_fs_id_t *new_node_id;
   node_revision_t new_noderev, *parent_noderev;
 
   /* Make sure that NAME is a single path component. */
@@ -466,17 +467,17 @@ make_entry(dag_node_t **child_p,
   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,
+          (svn_fs_x__dag_get_fs(parent), &new_noderev,
            &parent_noderev->copy_id, txn_id, pool));
 
   /* Create a new dag_node_t for our new node */
   SVN_ERR(svn_fs_x__dag_get_node(child_p, svn_fs_x__dag_get_fs(parent),
-                                 new_node_id, pool));
+                                 &new_noderev.noderev_id, pool));
 
   /* We can safely call set_entry because we already know that
      PARENT is mutable, and we just created CHILD, so we know it has
      no ancestors (therefore, PARENT cannot be an ancestor of CHILD) */
-  return set_entry(parent, name, new_node_id,
+  return set_entry(parent, name, &new_noderev.noderev_id,
                    new_noderev.kind, txn_id, pool);
 }
 
@@ -520,7 +521,7 @@ svn_fs_x__dag_dir_entry(dirent_t **diren
 svn_error_t *
 svn_fs_x__dag_set_entry(dag_node_t *node,
                         const char *entry_name,
-                        const svn_fs_id_t *id,
+                        const svn_fs_x__noderev_id_t *id,
                         svn_node_kind_t kind,
                         svn_fs_x__txn_id_t txn_id,
                         apr_pool_t *pool)
@@ -703,7 +704,8 @@ svn_fs_x__dag_txn_root(dag_node_t **node
   const svn_fs_id_t *root_id, *ignored;
 
   SVN_ERR(svn_fs_x__get_txn_ids(&root_id, &ignored, fs, txn_id, pool));
-  return svn_fs_x__dag_get_node(node_p, fs, root_id, pool);
+  return svn_fs_x__dag_get_node(node_p, fs, 
+                                svn_fs_x__id_noderev_id(root_id), pool);
 }
 
 
@@ -716,7 +718,8 @@ svn_fs_x__dag_txn_base_root(dag_node_t *
   const svn_fs_id_t *base_root_id, *ignored;
 
   SVN_ERR(svn_fs_x__get_txn_ids(&ignored, &base_root_id, fs, txn_id, pool));
-  return svn_fs_x__dag_get_node(node_p, fs, base_root_id, pool);
+  return svn_fs_x__dag_get_node(node_p, fs,
+                                svn_fs_x__id_noderev_id(base_root_id), pool);
 }
 
 
@@ -731,7 +734,7 @@ svn_fs_x__dag_clone_child(dag_node_t **c
                           apr_pool_t *pool)
 {
   dag_node_t *cur_entry; /* parent's current entry named NAME */
-  const svn_fs_id_t *new_node_id; /* node id we'll put into NEW_NODE */
+  const svn_fs_x__noderev_id_t *new_node_id; /* node id we'll put into NEW_NODE */
   svn_fs_t *fs = svn_fs_x__dag_get_fs(parent);
   apr_pool_t *subpool = svn_pool_create(pool);
 
@@ -759,7 +762,7 @@ svn_fs_x__dag_clone_child(dag_node_t **c
   if (svn_fs_x__dag_check_mutable(cur_entry))
     {
       /* This has already been cloned */
-      SVN_ERR(svn_fs_x__dag_get_fs_id(&new_node_id, cur_entry, pool));
+      new_node_id = svn_fs_x__dag_get_id(cur_entry);
     }
   else
     {
@@ -787,8 +790,8 @@ svn_fs_x__dag_clone_child(dag_node_t **c
       if (copy_id == NULL)
         copy_id = &noderev->copy_id;
 
-      SVN_ERR(svn_fs_x__create_successor(&new_node_id, fs,
-                                         noderev, copy_id, txn_id, pool));
+      SVN_ERR(svn_fs_x__create_successor(fs, noderev, copy_id, txn_id, pool));
+      new_node_id = &noderev->noderev_id;
 
       /* Replace the ID in the parent's ENTRY list with the ID which
          refers to the mutable clone of this child. */
@@ -826,7 +829,8 @@ svn_fs_x__dag_clone_root(dag_node_t **ro
    */
 
   /* One way or another, root_id now identifies a cloned root node. */
-  return svn_fs_x__dag_get_node(root_p, fs, root_id, pool);
+  return svn_fs_x__dag_get_node(root_p, fs, svn_fs_x__id_noderev_id(root_id),
+                                pool);
 }
 
 
@@ -839,7 +843,6 @@ svn_fs_x__dag_delete(dag_node_t *parent,
   node_revision_t *parent_noderev;
   svn_fs_t *fs = parent->fs;
   dirent_t *dirent;
-  svn_fs_id_t *id;
   apr_pool_t *subpool;
 
   /* Make sure parent is a directory. */
@@ -877,13 +880,9 @@ svn_fs_x__dag_delete(dag_node_t *parent,
       (SVN_ERR_FS_NO_SUCH_ENTRY, NULL,
        "Delete failed--directory has no entry '%s'", name);
 
-  /* Copy the ID out of the subpool and release the rest of the
-     directory listing. */
-  id = svn_fs_x__id_copy(dirent->id, pool);
-  svn_pool_destroy(subpool);
-
   /* If mutable, remove it and any mutable children from db. */
-  SVN_ERR(svn_fs_x__dag_delete_if_mutable(parent->fs, id, pool));
+  SVN_ERR(svn_fs_x__dag_delete_if_mutable(parent->fs, &dirent->id, pool));
+  svn_pool_destroy(subpool);
 
   /* Remove this entry from its parent's entries list. */
   return svn_fs_x__set_entry(parent->fs, txn_id, parent_noderev, name,
@@ -893,7 +892,7 @@ svn_fs_x__dag_delete(dag_node_t *parent,
 
 svn_error_t *
 svn_fs_x__dag_remove_node(svn_fs_t *fs,
-                          const svn_fs_id_t *id,
+                          const svn_fs_x__noderev_id_t *id,
                           apr_pool_t *pool)
 {
   dag_node_t *node;
@@ -913,7 +912,7 @@ svn_fs_x__dag_remove_node(svn_fs_t *fs,
 
 svn_error_t *
 svn_fs_x__dag_delete_if_mutable(svn_fs_t *fs,
-                                const svn_fs_id_t *id,
+                                const svn_fs_x__noderev_id_t *id,
                                 apr_pool_t *pool)
 {
   dag_node_t *node;
@@ -935,9 +934,11 @@ svn_fs_x__dag_delete_if_mutable(svn_fs_t
       SVN_ERR(svn_fs_x__dag_dir_entries(&entries, node, pool));
       if (entries)
         for (i = 0; i < entries->nelts; ++i)
-          SVN_ERR(svn_fs_x__dag_delete_if_mutable(fs,
-                        APR_ARRAY_IDX(entries, i, dirent_t *)->id,
-                        pool));
+          {
+            const svn_fs_x__noderev_id_t *noderev_id
+              = &APR_ARRAY_IDX(entries, i, dirent_t *)->id;
+            SVN_ERR(svn_fs_x__dag_delete_if_mutable(fs, noderev_id, pool));
+          }
     }
 
   /* ... then delete the node itself, after deleting any mutable
@@ -1225,12 +1226,12 @@ svn_fs_x__dag_open(dag_node_t **child_p,
                    apr_pool_t *result_pool,
                    apr_pool_t *scratch_pool)
 {
-  const svn_fs_id_t *node_id;
+  svn_fs_x__noderev_id_t node_id;
 
   /* Ensure that NAME exists in PARENT's entry list. */
   SVN_ERR(dir_entry_id_from_node(&node_id, parent, name,
                                  scratch_pool, scratch_pool));
-  if (! node_id)
+  if (! svn_fs_x__id_part_used(&node_id))
     {
       *child_p = NULL;
       return SVN_NO_ERROR;
@@ -1244,7 +1245,7 @@ svn_fs_x__dag_open(dag_node_t **child_p,
 
   /* Now get the node that was requested. */
   return svn_fs_x__dag_get_node(child_p, svn_fs_x__dag_get_fs(parent),
-                                node_id, result_pool);
+                                &node_id, result_pool);
 }
 
 
@@ -1258,7 +1259,7 @@ svn_fs_x__dag_copy(dag_node_t *to_node,
                    svn_fs_x__txn_id_t txn_id,
                    apr_pool_t *pool)
 {
-  const svn_fs_id_t *id;
+  const svn_fs_x__noderev_id_t *id;
 
   if (preserve_history)
     {
@@ -1287,13 +1288,13 @@ svn_fs_x__dag_copy(dag_node_t *to_node,
       /* Set the copyroot equal to our own id. */
       to_noderev->copyroot_path = NULL;
 
-      SVN_ERR(svn_fs_x__create_successor(&id, fs, to_noderev,
+      SVN_ERR(svn_fs_x__create_successor(fs, to_noderev,
                                          &copy_id, txn_id, pool));
-
+      id = &to_noderev->noderev_id;
     }
   else  /* don't preserve history */
     {
-      SVN_ERR(svn_fs_x__dag_get_fs_id(&id, from_node, pool));
+      id = svn_fs_x__dag_get_id(from_node);
     }
 
   /* Set the entry in to_node to the new id. */

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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h Wed Dec 24 08:18:56 2014
@@ -69,7 +69,7 @@ typedef struct dag_node_t dag_node_t;
 svn_error_t *
 svn_fs_x__dag_get_node(dag_node_t **node,
                        svn_fs_t *fs,
-                       const svn_fs_id_t *id,
+                       const svn_fs_x__noderev_id_t *id,
                        apr_pool_t *pool);
 
 
@@ -327,7 +327,7 @@ svn_error_t * svn_fs_x__dag_dir_entry(di
  */
 svn_error_t *svn_fs_x__dag_set_entry(dag_node_t *node,
                                      const char *entry_name,
-                                     const svn_fs_id_t *id,
+                                     const svn_fs_x__noderev_id_t *id,
                                      svn_node_kind_t kind,
                                      svn_fs_x__txn_id_t txn_id,
                                      apr_pool_t *pool);
@@ -390,7 +390,7 @@ svn_error_t *svn_fs_x__dag_delete(dag_no
    dangling, disconnected from all DAG trees.  It is assumed that
    callers of this interface know what in the world they are doing.  */
 svn_error_t *svn_fs_x__dag_remove_node(svn_fs_t *fs,
-                                       const svn_fs_id_t *id,
+                                       const svn_fs_x__noderev_id_t *id,
                                        apr_pool_t *pool);
 
 
@@ -400,7 +400,7 @@ svn_error_t *svn_fs_x__dag_remove_node(s
    node revision.  ID may refer to a file or directory, which may be
    mutable or immutable. */
 svn_error_t *svn_fs_x__dag_delete_if_mutable(svn_fs_t *fs,
-                                             const svn_fs_id_t *id,
+                                             const svn_fs_x__noderev_id_t *id,
                                              apr_pool_t *pool);
 
 

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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h Wed Dec 24 08:18:56 2014
@@ -540,7 +540,7 @@ typedef struct dirent_t
   const char *name;
 
   /** The node revision ID it names.  */
-  const svn_fs_id_t *id;
+  svn_fs_x__noderev_id_t id;
 
   /** The node kind. */
   svn_node_kind_t kind;

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=1647744&r1=1647743&r2=1647744&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 Wed Dec 24 08:18:56 2014
@@ -226,7 +226,6 @@ serialize_dir_entry(svn_temp_serializer_
                             (const void * const *)entry_p,
                             sizeof(dirent_t));
 
-  svn_fs_x__id_serialize(context, &entry->id);
   svn_temp_serializer__add_string(context, &entry->name);
 
   *length = (apr_uint32_t)(  svn_temp_serializer__get_length(context)
@@ -314,7 +313,6 @@ deserialize_dir(void *buffer, dir_data_t
 
       /* pointer fixup */
       svn_temp_deserializer__resolve(entry, (void **)&entry->name);
-      svn_fs_x__id_deserialize(entry, (svn_fs_id_t **)&entry->id, pool);
 
       /* add the entry to the hash */
       APR_ARRAY_PUSH(result, dirent_t *) = entry;
@@ -878,8 +876,6 @@ svn_fs_x__extract_dir_entry(void **out,
       memcpy(new_entry, source, size);
 
       svn_temp_deserializer__resolve(new_entry, (void **)&new_entry->name);
-      svn_fs_x__id_deserialize(new_entry, (svn_fs_id_t **)&new_entry->id,
-                               pool);
       *(dirent_t **)out = new_entry;
     }
 

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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c Wed Dec 24 08:18:56 2014
@@ -825,7 +825,7 @@ unparse_dir_entry(dirent_t *dirent,
     = apr_psprintf(pool, "%s %s",
                    (dirent->kind == svn_node_file) ? SVN_FS_X__KIND_FILE
                                                    : SVN_FS_X__KIND_DIR,
-                   svn_fs_x__id_unparse(dirent->id, pool)->data);
+                   svn_fs_x__id_part_unparse(&dirent->id, pool)->data);
 
   SVN_ERR(svn_stream_printf(stream, pool, "K %" APR_SIZE_T_FMT "\n%s\n"
                             "V %" APR_SIZE_T_FMT "\n%s\n",
@@ -1622,8 +1622,7 @@ svn_fs_x__reserve_copy_id(svn_fs_x__id_p
 }
 
 svn_error_t *
-svn_fs_x__create_node(const svn_fs_id_t **id_p,
-                      svn_fs_t *fs,
+svn_fs_x__create_node(svn_fs_t *fs,
                       node_revision_t *noderev,
                       const svn_fs_x__id_part_t *copy_id,
                       svn_fs_x__txn_id_t txn_id,
@@ -1640,9 +1639,6 @@ svn_fs_x__create_node(const svn_fs_id_t
   SVN_ERR(allocate_item_index(&noderev->noderev_id.number, fs, txn_id,
                               pool));
 
-  /* Construct the ID object from all the above parts. */
-  *id_p = svn_fs_x__id_create(&noderev->node_id, &noderev->noderev_id, pool);
-
   SVN_ERR(svn_fs_x__put_node_revision(fs, noderev, FALSE, pool));
 
   return SVN_NO_ERROR;
@@ -1696,7 +1692,7 @@ svn_fs_x__set_entry(svn_fs_t *fs,
                     svn_fs_x__txn_id_t txn_id,
                     node_revision_t *parent_noderev,
                     const char *name,
-                    const svn_fs_id_t *id,
+                    const svn_fs_x__noderev_id_t *id,
                     svn_node_kind_t kind,
                     apr_pool_t *pool)
 {
@@ -1753,7 +1749,7 @@ svn_fs_x__set_entry(svn_fs_t *fs,
           baton.new_entry = apr_pcalloc(subpool, sizeof(*baton.new_entry));
           baton.new_entry->name = name;
           baton.new_entry->kind = kind;
-          baton.new_entry->id = id;
+          baton.new_entry->id = *id;
         }
 
       /* actually update the cached directory (if cached) */
@@ -1768,7 +1764,7 @@ svn_fs_x__set_entry(svn_fs_t *fs,
     {
       dirent_t entry;
       entry.name = name;
-      entry.id = id;
+      entry.id = *id;
       entry.kind = kind;
 
       SVN_ERR(unparse_dir_entry(&entry, out, subpool));
@@ -2447,8 +2443,7 @@ svn_fs_x__set_contents(svn_stream_t **st
 }
 
 svn_error_t *
-svn_fs_x__create_successor(const svn_fs_id_t **new_id_p,
-                           svn_fs_t *fs,
+svn_fs_x__create_successor(svn_fs_t *fs,
                            node_revision_t *new_noderev,
                            const svn_fs_x__id_part_t *copy_id,
                            svn_fs_x__txn_id_t txn_id,
@@ -2459,8 +2454,6 @@ svn_fs_x__create_successor(const svn_fs_
   SVN_ERR(allocate_item_index(&new_noderev->noderev_id.number, fs, txn_id,
                               pool));
 
-  *new_id_p = svn_fs_x__id_create(&new_noderev->node_id,
-                                  &new_noderev->noderev_id, pool);
   if (! new_noderev->copyroot_path)
     {
       new_noderev->copyroot_path
@@ -2824,7 +2817,7 @@ write_final_rev(const svn_fs_id_t **new_
                 apr_file_t *file,
                 svn_revnum_t rev,
                 svn_fs_t *fs,
-                const svn_fs_id_t *id,
+                const svn_fs_x__noderev_id_t *id,
                 apr_off_t initial_offset,
                 apr_array_header_t *reps_to_cache,
                 apr_hash_t *reps_hash,
@@ -2837,7 +2830,7 @@ write_final_rev(const svn_fs_id_t **new_
   const svn_fs_id_t *new_id;
   svn_fs_x__id_part_t noderev_id;
   fs_x_data_t *ffd = fs->fsap_data;
-  svn_fs_x__txn_id_t txn_id = svn_fs_x__id_txn_id(id);
+  svn_fs_x__txn_id_t txn_id = svn_fs_x__get_txn_id(id->change_set);
   svn_fs_x__p2l_entry_t entry;
   svn_fs_x__change_set_t change_set = svn_fs_x__change_set_by_rev(rev);
   svn_stream_t *file_stream;
@@ -2846,13 +2839,11 @@ write_final_rev(const svn_fs_id_t **new_
   *new_id_p = NULL;
 
   /* Check to see if this is a transaction node. */
-  if (! svn_fs_x__id_is_txn(id))
+  if (txn_id == SVN_FS_X__INVALID_TXN_ID)
     return SVN_NO_ERROR;
 
   subpool = svn_pool_create(pool);
-  SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs,
-                                      svn_fs_x__id_noderev_id(id),
-                                      pool, subpool));
+  SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, id, pool, subpool));
 
   if (noderev->kind == svn_node_dir)
     {
@@ -2868,11 +2859,11 @@ write_final_rev(const svn_fs_id_t **new_
           dirent_t *dirent = APR_ARRAY_IDX(entries, i, dirent_t *);
 
           svn_pool_clear(subpool);
-          SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
+          SVN_ERR(write_final_rev(&new_id, file, rev, fs, &dirent->id,
                                   initial_offset, reps_to_cache, reps_hash,
                                   reps_pool, FALSE, subpool));
           if (new_id && (svn_fs_x__id_rev(new_id) == rev))
-            dirent->id = svn_fs_x__id_copy(new_id, pool);
+            dirent->id = *svn_fs_x__id_noderev_id(new_id);
         }
 
       if (noderev->data_rep
@@ -3346,7 +3337,8 @@ commit_body(void *baton, apr_pool_t *poo
 
   /* Write out all the node-revisions and directory contents. */
   root_id = svn_fs_x__id_txn_create_root(txn_id, pool);
-  SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, root_id,
+  SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs,
+                          svn_fs_x__id_noderev_id(root_id),
                           initial_offset, cb->reps_to_cache, cb->reps_hash,
                           cb->reps_pool, TRUE, pool));
 
@@ -3619,19 +3611,16 @@ svn_fs_x__txn_proplist(apr_hash_t **tabl
 
 svn_error_t *
 svn_fs_x__delete_node_revision(svn_fs_t *fs,
-                               const svn_fs_id_t *id,
+                               const svn_fs_x__noderev_id_t *id,
                                apr_pool_t *pool)
 {
   node_revision_t *noderev;
-  const svn_fs_x__noderev_id_t *noderev_id = svn_fs_x__id_noderev_id(id);
-
-  SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, noderev_id, pool, pool));
+  SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, id, pool, pool));
 
   /* Delete any mutable property representation. */
   if (noderev->prop_rep
       && svn_fs_x__is_txn(noderev->prop_rep->id.change_set))
-    SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_props(fs, noderev_id,
-                                                              pool),
+    SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_props(fs, id, pool),
                                 FALSE, pool));
 
   /* Delete any mutable data representation. */
@@ -3640,10 +3629,9 @@ svn_fs_x__delete_node_revision(svn_fs_t
       && noderev->kind == svn_node_dir)
     {
       fs_x_data_t *ffd = fs->fsap_data;
-      const svn_fs_x__id_part_t *key = svn_fs_x__id_noderev_id(id);
+      const svn_fs_x__id_part_t *key = id;
 
-      SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_children(fs,
-                                                                   noderev_id,
+      SVN_ERR(svn_io_remove_file2(svn_fs_x__path_txn_node_children(fs, id,
                                                                    pool),
                                   FALSE, pool));
 
@@ -3651,8 +3639,7 @@ svn_fs_x__delete_node_revision(svn_fs_t
       SVN_ERR(svn_cache__set(ffd->dir_cache, key, NULL, pool));
     }
 
-  return svn_io_remove_file2(svn_fs_x__path_txn_node_rev(fs, noderev_id,
-                                                         pool),
+  return svn_io_remove_file2(svn_fs_x__path_txn_node_rev(fs, id, pool),
                              FALSE, pool);
 }
 

Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h?rev=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.h Wed Dec 24 08:18:56 2014
@@ -140,13 +140,11 @@ svn_fs_x__reserve_copy_id(svn_fs_x__id_p
                           apr_pool_t *pool);
 
 /* Create an entirely new mutable node in the filesystem FS, whose
-   node-revision is NODEREV.  Set *ID_P to the new node revision's ID.
-   Use POOL for any temporary allocation.  COPY_ID is the copy_id to
-   use in the node revision ID.  TXN_ID is the Subversion transaction
-   under which this occurs. */
+   node-revision is NODEREV.  COPY_ID is the copy_id to use in the
+   node revision ID.  TXN_ID is the Subversion transaction  under
+   which this occurs. */
 svn_error_t *
-svn_fs_x__create_node(const svn_fs_id_t **id_p,
-                      svn_fs_t *fs,
+svn_fs_x__create_node(svn_fs_t *fs,
                       node_revision_t *noderev,
                       const svn_fs_x__id_part_t *copy_id,
                       svn_fs_x__txn_id_t txn_id,
@@ -173,7 +171,7 @@ svn_fs_x__set_entry(svn_fs_t *fs,
                     svn_fs_x__txn_id_t txn_id,
                     node_revision_t *parent_noderev,
                     const char *name,
-                    const svn_fs_id_t *id,
+                    const svn_fs_x__noderev_id_t *id,
                     svn_node_kind_t kind,
                     apr_pool_t *pool);
 
@@ -209,8 +207,7 @@ svn_fs_x__set_contents(svn_stream_t **st
                        apr_pool_t *pool);
 
 /* Create a node revision in FS which is an immediate successor of
-   NEW_NODEREV's predecessor.  Set *NEW_ID_P to the new node
-   revision's ID.  Use POOL for any temporary allocation.
+   NEW_NODEREV's predecessor.  Use POOL for any temporary allocation.
 
    COPY_ID, is a key into the `copies' table, and
    indicates that this new node is being created as the result of a
@@ -222,8 +219,7 @@ svn_fs_x__set_contents(svn_stream_t **st
    contents will change frequently, and will avoid representing other
    nodes as deltas against this node's contents.  */
 svn_error_t *
-svn_fs_x__create_successor(const svn_fs_id_t **new_id_p,
-                           svn_fs_t *fs,
+svn_fs_x__create_successor(svn_fs_t *fs,
                            node_revision_t *new_noderev,
                            const svn_fs_x__id_part_t *copy_id,
                            svn_fs_x__txn_id_t txn_id,
@@ -288,7 +284,7 @@ svn_fs_x__txn_proplist(apr_hash_t **tabl
    temporary allocations in POOL. */
 svn_error_t *
 svn_fs_x__delete_node_revision(svn_fs_t *fs,
-                               const svn_fs_id_t *id,
+                               const svn_fs_x__noderev_id_t *id,
                                apr_pool_t *pool);
 
 /* Retrieve information about the Subversion transaction SVN_TXN from

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=1647744&r1=1647743&r2=1647744&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c Wed Dec 24 08:18:56 2014
@@ -1534,7 +1534,8 @@ node_kind(svn_node_kind_t *kind_p,
   SVN_ERR(svn_fs_x__node_id(&node_id, root, path, pool));
 
   /* Use the node id to get the real kind. */
-  SVN_ERR(svn_fs_x__dag_get_node(&node, root->fs, node_id, pool));
+  SVN_ERR(svn_fs_x__dag_get_node(&node, root->fs,
+                                 svn_fs_x__id_noderev_id(node_id), pool));
   *kind_p = svn_fs_x__dag_node_kind(node);
 
   return SVN_NO_ERROR;
@@ -1782,16 +1783,16 @@ compare_dir_structure(svn_boolean_t *cha
           dag_node_t *lhs_node, *rhs_node;
 
           /* Unchanged entry? */
-          if (!svn_fs_x__id_eq(lhs_entry->id, rhs_entry->id))
+          if (!svn_fs_x__id_part_eq(&lhs_entry->id, &rhs_entry->id))
             continue;
 
           /* We get here rarely. */
           svn_pool_clear(iterpool);
 
           /* Modified but not copied / replaced or anything? */
-          SVN_ERR(svn_fs_x__dag_get_node(&lhs_node, fs, lhs_entry->id, 
+          SVN_ERR(svn_fs_x__dag_get_node(&lhs_node, fs, &lhs_entry->id, 
                                          iterpool));
-          SVN_ERR(svn_fs_x__dag_get_node(&rhs_node, fs, rhs_entry->id,
+          SVN_ERR(svn_fs_x__dag_get_node(&rhs_node, fs, &rhs_entry->id, 
                                          iterpool));
           SVN_ERR(svn_fs_x__dag_same_line_of_history(&same_history,
                                                      lhs_node, rhs_node));
@@ -2029,35 +2030,35 @@ merge(svn_stringbuf_t *conflict_p,
 
       /* No changes were made to this entry while the transaction was
          in progress, so do nothing to the target. */
-      if (s_entry && svn_fs_x__id_eq(a_entry->id, s_entry->id))
+      if (s_entry && svn_fs_x__id_part_eq(&a_entry->id, &s_entry->id))
         continue;
 
       /* A change was made to this entry while the transaction was in
          process, but the transaction did not touch this entry. */
-      else if (t_entry && svn_fs_x__id_eq(a_entry->id, t_entry->id))
+      else if (t_entry && svn_fs_x__id_part_eq(&a_entry->id, &t_entry->id))
         {
           apr_int64_t mergeinfo_start;
           apr_int64_t mergeinfo_end;
 
           dag_node_t *t_ent_node;
-          SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs,
-                                         t_entry->id, iterpool));
+          SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs, &t_entry->id,
+                                         iterpool));
           SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_start,
-                                                      t_ent_node));
+                                                    t_ent_node));
           mergeinfo_increment -= mergeinfo_start;
 
           if (s_entry)
             {
               dag_node_t *s_ent_node;
-              SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs,
-                                             s_entry->id, iterpool));
+              SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id,
+                                             iterpool));
 
               SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_end,
                                                         s_ent_node));
               mergeinfo_increment += mergeinfo_end;
 
               SVN_ERR(svn_fs_x__dag_set_entry(target, a_entry->name,
-                                              s_entry->id,
+                                              &s_entry->id,
                                               s_entry->kind,
                                               txn_id,
                                               iterpool));
@@ -2098,12 +2099,12 @@ merge(svn_stringbuf_t *conflict_p,
                                                  iterpool));
 
           /* Fetch DAG nodes to efficiently access ID parts. */
-          SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs,
-                                         s_entry->id, iterpool));
-          SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs,
-                                         t_entry->id, iterpool));
-          SVN_ERR(svn_fs_x__dag_get_node(&a_ent_node, fs,
-                                         a_entry->id, iterpool));
+          SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id,
+                                         iterpool));
+          SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs, &t_entry->id,
+                                         iterpool));
+          SVN_ERR(svn_fs_x__dag_get_node(&a_ent_node, fs, &a_entry->id,
+                                         iterpool));
 
           /* If either SOURCE-ENTRY or TARGET-ENTRY is not a direct
              modification of ANCESTOR-ENTRY, declare a conflict. */
@@ -2154,13 +2155,13 @@ merge(svn_stringbuf_t *conflict_p,
                                              t_entry->name,
                                              iterpool));
 
-      SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs,
-                                     s_entry->id, iterpool));
+      SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id,
+                                     iterpool));
       SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_s, s_ent_node));
       mergeinfo_increment += mergeinfo_s;
 
       SVN_ERR(svn_fs_x__dag_set_entry
-              (target, s_entry->name, s_entry->id, s_entry->kind,
+              (target, s_entry->name, &s_entry->id, s_entry->kind,
                txn_id, iterpool));
     }
   svn_pool_destroy(iterpool);
@@ -2472,7 +2473,9 @@ x_dir_entries(apr_hash_t **table_p,
       svn_fs_dirent_t *api_dirent = apr_pcalloc(pool, sizeof(*api_dirent));
       api_dirent->name = entry->name;
       api_dirent->kind = entry->kind;
-      api_dirent->id = svn_fs_x__id_copy(entry->id, pool);
+
+      SVN_ERR(svn_fs_x__dag_get_node(&node, root->fs, &entry->id, pool));
+      SVN_ERR(svn_fs_x__dag_get_fs_id(&api_dirent->id, node, pool));
 
       svn_hash_sets(hash, api_dirent->name, api_dirent);
     }
@@ -3577,7 +3580,9 @@ history_prev(svn_fs_history_t **prev_his
 
           /* Replace NODE and friends with the information from its
              predecessor. */
-          SVN_ERR(svn_fs_x__dag_get_node(&node, fs, pred_id, scratch_pool));
+          SVN_ERR(svn_fs_x__dag_get_node(&node, fs,
+                                         svn_fs_x__id_noderev_id(pred_id),
+                                         scratch_pool));
           commit_path = svn_fs_x__dag_get_created_path(node);
           commit_rev = svn_fs_x__dag_get_revision(node);
         }
@@ -3808,7 +3813,8 @@ crawl_directory_dag_for_mergeinfo(svn_fs
           mergeinfo_string = svn_hash_gets(proplist, SVN_PROP_MERGEINFO);
           if (!mergeinfo_string)
             {
-              svn_string_t *idstr = svn_fs_x__id_unparse(dirent->id, iterpool);
+              svn_string_t *idstr
+                = svn_fs_x__id_part_unparse(&dirent->id, iterpool);
               return svn_error_createf
                 (SVN_ERR_FS_CORRUPT, NULL,
                  _("Node-revision #'%s' claims to have mergeinfo but doesn't"),
@@ -4298,7 +4304,9 @@ verify_node(dag_node_t *node,
     {
       dag_node_t *pred;
       int pred_pred_count;
-      SVN_ERR(svn_fs_x__dag_get_node(&pred, fs, pred_id, iterpool));
+      SVN_ERR(svn_fs_x__dag_get_node(&pred, fs,
+                                     svn_fs_x__id_noderev_id(pred_id),
+                                     iterpool));
       SVN_ERR(svn_fs_x__dag_get_predecessor_count(&pred_pred_count, pred));
       if (pred_pred_count+1 != pred_count)
         return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
@@ -4344,9 +4352,9 @@ verify_node(dag_node_t *node,
           svn_pool_clear(iterpool);
 
           /* Compute CHILD_REV. */
-          if (svn_fs_x__id_rev(dirent->id) == rev)
+          if (svn_fs_x__get_revnum(dirent->id.change_set) == rev)
             {
-              SVN_ERR(svn_fs_x__dag_get_node(&child, fs, dirent->id,
+              SVN_ERR(svn_fs_x__dag_get_node(&child, fs, &dirent->id,
                                              iterpool));
               SVN_ERR(verify_node(child, rev, parent_nodes, iterpool));
               SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&child_mergeinfo,
@@ -4354,11 +4362,8 @@ verify_node(dag_node_t *node,
             }
           else
             {
-              const svn_fs_x__noderev_id_t *noderev_id
-                = svn_fs_x__id_noderev_id(dirent->id);
-
               SVN_ERR(svn_fs_x__get_mergeinfo_count(&child_mergeinfo, fs,
-                                                    noderev_id, iterpool));
+                                                    &dirent->id, iterpool));
             }
 
           children_mergeinfo += child_mergeinfo;