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 2014/12/21 09:52:08 UTC
svn commit: r1647111 - in
/subversion/branches/fsx-id/subversion/libsvn_fs_x: dag.c dag.h fs.h
low_level.c noderevs.c temp_serializer.c transaction.c tree.c
Author: stefan2
Date: Sun Dec 21 08:52:07 2014
New Revision: 1647111
URL: http://svn.apache.org/r1647111
Log:
On the fsx-id branch: In our noderev struct, use our internal ID part type
instead of the FS API ID to represent predecessor IDs. Construct the FS API
level object on demand.
* subversion/libsvn_fs_x/fs.h
(node_revision_t): Predecessor-ID has now the same type as the noderev-ID.
* subversion/libsvn_fs_x/low_level.c
(svn_fs_x__read_noderev,
svn_fs_x__write_noderev): Update parser / writer. Take into account that
"unused" predecessor IDs are no longer simply
indicated by a NULL pointer.
* subversion/libsvn_fs_x/temp_serializer.c
(svn_fs_x__noderev_serialize,
svn_fs_x__noderev_deserialize): One sub-structure less to (de-)serialize.
* subversion/libsvn_fs_x/noderevs.c
(svn_fs_x__noderevs_add,
svn_fs_x__noderevs_get,
svn_fs_x__noderevs_get_func): Predecessor IDs can now be read / set like
any other ID part. No temporaries needed.
* subversion/libsvn_fs_x/transaction.c
(create_new_txn_noderev_from_rev): Update assignment.
(svn_fs_x__get_txn): Construct the base ID on demand.
(shards_spanned,
choose_delta_base): Contents of the predecessor ID is now directly
accessible.
* subversion/libsvn_fs_x/dag.h
(svn_fs_x__dag_get_predecessor_id): Since we will now construct the ID
here, we need a result pool.
* subversion/libsvn_fs_x/dag.c
(copy_node_revision): One sub-struct less to copy.
(svn_fs_x__dag_get_node): Matching types simplifies assigment.
(svn_fs_x__dag_get_predecessor_id): Construct the FS API level ID here.
(make_entry): The NULL value is no longer the default for predecessor IDs.
ID parts must be reset manually.
(svn_fs_x__dag_clone_child,
svn_fs_x__dag_copy,
svn_fs_x__dag_update_ancestry): Update assignments.
* subversion/libsvn_fs_x/tree.c
(x_closest_copy,
history_prev,
verify_node,
svn_fs_x__verify_root): Update svn_fs_x__dag_get_predecessor_id callers.
Modified:
subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h
subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h
subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.c Sun Dec 21 08:52:07 2014
@@ -122,8 +122,6 @@ copy_node_revision(node_revision_t *node
node_revision_t *nr = apr_pmemdup(pool, noderev, sizeof(*noderev));
nr->id = svn_fs_x__id_copy(noderev->id, pool);
- if (noderev->predecessor_id)
- nr->predecessor_id = svn_fs_x__id_copy(noderev->predecessor_id, pool);
if (noderev->copyfrom_path)
nr->copyfrom_path = apr_pstrdup(pool, noderev->copyfrom_path);
@@ -269,8 +267,7 @@ svn_fs_x__dag_get_node(dag_node_t **node
new_node->created_path = apr_pstrdup(pool, noderev->created_path);
if (noderev->is_fresh_txn_root)
- new_node->fresh_root_predecessor_id
- = *svn_fs_x__id_noderev_id(noderev->predecessor_id);
+ new_node->fresh_root_predecessor_id = noderev->predecessor_id;
else
svn_fs_x__id_part_reset(&new_node->fresh_root_predecessor_id);
@@ -298,12 +295,15 @@ svn_fs_x__dag_get_revision(const dag_nod
svn_error_t *
svn_fs_x__dag_get_predecessor_id(const svn_fs_id_t **id_p,
- dag_node_t *node)
+ dag_node_t *node,
+ apr_pool_t *result_pool)
{
node_revision_t *noderev;
SVN_ERR(get_node_revision(&noderev, node));
- *id_p = noderev->predecessor_id;
+ *id_p = svn_fs_x__id_create(&noderev->node_id, &noderev->predecessor_id,
+ result_pool);
+
return SVN_NO_ERROR;
}
@@ -463,6 +463,7 @@ make_entry(dag_node_t **child_p,
new_noderev.copyroot_rev = parent_noderev->copyroot_rev;
new_noderev.copyfrom_rev = SVN_INVALID_REVNUM;
new_noderev.copyfrom_path = NULL;
+ svn_fs_x__id_part_reset(&new_noderev.predecessor_id);
SVN_ERR(svn_fs_x__create_node
(&new_node_id, svn_fs_x__dag_get_fs(parent), &new_noderev,
@@ -778,8 +779,7 @@ svn_fs_x__dag_clone_child(dag_node_t **c
noderev->copyfrom_path = NULL;
noderev->copyfrom_rev = SVN_INVALID_REVNUM;
- SVN_ERR(svn_fs_x__dag_get_fs_id(&noderev->predecessor_id, cur_entry,
- pool));
+ noderev->predecessor_id = noderev->noderev_id;
if (noderev->predecessor_count != -1)
noderev->predecessor_count++;
noderev->created_path = svn_fspath__join(parent_path, name, pool);
@@ -1275,7 +1275,7 @@ svn_fs_x__dag_copy(dag_node_t *to_node,
/* Create a successor with its predecessor pointing at the copy
source. */
- to_noderev->predecessor_id = to_noderev->id;
+ to_noderev->predecessor_id = to_noderev->noderev_id;
to_noderev->id = NULL;
if (to_noderev->predecessor_count != -1)
to_noderev->predecessor_count++;
@@ -1404,7 +1404,7 @@ svn_fs_x__dag_update_ancestry(dag_node_t
SVN_ERR(get_node_revision(&source_noderev, source));
SVN_ERR(get_node_revision(&target_noderev, target));
- target_noderev->predecessor_id = source_noderev->id;
+ target_noderev->predecessor_id = source_noderev->noderev_id;
target_noderev->predecessor_count = source_noderev->predecessor_count;
if (target_noderev->predecessor_count != -1)
target_noderev->predecessor_count++;
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/dag.h Sun Dec 21 08:52:07 2014
@@ -152,10 +152,11 @@ const char *svn_fs_x__dag_get_created_pa
/* Set *ID_P to the node revision ID of NODE's immediate predecessor,
- or NULL if NODE has no predecessor.
+ or NULL if NODE has no predecessor. Allocate the ID in RESULT_POOL.
*/
svn_error_t *svn_fs_x__dag_get_predecessor_id(const svn_fs_id_t **id_p,
- dag_node_t *node);
+ dag_node_t *node,
+ apr_pool_t *result_pool);
/* Set *COUNT to the number of predecessors NODE has (recursively), or
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/fs.h Sun Dec 21 08:52:07 2014
@@ -489,9 +489,9 @@ typedef struct node_revision_t
/* The node-id for this node-rev. */
const svn_fs_id_t *id;
- /* predecessor node revision id, or NULL if there is no predecessor
- for this node revision */
- const svn_fs_id_t *predecessor_id;
+ /* Predecessor node revision id. Will be "unused" if there is no
+ predecessor for this node revision. */
+ svn_fs_x__id_part_t predecessor_id;
/* The ID of this noderev */
svn_fs_x__noderev_id_t noderev_id;
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/low_level.c Sun Dec 21 08:52:07 2014
@@ -512,8 +512,9 @@ svn_fs_x__read_noderev(node_revision_t *
/* Get the predecessor ID. */
value = svn_hash_gets(headers, HEADER_PRED);
if (value)
- SVN_ERR(svn_fs_x__id_parse(&noderev->predecessor_id, value,
- result_pool));
+ SVN_ERR(svn_fs_x__id_part_parse(&noderev->predecessor_id, value));
+ else
+ svn_fs_x__id_part_reset(&noderev->predecessor_id);
/* Get the copyroot. */
value = svn_hash_gets(headers, HEADER_COPYROOT);
@@ -646,10 +647,10 @@ svn_fs_x__write_noderev(svn_stream_t *ou
(noderev->kind == svn_node_file) ?
SVN_FS_X__KIND_FILE : SVN_FS_X__KIND_DIR));
- if (noderev->predecessor_id)
+ if (svn_fs_x__id_part_used(&noderev->predecessor_id))
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PRED ": %s\n",
- svn_fs_x__id_unparse(noderev->predecessor_id,
- scratch_pool)->data));
+ svn_fs_x__id_part_unparse(&noderev->predecessor_id,
+ scratch_pool)->data));
SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COUNT ": %d\n",
noderev->predecessor_count));
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/noderevs.c Sun Dec 21 08:52:07 2014
@@ -266,21 +266,8 @@ svn_fs_x__noderevs_add(svn_fs_x__noderev
= store_id(container->ids, container->ids_dict, &noderev->node_id);
binary_noderev.copy_id
= store_id(container->ids, container->ids_dict, &noderev->copy_id);
-
- if (noderev->predecessor_id)
- {
- binary_noderev.predecessor_id
- = store_id(container->ids, container->ids_dict,
- svn_fs_x__id_noderev_id(noderev->predecessor_id));
- }
- else
- {
- svn_fs_x__id_part_t unused;
- svn_fs_x__id_part_reset(&unused);
-
- binary_noderev.predecessor_id
- = store_id(container->ids, container->ids_dict, &unused);
- }
+ binary_noderev.predecessor_id
+ = store_id(container->ids, container->ids_dict, &noderev->predecessor_id);
if (noderev->copyfrom_path)
{
@@ -416,7 +403,6 @@ svn_fs_x__noderevs_get(node_revision_t *
{
node_revision_t *noderev;
binary_noderev_t *binary_noderev;
- svn_fs_x__id_part_t predecessor_id;
/* CONTAINER must be in 'finalized' mode */
SVN_ERR_ASSERT(container->builder == NULL);
@@ -441,14 +427,11 @@ svn_fs_x__noderevs_get(node_revision_t *
binary_noderev->node_id));
SVN_ERR(get_id(&noderev->copy_id, container->ids,
binary_noderev->copy_id));
- SVN_ERR(get_id(&predecessor_id, container->ids,
+ SVN_ERR(get_id(&noderev->predecessor_id, container->ids,
binary_noderev->predecessor_id));
noderev->id = svn_fs_x__id_create(&noderev->node_id, &noderev->noderev_id,
pool);
- noderev->predecessor_id = svn_fs_x__id_create(&noderev->node_id,
- &predecessor_id,
- pool);
if (binary_noderev->flags & NODEREV_HAS_COPYFROM)
{
@@ -868,7 +851,6 @@ svn_fs_x__noderevs_get_func(void **out,
{
node_revision_t *noderev;
binary_noderev_t *binary_noderev;
- svn_fs_x__id_part_t predecessor_id;
apr_array_header_t ids;
apr_array_header_t reps;
@@ -894,13 +876,11 @@ svn_fs_x__noderevs_get_func(void **out,
SVN_ERR(get_id(&noderev->noderev_id, &ids, binary_noderev->id));
SVN_ERR(get_id(&noderev->node_id, &ids, binary_noderev->node_id));
SVN_ERR(get_id(&noderev->copy_id, &ids, binary_noderev->copy_id));
- SVN_ERR(get_id(&predecessor_id, &ids, binary_noderev->predecessor_id));
+ SVN_ERR(get_id(&noderev->predecessor_id, &ids,
+ binary_noderev->predecessor_id));
noderev->id = svn_fs_x__id_create(&noderev->node_id, &noderev->noderev_id,
pool);
- noderev->predecessor_id = svn_fs_x__id_create(&noderev->node_id,
- &predecessor_id,
- pool);
if (binary_noderev->flags & NODEREV_HAS_COPYFROM)
{
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/temp_serializer.c Sun Dec 21 08:52:07 2014
@@ -339,7 +339,6 @@ svn_fs_x__noderev_serialize(svn_temp_ser
/* serialize sub-structures */
svn_fs_x__id_serialize(context, &noderev->id);
- svn_fs_x__id_serialize(context, &noderev->predecessor_id);
serialize_representation(context, &noderev->prop_rep);
serialize_representation(context, &noderev->data_rep);
@@ -370,9 +369,6 @@ svn_fs_x__noderev_deserialize(void *buff
/* fixup of sub-structures */
svn_fs_x__id_deserialize(noderev, (svn_fs_id_t **)&noderev->id, pool);
- svn_fs_x__id_deserialize(noderev,
- (svn_fs_id_t **)&noderev->predecessor_id,
- pool);
svn_temp_deserializer__resolve(noderev, (void **)&noderev->prop_rep);
svn_temp_deserializer__resolve(noderev, (void **)&noderev->data_rep);
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/transaction.c Sun Dec 21 08:52:07 2014
@@ -1167,7 +1167,7 @@ create_new_txn_noderev_from_rev(svn_fs_t
return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
_("Copying from transactions not allowed"));
- noderev->predecessor_id = noderev->id;
+ noderev->predecessor_id = noderev->noderev_id;
noderev->predecessor_count++;
noderev->copyfrom_path = NULL;
noderev->copyfrom_rev = SVN_INVALID_REVNUM;
@@ -1427,7 +1427,8 @@ svn_fs_x__get_txn(transaction_t **txn_p,
pool, pool));
txn->root_id = svn_fs_x__id_copy(noderev->id, pool);
- txn->base_id = svn_fs_x__id_copy(noderev->predecessor_id, pool);
+ txn->base_id = svn_fs_x__id_create(&noderev->node_id,
+ &noderev->predecessor_id, pool);
txn->copies = NULL;
*txn_p = txn;
@@ -1931,13 +1932,11 @@ shards_spanned(int *spanned,
iterpool = svn_pool_create(pool);
while (walk-- && noderev->predecessor_count)
{
- const svn_fs_x__noderev_id_t *predecessor_id
- = svn_fs_x__id_noderev_id(noderev->predecessor_id);
+ svn_fs_x__id_part_t id = noderev->predecessor_id;
svn_pool_clear(iterpool);
- SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, predecessor_id,
- pool, iterpool));
- shard = svn_fs_x__get_revnum(predecessor_id->change_set) / shard_size;
+ SVN_ERR(svn_fs_x__get_node_revision(&noderev, fs, &id, pool, iterpool));
+ shard = svn_fs_x__get_revnum(id.change_set) / shard_size;
if (shard != last_shard)
{
++count;
@@ -2021,12 +2020,9 @@ choose_delta_base(representation_t **rep
iterpool = svn_pool_create(pool);
while ((count++) < noderev->predecessor_count)
{
- const svn_fs_x__noderev_id_t *predecessor_id
- = svn_fs_x__id_noderev_id(noderev->predecessor_id);
-
+ svn_fs_x__id_part_t id = noderev->predecessor_id;
svn_pool_clear(iterpool);
- SVN_ERR(svn_fs_x__get_node_revision(&base, fs, predecessor_id, pool,
- iterpool));
+ SVN_ERR(svn_fs_x__get_node_revision(&base, fs, &id, pool, iterpool));
}
svn_pool_destroy(iterpool);
Modified: subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c?rev=1647111&r1=1647110&r2=1647111&view=diff
==============================================================================
--- subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c (original)
+++ subversion/branches/fsx-id/subversion/libsvn_fs_x/tree.c Sun Dec 21 08:52:07 2014
@@ -3465,7 +3465,7 @@ svn_error_t *x_closest_copy(svn_fs_root_
if (created_rev == copy_dst_rev)
{
const svn_fs_id_t *pred;
- SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred, copy_dst_node));
+ SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred, copy_dst_node, pool));
if (! pred)
return SVN_NO_ERROR;
}
@@ -3566,7 +3566,8 @@ history_prev(svn_fs_history_t **prev_his
no predecessor, in which case we're all done!). */
const svn_fs_id_t *pred_id;
- SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node));
+ SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node,
+ scratch_pool));
if (! pred_id)
return SVN_NO_ERROR;
@@ -4277,7 +4278,7 @@ verify_node(dag_node_t *node,
/* Fetch some data. */
SVN_ERR(svn_fs_x__dag_has_mergeinfo(&has_mergeinfo, node));
SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_count, node));
- SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node));
+ SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, node, pool));
SVN_ERR(svn_fs_x__dag_get_predecessor_count(&pred_count, node));
kind = svn_fs_x__dag_node_kind(node);
@@ -4417,7 +4418,7 @@ svn_fs_x__verify_root(svn_fs_root_t *roo
const svn_fs_id_t *pred_id;
/* Only r0 should have no predecessor. */
- SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, root_dir));
+ SVN_ERR(svn_fs_x__dag_get_predecessor_id(&pred_id, root_dir, pool));
if (! root->is_txn_root && !!pred_id != !!root->rev)
return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL,
"r%ld's root node's predecessor is "