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/01/13 20:17:30 UTC

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

Author: stefan2
Date: Sun Jan 13 19:17:29 2013
New Revision: 1432703

URL: http://svn.apache.org/viewvc?rev=1432703&view=rev
Log:
On the fsfs-format7 branch: Change ID from "rev/offset" to "rev/item"
and update callers.  Pre-format 7 repos will use offset+1 for the item
index value.

* subversion/libsvn_fs_fs/id.h
  (svn_fs_fs__id_offset): replaced by ...
  (svn_fs_fs__id_item): ... this one
  (svn_fs_fs__id_rev_create): update signature

* subversion/libsvn_fs_fs/id.c
  (id_private_t): replace 'offset' with 'item'
  (svn_fs_fs__id_offset): replaced by ...
  (svn_fs_fs__id_item): ... this one
  (svn_fs_fs__id_unparse,
   svn_fs_fs__id_eq,
   svn_fs_fs__id_txn_create,
   svn_fs_fs__id_rev_create,
   svn_fs_fs__id_copy,
   svn_fs_fs__id_parse): update

* subversion/libsvn_fs_fs/cached_data.c
  (open_and_seek_revision): simplify using the new item->offset mapping
  (get_cached_node_revision_body,
   set_cached_node_revision_body
   get_node_revision_body): update

* subversion/libsvn_fs_fs/recovery.c
  (recover_find_max_ids,
   svn_fs_fs__find_max_ids): additional item->offset conversion required

* subversion/libsvn_fs_fs/transaction.c
  (allocate_item_index): new function, WIP
  (write_final_rev): assign item indexes
  (commit_body): update; write revision trailer for old formats only

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/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=1432703&r1=1432702&r2=1432703&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 Sun Jan 13 19:17:29 2013
@@ -32,6 +32,7 @@
 #include "util.h"
 #include "pack.h"
 #include "temp_serializer.h"
+#include "index.h"
 
 #include "../libsvn_fs/fs-loader.h"
 
@@ -44,23 +45,16 @@ static svn_error_t *
 open_and_seek_revision(apr_file_t **file,
                        svn_fs_t *fs,
                        svn_revnum_t rev,
-                       apr_off_t offset,
+                       apr_uint64_t item,
                        apr_pool_t *pool)
 {
   apr_file_t *rev_file;
+  apr_off_t offset = -1;
 
   SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, pool));
 
   SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, rev, pool));
-
-  if (is_packed_rev(fs, rev))
-    {
-      apr_off_t rev_offset;
-
-      SVN_ERR(svn_fs_fs__get_packed_offset(&rev_offset, fs, rev, pool));
-      offset += rev_offset;
-    }
-
+  SVN_ERR(svn_fs_fs__item_offset(&offset, fs, rev, item, pool));
   SVN_ERR(svn_io_file_seek(rev_file, APR_SET, &offset, pool));
 
   *file = rev_file;
@@ -145,7 +139,7 @@ get_cached_node_revision_body(node_revis
       pair_cache_key_t key;
 
       key.revision = svn_fs_fs__id_rev(id);
-      key.second = svn_fs_fs__id_offset(id);
+      key.second = svn_fs_fs__id_item(id);
       SVN_ERR(svn_cache__get((void **) noderev_p,
                             is_cached,
                             ffd->node_revision_cache,
@@ -174,7 +168,7 @@ set_cached_node_revision_body(node_revis
       pair_cache_key_t key;
 
       key.revision = svn_fs_fs__id_rev(id);
-      key.second = svn_fs_fs__id_offset(id);
+      key.second = svn_fs_fs__id_item(id);
       return svn_cache__set(ffd->node_revision_cache,
                             &key,
                             noderev_p,
@@ -214,7 +208,7 @@ get_node_revision_body(node_revision_t *
       /* This is a revision node-rev. */
       err = open_and_seek_revision(&revision_file, fs,
                                    svn_fs_fs__id_rev(id),
-                                   svn_fs_fs__id_offset(id),
+                                   svn_fs_fs__id_item(id),
                                    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=1432703&r1=1432702&r2=1432703&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c Sun Jan 13 19:17:29 2013
@@ -34,7 +34,7 @@ typedef struct id_private_t {
   const char *copy_id;
   const char *txn_id;
   svn_revnum_t rev;
-  apr_off_t offset;
+  apr_uint64_t item;
 } id_private_t;
 
 
@@ -76,12 +76,12 @@ svn_fs_fs__id_rev(const svn_fs_id_t *id)
 }
 
 
-apr_off_t
-svn_fs_fs__id_offset(const svn_fs_id_t *id)
+apr_uint64_t
+svn_fs_fs__id_item(const svn_fs_id_t *id)
 {
   id_private_t *pvt = id->fsap_data;
 
-  return pvt->offset;
+  return pvt->item;
 }
 
 
@@ -97,7 +97,7 @@ svn_fs_fs__id_unparse(const svn_fs_id_t 
       char offset_string[SVN_INT64_BUFFER_SIZE];
 
       svn__i64toa(rev_string, pvt->rev);
-      svn__i64toa(offset_string, pvt->offset);
+      svn__i64toa(offset_string, pvt->item);
       return svn_string_createf(pool, "%s.%s.r%s/%s",
                                 pvt->node_id, pvt->copy_id,
                                 rev_string, offset_string);
@@ -131,7 +131,7 @@ svn_fs_fs__id_eq(const svn_fs_id_t *a,
     return FALSE;
   if (pvta->rev != pvtb->rev)
     return FALSE;
-  if (pvta->offset != pvtb->offset)
+  if (pvta->item != pvtb->item)
     return FALSE;
   return TRUE;
 }
@@ -190,7 +190,7 @@ svn_fs_fs__id_txn_create(const char *nod
   pvt->copy_id = apr_pstrdup(pool, copy_id);
   pvt->txn_id = apr_pstrdup(pool, txn_id);
   pvt->rev = SVN_INVALID_REVNUM;
-  pvt->offset = -1;
+  pvt->item = 0;
 
   id->vtable = &id_vtable;
   id->fsap_data = pvt;
@@ -202,7 +202,7 @@ svn_fs_id_t *
 svn_fs_fs__id_rev_create(const char *node_id,
                          const char *copy_id,
                          svn_revnum_t rev,
-                         apr_off_t offset,
+                         apr_uint64_t item,
                          apr_pool_t *pool)
 {
   svn_fs_id_t *id = apr_palloc(pool, sizeof(*id));
@@ -212,7 +212,7 @@ svn_fs_fs__id_rev_create(const char *nod
   pvt->copy_id = apr_pstrdup(pool, copy_id);
   pvt->txn_id = NULL;
   pvt->rev = rev;
-  pvt->offset = offset;
+  pvt->item = item;
 
   id->vtable = &id_vtable;
   id->fsap_data = pvt;
@@ -231,7 +231,7 @@ svn_fs_fs__id_copy(const svn_fs_id_t *id
   new_pvt->copy_id = apr_pstrdup(pool, pvt->copy_id);
   new_pvt->txn_id = pvt->txn_id ? apr_pstrdup(pool, pvt->txn_id) : NULL;
   new_pvt->rev = pvt->rev;
-  new_pvt->offset = pvt->offset;
+  new_pvt->item = pvt->item;
 
   new_id->vtable = &id_vtable;
   new_id->fsap_data = new_pvt;
@@ -304,14 +304,14 @@ svn_fs_fs__id_parse(const char *data,
           svn_error_clear(err);
           return NULL;
         }
-      pvt->offset = (apr_off_t)val;
+      pvt->item = (apr_uint32_t)val;
     }
   else if (str[0] == 't')
     {
       /* This is a transaction type ID */
       pvt->txn_id = str + 1;
       pvt->rev = SVN_INVALID_REVNUM;
-      pvt->offset = -1;
+      pvt->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=1432703&r1=1432702&r2=1432703&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h Sun Jan 13 19:17:29 2013
@@ -45,9 +45,9 @@ const char *svn_fs_fs__id_txn_id(const s
    transaction ID. */
 svn_revnum_t svn_fs_fs__id_rev(const svn_fs_id_t *id);
 
-/* Access the "offset" portion of the ID, or -1 if it is a transaction
+/* Access the "item" portion of the ID, or 0 if it is a transaction
    ID. */
-apr_off_t svn_fs_fs__id_offset(const svn_fs_id_t *id);
+apr_uint64_t svn_fs_fs__id_item(const svn_fs_id_t *id);
 
 /* Convert ID into string form, allocated in POOL. */
 svn_string_t *svn_fs_fs__id_unparse(const svn_fs_id_t *id,
@@ -77,7 +77,7 @@ svn_fs_id_t *svn_fs_fs__id_txn_create(co
 svn_fs_id_t *svn_fs_fs__id_rev_create(const char *node_id,
                                       const char *copy_id,
                                       svn_revnum_t rev,
-                                      apr_off_t offset,
+                                      apr_uint64_t item,
                                       apr_pool_t *pool);
 
 /* Return a copy of ID, allocated from POOL. */

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=1432703&r1=1432702&r2=1432703&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/recovery.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/recovery.c Sun Jan 13 19:17:29 2013
@@ -32,6 +32,7 @@
 #include "transaction.h"
 #include "util.h"
 #include "cached_data.h"
+#include "index.h"
 
 #include "../libsvn_fs/fs-loader.h"
 
@@ -267,7 +268,11 @@ recover_find_max_ids(svn_fs_t *fs, svn_r
       if (kind == svn_node_file)
         continue;
 
-      child_dir_offset = svn_fs_fs__id_offset(id);
+      SVN_ERR(svn_fs_fs__item_offset(&child_dir_offset,
+                                     fs,
+                                     svn_fs_fs__id_rev(id),
+                                     svn_fs_fs__id_item(id),
+                                     iterpool));
       SVN_ERR(recover_find_max_ids(fs, rev, rev_file, child_dir_offset,
                                    max_node_id, max_copy_id, iterpool));
     }
@@ -290,7 +295,10 @@ svn_fs_fs__find_max_ids(svn_fs_t *fs, sv
   SVN_ERR_ASSERT(ffd->format < SVN_FS_FS__MIN_NO_GLOBAL_IDS_FORMAT);
 
   SVN_ERR(svn_fs_fs__rev_get_root(&root_id, fs, youngest, pool));
-  root_offset = svn_fs_fs__id_offset(root_id);
+  SVN_ERR(svn_fs_fs__item_offset(&root_offset, fs,
+                                 svn_fs_fs__id_rev(root_id),
+                                 svn_fs_fs__id_item(root_id),
+                                 pool));
 
   SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&rev_file, fs, youngest, pool));
   SVN_ERR(recover_find_max_ids(fs, youngest, rev_file, root_offset,

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=1432703&r1=1432702&r2=1432703&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/transaction.c Sun Jan 13 19:17:29 2013
@@ -40,6 +40,7 @@
 #include "key-gen.h"
 #include "lock.h"
 #include "rep-cache.h"
+#include "index.h"
 
 #include "private/svn_fs_util.h"
 #include "private/svn_subr_private.h"
@@ -2400,6 +2401,25 @@ validate_root_noderev(svn_fs_t *fs,
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+allocate_item_index(svn_fs_t *fs,
+                    apr_uint64_t *item_index,
+                    apr_off_t my_offset,
+                    apr_pool_t *pool)
+{
+  fs_fs_data_t *ffd = fs->fsap_data;
+  if (ffd->format < SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
+    {
+      *item_index = (apr_uint64_t)(my_offset + 1);
+    }
+  else
+    {
+      ++*item_index;
+    }
+
+  return SVN_NO_ERROR;
+}
+
 /* Copy a node-revision specified by id ID in fileystem FS from a
    transaction into the proto-rev-file FILE.  Set *NEW_ID_P to a
    pointer to the new node-id which will be allocated in POOL.
@@ -2434,6 +2454,7 @@ write_final_rev(const svn_fs_id_t **new_
                 const svn_fs_id_t *id,
                 const char *start_node_id,
                 const char *start_copy_id,
+                apr_uint64_t *item_index,
                 apr_off_t initial_offset,
                 apr_array_header_t *reps_to_cache,
                 apr_hash_t *reps_hash,
@@ -2481,9 +2502,10 @@ write_final_rev(const svn_fs_id_t **new_
 
           svn_pool_clear(subpool);
           SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
-                                  start_node_id, start_copy_id, initial_offset,
-                                  reps_to_cache, reps_hash, reps_pool, FALSE,
-                                  subpool));
+                                  start_node_id, start_copy_id,
+                                  item_index, initial_offset,
+                                  reps_to_cache, reps_hash, reps_pool,
+                                  FALSE, subpool));
           if (new_id && (svn_fs_fs__id_rev(new_id) == rev))
             dirent->id = svn_fs_fs__id_copy(new_id, pool);
         }
@@ -2580,8 +2602,9 @@ write_final_rev(const svn_fs_id_t **new_
   if (noderev->copyroot_rev == SVN_INVALID_REVNUM)
     noderev->copyroot_rev = rev;
 
-  new_id = svn_fs_fs__id_rev_create(my_node_id, my_copy_id, rev, my_offset,
-                                    pool);
+  SVN_ERR(allocate_item_index(fs, item_index, my_offset, pool));
+  new_id = svn_fs_fs__id_rev_create(my_node_id, my_copy_id, rev,
+                                    *item_index, pool);
 
   noderev->id = new_id;
 
@@ -2790,11 +2813,11 @@ commit_body(void *baton, apr_pool_t *poo
   apr_file_t *proto_file;
   void *proto_file_lockcookie;
   apr_off_t initial_offset, changed_path_offset;
-  svn_stringbuf_t *trailer;
   apr_hash_t *txnprops;
   apr_array_header_t *txnprop_list;
   svn_prop_t prop;
   svn_string_t date;
+  apr_uint64_t item_index = 3;
 
   /* Get the current youngest revision. */
   SVN_ERR(svn_fs_fs__youngest_rev(&old_rev, cb->fs, pool));
@@ -2827,7 +2850,8 @@ commit_body(void *baton, apr_pool_t *poo
   /* Write out all the node-revisions and directory contents. */
   root_id = svn_fs_fs__id_txn_create("0", "0", cb->txn->id, pool);
   SVN_ERR(write_final_rev(&new_root_id, proto_file, new_rev, cb->fs, root_id,
-                          start_node_id, start_copy_id, initial_offset,
+                          start_node_id, start_copy_id, &item_index,
+                          initial_offset,
                           cb->reps_to_cache, cb->reps_hash, cb->reps_pool,
                           TRUE, pool));
 
@@ -2836,12 +2860,24 @@ commit_body(void *baton, apr_pool_t *poo
                                         cb->fs, cb->txn->id, pool));
 
   /* Write the final line. */
-  trailer = svn_fs_fs__unparse_revision_trailer
-              (svn_fs_fs__id_offset(new_root_id),
-               changed_path_offset,
-               pool);
-  SVN_ERR(svn_io_file_write_full(proto_file, trailer->data, trailer->len,
-                                 NULL, pool));
+
+  if (ffd->format < SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
+    {
+      svn_stringbuf_t *trailer;
+      apr_off_t root_offset;
+      SVN_ERR(svn_fs_fs__item_offset(&root_offset,
+                                     cb->fs,
+                                     svn_fs_fs__id_rev(new_root_id),
+                                     svn_fs_fs__id_item(new_root_id),
+                                     pool));
+      trailer = svn_fs_fs__unparse_revision_trailer
+                  (root_offset,
+                   changed_path_offset,
+                   pool);
+      SVN_ERR(svn_io_file_write_full(proto_file, trailer->data, trailer->len,
+                                     NULL, pool));
+    }
+
   SVN_ERR(svn_io_file_flush_to_disk(proto_file, pool));
   SVN_ERR(svn_io_file_close(proto_file, pool));