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 2013/03/08 22:00:06 UTC

svn commit: r1454552 - in /subversion/branches/fsfs-format7/subversion/libsvn_fs_fs: cached_data.c id.c id.h pack.c recovery.c transaction.c

Author: stefan2
Date: Fri Mar  8 21:00:06 2013
New Revision: 1454552

URL: http://svn.apache.org/r1454552
Log:
On the fsfs-format7 branch:  Make the "rev/item" part of a FSFS noderev ID
available as an ID part struct.  This is mainly for symmetry.  Replace
usages of svn_fs_fs__id_rev and svn_fs_fs__id_item with a single call to
svn_fs_fs__id_rev_item where appropriate.

This is part of the "numerical IDs" patch series.

* subversion/libsvn_fs_fs/id.h
  (svn_fs_fs__id_rev_item): declare new private API function
  (svn_fs_fs__id_rev_create): take rev and item as 1 ID part argument

* subversion/libsvn_fs_fs/id.c
  (fs_fs__id_t): store rev and item in an ID part struct
  (svn_fs_fs__id_rev_item): implement
  (svn_fs_fs__id_rev,
   svn_fs_fs__id_item,
   svn_fs_fs__id_unparse,
   svn_fs_fs__id_eq,
   svn_fs_fs__id_txn_create_root,
   svn_fs_fs__id_txn_create,
   svn_fs_fs__id_rev_create,
   svn_fs_fs__id_parse): update

* subversion/libsvn_fs_fs/cached_data.c
  (get_node_revision_body,
   svn_fs_fs__get_node_revision): use new rev_item ID part instead of
   making separate calls to *_rev() and *_item()

* subversion/libsvn_fs_fs/pack.c
  (compare_dir_entries_format6,
   copy_node_to_temp): ditto

* subversion/libsvn_fs_fs/recovery.c
  (recover_find_max_ids): same here

* subversion/libsvn_fs_fs/transaction.c
  (write_final_rev): adapt to interface change

Modified:
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/cached_data.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/pack.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/recovery.c
    subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/cached_data.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/cached_data.c?rev=1454552&r1=1454551&r2=1454552&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/cached_data.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/cached_data.c Fri Mar  8 21:00:06 2013
@@ -323,9 +323,11 @@ get_node_revision_body(node_revision_t *
   else
     {
       /* noderevs in rev / pack files can be cached */
+      const svn_fs_fs__id_part_t *rev_item = svn_fs_fs__id_rev_item(id);
+
       pair_cache_key_t key;
-      key.revision = svn_fs_fs__id_rev(id);
-      key.second = svn_fs_fs__id_item(id);
+      key.revision = rev_item->revision;
+      key.second = rev_item->number;
     
       /* First, try a cache lookup. If that succeeds, we are done here. */
       if (ffd->node_revision_cache)
@@ -341,8 +343,8 @@ get_node_revision_body(node_revision_t *
 
       /* someone needs to read the data from this file: */
       err = open_and_seek_revision(&revision_file, fs,
-                                   svn_fs_fs__id_rev(id),
-                                   svn_fs_fs__id_item(id),
+                                   rev_item->revision,
+                                   rev_item->number,
                                    pool);
 
       if (ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
@@ -350,8 +352,8 @@ get_node_revision_body(node_revision_t *
           /* block-read will parse the whole block and will also return
              the one noderev that we need right now. */
           SVN_ERR(block_read((void **)noderev_p, fs,
-                             svn_fs_fs__id_rev(id),
-                             svn_fs_fs__id_item(id),
+                             rev_item->revision,
+                             rev_item->number,
                              revision_file,
                              pool,
                              pool));
@@ -386,6 +388,8 @@ svn_fs_fs__get_node_revision(node_revisi
                              const svn_fs_id_t *id,
                              apr_pool_t *pool)
 {
+  const svn_fs_fs__id_part_t *rev_item = svn_fs_fs__id_rev_item(id);
+
   svn_error_t *err = get_node_revision_body(noderev_p, fs, id, pool);
   if (err && err->apr_err == SVN_ERR_FS_CORRUPT)
     {
@@ -396,8 +400,8 @@ svn_fs_fs__get_node_revision(node_revisi
     }
 
   SVN_ERR(dgb__log_access(fs,
-                          svn_fs_fs__id_rev(id),
-                          svn_fs_fs__id_item(id),
+                          rev_item->revision,
+                          rev_item->number,
                           *noderev_p,
                           SVN_FS_FS__ITEM_TYPE_NODEREV,
                           pool));

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c?rev=1454552&r1=1454551&r2=1454552&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c Fri Mar  8 21:00:06 2013
@@ -38,8 +38,7 @@ typedef struct fs_fs__id_t
   svn_fs_fs__id_part_t node_id;
   svn_fs_fs__id_part_t copy_id;
   const char *txn_id;
-  svn_revnum_t rev;
-  apr_uint64_t item;
+  svn_fs_fs__id_part_t rev_item;
 } fs_fs__id_t;
 
 
@@ -156,12 +155,20 @@ svn_fs_fs__id_txn_id(const svn_fs_id_t *
 }
 
 
+const svn_fs_fs__id_part_t *
+svn_fs_fs__id_rev_item(const svn_fs_id_t *fs_id)
+{
+  fs_fs__id_t *id = (fs_fs__id_t *)fs_id;
+
+  return &id->rev_item;
+}
+
 svn_revnum_t
 svn_fs_fs__id_rev(const svn_fs_id_t *fs_id)
 {
   fs_fs__id_t *id = (fs_fs__id_t *)fs_id;
 
-  return id->rev;
+  return id->rev_item.revision;
 }
 
 
@@ -170,7 +177,7 @@ svn_fs_fs__id_item(const svn_fs_id_t *fs
 {
   fs_fs__id_t *id = (fs_fs__id_t *)fs_id;
 
-  return id->item;
+  return id->rev_item.number;
 }
 
 
@@ -178,27 +185,26 @@ svn_string_t *
 svn_fs_fs__id_unparse(const svn_fs_id_t *fs_id,
                       apr_pool_t *pool)
 {
-  char string[4 * SVN_INT64_BUFFER_SIZE + 4];
+  char string[6 * SVN_INT64_BUFFER_SIZE + 10];
   fs_fs__id_t *id = (fs_fs__id_t *)fs_id;
 
   char *p = unparse_id_part(string, &id->node_id);
   p = unparse_id_part(p, &id->copy_id);
-  *p = '\0';
 
-  if ((! id->txn_id))
+  if (id->txn_id)
     {
-      char rev_string[SVN_INT64_BUFFER_SIZE];
-      char offset_string[SVN_INT64_BUFFER_SIZE];
-
-      svn__i64toa(rev_string, id->rev);
-      svn__i64toa(offset_string, id->item);
-      return svn_string_createf(pool, "%sr%s/%s", string,
-                                rev_string, offset_string);
+      *p = '\0';
+      return svn_string_createf(pool, "%st%s", string, id->txn_id);
     }
   else
     {
-      return svn_string_createf(pool, "%st%s", string, id->txn_id);
+      *(p++) = 'r';
+      p += svn__i64toa(p, id->rev_item.revision);
+      *(p++) = '/';
+      p += svn__i64toa(p, id->rev_item.number);
     }
+
+  return svn_string_ncreate(string, p - string, pool);
 }
 
 
@@ -219,11 +225,9 @@ svn_fs_fs__id_eq(const svn_fs_id_t *a,
     return FALSE;
   if (id_a->txn_id && id_b->txn_id && strcmp(id_a->txn_id, id_b->txn_id) != 0)
     return FALSE;
-  if (id_a->rev != id_b->rev)
-    return FALSE;
-  if (id_a->item != id_b->item)
-    return FALSE;
-  return TRUE;
+
+  return memcmp(&id_a->rev_item, &id_b->rev_item,
+                sizeof(&id_a->rev_item)) == 0;
 }
 
 
@@ -277,7 +281,7 @@ svn_fs_fs__id_txn_create_root(const char
   /* node ID and copy ID are "0" */
   
   id->txn_id = apr_pstrdup(pool, txn_id);
-  id->rev = SVN_INVALID_REVNUM;
+  id->rev_item.revision = SVN_INVALID_REVNUM;
 
   id->generic_id.vtable = &id_vtable;
   id->generic_id.fsap_data = &id;
@@ -296,7 +300,7 @@ svn_fs_fs__id_txn_create(const svn_fs_fs
   id->node_id = *node_id;
   id->copy_id = *copy_id;
   id->txn_id = apr_pstrdup(pool, txn_id);
-  id->rev = SVN_INVALID_REVNUM;
+  id->rev_item.revision = SVN_INVALID_REVNUM;
 
   id->generic_id.vtable = &id_vtable;
   id->generic_id.fsap_data = &id;
@@ -308,8 +312,7 @@ svn_fs_fs__id_txn_create(const svn_fs_fs
 svn_fs_id_t *
 svn_fs_fs__id_rev_create(const svn_fs_fs__id_part_t *node_id,
                          const svn_fs_fs__id_part_t *copy_id,
-                         svn_revnum_t rev,
-                         apr_uint64_t item,
+                         const svn_fs_fs__id_part_t *rev_item,
                          apr_pool_t *pool)
 {
   fs_fs__id_t *id = apr_pcalloc(pool, sizeof(*id));
@@ -317,8 +320,7 @@ svn_fs_fs__id_rev_create(const svn_fs_fs
   id->node_id = *node_id;
   id->copy_id = *copy_id;
   id->txn_id = NULL;
-  id->rev = rev;
-  id->item = item;
+  id->rev_item = *rev_item;
 
   id->generic_id.vtable = &id_vtable;
   id->generic_id.fsap_data = &id;
@@ -395,25 +397,22 @@ svn_fs_fs__id_parse(const char *data,
       str = svn_cstring_tokenize("/", &data_copy);
       if (str == NULL)
         return NULL;
-      id->rev = SVN_STR_TO_REV(str);
+      id->rev_item.revision = SVN_STR_TO_REV(str);
 
-      str = svn_cstring_tokenize("/", &data_copy);
-      if (str == NULL)
-        return NULL;
-      err = svn_cstring_atoi64(&val, str);
+      err = svn_cstring_atoi64(&val, data_copy);
       if (err)
         {
           svn_error_clear(err);
           return NULL;
         }
-      id->item = (apr_uint32_t)val;
+      id->rev_item.number = (apr_uint64_t)val;
     }
   else if (str[0] == 't')
     {
       /* This is a transaction type ID */
+      id->rev_item.revision = SVN_INVALID_REVNUM;
+      id->rev_item.number = 0;
       id->txn_id = str + 1;
-      id->rev = SVN_INVALID_REVNUM;
-      id->item = 0;
     }
   else
     return NULL;

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h?rev=1454552&r1=1454551&r2=1454552&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h Fri Mar  8 21:00:06 2013
@@ -66,6 +66,9 @@ const svn_fs_fs__id_part_t *svn_fs_fs__i
 /* Get the "txn id" portion of ID, or NULL if it is a permanent ID. */
 const char *svn_fs_fs__id_txn_id(const svn_fs_id_t *id);
 
+/* Get the "rev,item" portion of ID. */
+const svn_fs_fs__id_part_t *svn_fs_fs__id_rev_item(const svn_fs_id_t *id);
+
 /* Get the "rev" portion of ID, or SVN_INVALID_REVNUM if it is a
    transaction ID. */
 svn_revnum_t svn_fs_fs__id_rev(const svn_fs_id_t *id);
@@ -101,12 +104,11 @@ svn_fs_id_t *svn_fs_fs__id_txn_create(co
                                       const char *txn_id,
                                       apr_pool_t *pool);
 
-/* Create a permanent ID based on NODE_ID, COPY_ID, REV, and OFFSET,
+/* Create a permanent ID based on NODE_ID, COPY_ID and REV_ITEM,
    allocated in POOL. */
 svn_fs_id_t *svn_fs_fs__id_rev_create(const svn_fs_fs__id_part_t *node_id,
                                       const svn_fs_fs__id_part_t *copy_id,
-                                      svn_revnum_t rev,
-                                      apr_uint64_t item,
+                                      const svn_fs_fs__id_part_t *rev_item,
                                       apr_pool_t *pool);
 
 /* Return a copy of ID, allocated from POOL. */

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/pack.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/pack.c?rev=1454552&r1=1454551&r2=1454552&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/pack.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/pack.c Fri Mar  8 21:00:06 2013
@@ -557,20 +557,16 @@ compare_dir_entries_format6(const svn_so
   const svn_fs_dirent_t *lhs = (const svn_fs_dirent_t *) a->value;
   const svn_fs_dirent_t *rhs = (const svn_fs_dirent_t *) b->value;
 
-  apr_off_t lhs_offset;
-  apr_off_t rhs_offset;
+  const svn_fs_fs__id_part_t *lhs_rev_item = svn_fs_fs__id_rev_item(lhs->id);
+  const svn_fs_fs__id_part_t *rhs_rev_item = svn_fs_fs__id_rev_item(rhs->id);
 
   /* decreasing ("reverse") order on revs */
-  svn_revnum_t lhs_revision = svn_fs_fs__id_rev(lhs->id);
-  svn_revnum_t rhs_revision = svn_fs_fs__id_rev(rhs->id);
-  if (lhs_revision != rhs_revision)
-    return lhs_revision > rhs_revision ? -1 : 1;
+  if (lhs_rev_item->revision != rhs_rev_item->revision)
+    return lhs_rev_item->revision > rhs_rev_item->revision ? -1 : 1;
 
   /* increasing order on offsets */
-  lhs_offset = (apr_off_t)svn_fs_fs__id_item(lhs->id);
-  rhs_offset = (apr_off_t)svn_fs_fs__id_item(rhs->id);
-  if (lhs_offset != rhs_offset)
-    return lhs_offset > rhs_offset ? 1 : -1;
+  if (lhs_rev_item->number != rhs_rev_item->number)
+    return lhs_rev_item->number > rhs_rev_item->number ? 1 : -1;
 
   return 0;
 }
@@ -674,13 +670,15 @@ copy_node_to_temp(pack_context_t *contex
         {
           svn_fs_dirent_t *dir_entry
             = APR_ARRAY_IDX(sorted, i, svn_fs_dirent_t *);
-          svn_revnum_t revision = svn_fs_fs__id_rev(dir_entry->id);
-          apr_int64_t item_index = svn_fs_fs__id_item(dir_entry->id);
+          const svn_fs_fs__id_part_t *rev_item
+            = svn_fs_fs__id_rev_item(dir_entry->id);
 
           /* linkage is only possible within the current revision range ... */
-          if (revision >= context->start_rev)
+          if (rev_item->revision >= context->start_rev)
             {
-              int idx = get_item_array_index(context, revision, item_index);
+              int idx = get_item_array_index(context,
+                                             rev_item->revision,
+                                             rev_item->number);
 
               /* ... and also only to previous items (in case directories
                * become able to reference later items in the future). */

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/recovery.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/recovery.c?rev=1454552&r1=1454551&r2=1454552&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/recovery.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/recovery.c Fri Mar  8 21:00:06 2013
@@ -216,6 +216,7 @@ recover_find_max_ids(svn_fs_t *fs, svn_r
       char *str;
       svn_node_kind_t kind;
       svn_fs_id_t *id;
+      const svn_fs_fs__id_part_t *rev_item;
       apr_uint64_t node_id, copy_id;
       apr_off_t child_dir_offset;
       const svn_string_t *path = svn__apr_hash_index_val(hi);
@@ -246,7 +247,8 @@ recover_find_max_ids(svn_fs_t *fs, svn_r
 
       id = svn_fs_fs__id_parse(str, strlen(str), iterpool);
 
-      if (svn_fs_fs__id_rev(id) != rev)
+      rev_item = svn_fs_fs__id_rev_item(id);
+      if (rev_item->revision != rev)
         {
           /* If the node wasn't modified in this revision, we've already
              checked the node and copy id. */
@@ -266,9 +268,9 @@ recover_find_max_ids(svn_fs_t *fs, svn_r
 
       SVN_ERR(svn_fs_fs__item_offset(&child_dir_offset,
                                      fs,
-                                     svn_fs_fs__id_rev(id),
+                                     rev_item->revision,
                                      NULL,
-                                     svn_fs_fs__id_item(id),
+                                     rev_item->number,
                                      iterpool));
       SVN_ERR(recover_find_max_ids(fs, rev, rev_file, child_dir_offset,
                                    max_node_id, max_copy_id, iterpool));

Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c?rev=1454552&r1=1454551&r2=1454552&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c Fri Mar  8 21:00:06 2013
@@ -2645,9 +2645,8 @@ write_final_rev(const svn_fs_id_t **new_
   node_revision_t *noderev;
   apr_off_t my_offset;
   const svn_fs_id_t *new_id;
-  svn_fs_fs__id_part_t node_id, copy_id;
+  svn_fs_fs__id_part_t node_id, copy_id, rev_item;
   fs_fs_data_t *ffd = fs->fsap_data;
-  apr_uint64_t item_index;
   const char *txn_id = svn_fs_fs__id_txn_id(id);
 
   *new_id_p = NULL;
@@ -2767,13 +2766,16 @@ write_final_rev(const svn_fs_id_t **new_
   if (ffd->format >= SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT && at_root)
     {
       /* reference the root noderev from the log-to-phys index */
-      item_index = SVN_FS_FS__ITEM_INDEX_ROOT_NODE;
-      SVN_ERR(store_l2p_index_entry(fs, txn_id, my_offset, item_index, pool));
+      rev_item.number = SVN_FS_FS__ITEM_INDEX_ROOT_NODE;
+      SVN_ERR(store_l2p_index_entry(fs, txn_id, my_offset, rev_item.number,
+                                    pool));
     }
   else
-    SVN_ERR(allocate_item_index(&item_index, fs, txn_id, my_offset, pool));
-  new_id = svn_fs_fs__id_rev_create(&node_id, &copy_id, rev, item_index,
-                                    pool);
+    SVN_ERR(allocate_item_index(&rev_item.number, fs, txn_id, my_offset,
+                                pool));
+
+  rev_item.revision = rev;
+  new_id = svn_fs_fs__id_rev_create(&node_id, &copy_id, &rev_item, pool);
 
   noderev->id = new_id;
 
@@ -2833,7 +2835,7 @@ write_final_rev(const svn_fs_id_t **new_
       entry.size = my_offset - entry.offset;
       entry.type = SVN_FS_FS__ITEM_TYPE_NODEREV;
       entry.revision = SVN_INVALID_REVNUM;
-      entry.item_index = item_index;
+      entry.item_index = rev_item.number;
 
       SVN_ERR(store_p2l_index_entry(fs, txn_id, &entry, pool));
     }