[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: #4129 is reproducible Re: predecessor count for the root node-revision is wrong message

From: Philip Martin <philip.martin_at_wandisco.com>
Date: Mon, 19 Mar 2012 17:25:22 +0000

Philip Martin <philip.martin_at_wandisco.com> writes:

> I can reproduce ove ra_local:
>
> svnadmin create repo
> svn mkdir -mm file://`pwd`/repo/A
> svn mkdir -mm file://`pwd`/repo/B
> svn co file://`pwd`/repo wc1
> svn co file://`pwd`/repo wc2
> svn ps svn:mergeinfo /P:2 wc1/A
> svn ps svn:mergeinfo /Q:2 wc2/B
> svn mkdir wc1/X
> svn mkdir wc2/Y
> svn ci -mm wc1 & svn ci -mm wc2 & wait
>
> Gives:
>
> Sending wc1/A
> Adding wc1/X
> Sending wc2/B
> Adding wc2/Y
>
> Committed revision 3.
> svn: E160004: Commit failed (details follow):
> svn: E160004: predecessor count for the root node-revision is wrong: found 3, committing r4

This is the problem code in libsvn_fs_fs/tree.c:merge

  SVN_ERR(svn_fs_fs__dag_get_predecessor_count(&pred_count, source, pool));
  SVN_ERR(update_ancestry(fs, source_id, target_id, target_path,
                          pred_count, pool));

  if (svn_fs_fs__fs_supports_mergeinfo(fs))
    SVN_ERR(svn_fs_fs__dag_increment_mergeinfo_count(target,
                                                     mergeinfo_increment,
                                                     pool));

target is dag_node_t* which is opaque outside dag.c and
target->node_revision->predecessor_count is 3 when we reach the above
code.

update_ancestry rewrites the file repo/db/transactions/2-2.txn/node.0.0
with the correctly updated value "count: 4" but nothing updates
target->node_revision->predecessor_count in memory.

svn_fs_fs__dag_increment_mergeinfo_count then rewrites
repo/db/transactions/2-2.txn/node.0.0
pulling the old value of target->node_revision->predecessor_count from
memory and putting "count: 3" back in the file.

If I use the debugger to manually set target->node_revision to NULL
inside svn_fs_fs__dag_increment_mergeinfo_count then the commit works.
I'm not exactly sure how all the FSFS caching layers are supposed to
interact. Is tree.c:update_ancestry supposed to update the in-memory
predecessor_count? Should there be a svn_fs_fs__dag_xxx function to
change the predecessor count? Should target->node_revision be set to
NULL soemwehere? Something else?

-- 
uberSVN: Apache Subversion Made Easy
http://www.uberSVN.com
Received on 2012-03-19 18:26:00 CET

This is an archived mail posted to the Subversion Dev mailing list.