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));