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, ©_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, ©_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));
}