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,