Author: stefan2
Date: Thu Apr 18 18:03:37 2013
New Revision: 1469500

URL: http://svn.apache.org/r1469500
Log:
On the fsfs-format7 branch:  Simplify svn_fs_fs__rev_get_root for format7
repositories because their ID is fixed for every revision and doesn't
require a lookup anymore.

* subversion/libsvn_fs_fs/id.h
  (svn_fs_fs__id_create_root): declare new API

* subversion/libsvn_fs_fs/id.c
  (svn_fs_fs__id_create_root): implement it

* subversion/libsvn_fs_fs/cached_data.c
  (svn_fs_fs__rev_get_root): directly construct and return the root ID
  (block_read_noderev): no need to cache root IDs anymore


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

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=1469500&r1=1469499&r2=1469500&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 Thu 
Apr 18 18:03:37 2013
@@ -534,54 +534,37 @@ svn_fs_fs__rev_get_root(svn_fs_id_t **ro
                         apr_pool_t *pool)
 {
   fs_fs_data_t *ffd = fs->fsap_data;
-  apr_file_t *revision_file;
-  apr_off_t root_offset;
-  apr_uint32_t root_sub_item;
-  svn_fs_id_t *root_id = NULL;
-  svn_boolean_t is_cached;
-
   SVN_ERR(svn_fs_fs__ensure_revision_exists(rev, fs, pool));
 
-  SVN_ERR(svn_cache__get((void **) root_id_p, &is_cached,
-                         ffd->rev_root_id_cache, &rev, pool));
-  if (is_cached)
-    return SVN_NO_ERROR;
-
-  SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&revision_file, fs, rev, pool));
-
   if (ffd->format < SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT)
     {
-      SVN_ERR(get_root_changes_offset(&root_offset, NULL, revision_file,
-                                      fs, rev, pool));
-    }
-  else
-    {
-      SVN_ERR(block_read(NULL, fs, rev, SVN_FS_FS__ITEM_INDEX_ROOT_NODE,
-                         revision_file, pool, pool));
+      apr_file_t *revision_file;
+      apr_off_t root_offset;
+      svn_fs_id_t *root_id = NULL;
+      svn_boolean_t is_cached;
 
-      /* the root node is most likely still in our caches */
       SVN_ERR(svn_cache__get((void **) root_id_p, &is_cached,
-                             ffd->rev_root_id_cache, &rev, pool));
+                            ffd->rev_root_id_cache, &rev, pool));
       if (is_cached)
-        {
-          SVN_ERR(svn_io_file_close(revision_file, pool));
-          return SVN_NO_ERROR;
-        }
+        return SVN_NO_ERROR;
 
-      SVN_ERR(svn_fs_fs__item_offset(&root_offset, &root_sub_item,
-                                     fs, rev, NULL,
-                                     SVN_FS_FS__ITEM_INDEX_ROOT_NODE, pool));
-      SVN_ERR_ASSERT(root_sub_item == 0);
-    }
+      SVN_ERR(svn_fs_fs__open_pack_or_rev_file(&revision_file, fs, rev, pool));
 
-  SVN_ERR(get_fs_id_at_offset(&root_id, revision_file, fs, rev,
-                              root_offset, pool));
+      SVN_ERR(get_root_changes_offset(&root_offset, NULL, revision_file,
+                                      fs, rev, pool));
+      SVN_ERR(get_fs_id_at_offset(&root_id, revision_file, fs, rev,
+                                  root_offset, pool));
 
-  SVN_ERR(svn_io_file_close(revision_file, pool));
+      SVN_ERR(svn_io_file_close(revision_file, pool));
 
-  SVN_ERR(svn_cache__set(ffd->rev_root_id_cache, &rev, root_id, pool));
+      SVN_ERR(svn_cache__set(ffd->rev_root_id_cache, &rev, root_id, pool));
 
-  *root_id_p = root_id;
+      *root_id_p = root_id;
+    }
+  else
+    {
+      *root_id_p = svn_fs_fs__id_create_root(rev, pool);
+    }
 
   return SVN_NO_ERROR;
 }
@@ -2494,11 +2477,6 @@ block_read_noderev(node_revision_t **nod
   if (ffd->node_revision_cache)
     SVN_ERR(svn_cache__set(ffd->node_revision_cache, key, *noderev_p, pool));
 
-  if (   entry->items[0].number == SVN_FS_FS__ITEM_INDEX_ROOT_NODE
-      && ffd->rev_root_id_cache)
-    SVN_ERR(svn_cache__set(ffd->rev_root_id_cache, &entry->items[0].revision,
-                           (void *)(*noderev_p)->id, pool));
-
   return SVN_NO_ERROR;
 }
 

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=1469500&r1=1469499&r2=1469500&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.c Thu Apr 18 
18:03:37 2013
@@ -24,6 +24,8 @@
 #include <stdlib.h>
 
 #include "id.h"
+#include "index.h"
+
 #include "../libsvn_fs/fs-loader.h"
 #include "private/svn_temp_serializer.h"
 #include "private/svn_string_private.h"
@@ -346,6 +348,21 @@ svn_fs_fs__id_txn_create_root(const svn_
   return (svn_fs_id_t *)id;
 }
 
+svn_fs_id_t *svn_fs_fs__id_create_root(const svn_revnum_t revision,
+                                       apr_pool_t *pool)
+{
+  fs_fs__id_t *id = apr_pcalloc(pool, sizeof(*id));
+
+  id->txn_id.revision = SVN_INVALID_REVNUM;
+  id->rev_item.revision = revision;
+  id->rev_item.number = SVN_FS_FS__ITEM_INDEX_ROOT_NODE;
+
+  id->generic_id.vtable = &id_vtable;
+  id->generic_id.fsap_data = &id;
+
+  return (svn_fs_id_t *)id;
+}
+
 svn_fs_id_t *
 svn_fs_fs__id_txn_create(const svn_fs_fs__id_part_t *node_id,
                          const svn_fs_fs__id_part_t *copy_id,

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=1469500&r1=1469499&r2=1469500&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/id.h Thu Apr 18 
18:03:37 2013
@@ -116,6 +116,10 @@ int svn_fs_fs__id_compare(const svn_fs_i
 svn_fs_id_t *svn_fs_fs__id_txn_create_root(const svn_fs_fs__id_part_t *txn_id,
                                            apr_pool_t *pool);
 
+/* Create the root ID for REVISION.  Allocate it in POOL. */
+svn_fs_id_t *svn_fs_fs__id_create_root(const svn_revnum_t revision,
+                                       apr_pool_t *pool);
+
 /* Create an ID within a transaction based on NODE_ID, COPY_ID, and
    TXN_ID, allocated in POOL. */
 svn_fs_id_t *svn_fs_fs__id_txn_create(const svn_fs_fs__id_part_t *node_id,


Reply via email to