marsadm: fix recursion depth of _get_common_ancestor()

This commit is contained in:
Thomas Schoebel-Theuer 2014-03-06 21:12:26 +01:00
parent 0d5349b2ca
commit 1715b4fd40
1 changed files with 40 additions and 37 deletions

View File

@ -581,7 +581,7 @@ sub _get_prev_pos {
}
sub _get_common_ancestor {
# TODO: recursive formulation, improve efficiency
for (;;) {
my ($basedir, $pos1, $host1, $dep1, $pos2, $host2, $dep2) = @_;
my ($p1, $nr1, $from1, $len1) = _parse_pos($pos1, 0);
my ($p2, $nr2, $from2, $len2) = _parse_pos($pos2, 0);
@ -598,12 +598,14 @@ sub _get_common_ancestor {
return ($p1, $split);
} elsif ($nr1 > $nr2) {
# just flip arguments
return _get_common_ancestor($basedir, $pos2, $host2, $dep2, $pos1, $host1, $dep1);
@_ = ($basedir, $pos2, $host2, $dep2, $pos1, $host1, $dep1);
next;
} elsif ($nr1 < $nr2) {
# recursively advance path depth
my $vers2 = _get_prev_pos($basedir, $nr2, $host2);
return ("", -1) if !$vers2;
return _get_common_ancestor($basedir, $pos1, $host1, $dep1, $vers2, $host2, $dep2 + 1);
@_ = ($basedir, $pos1, $host1, $dep1, $vers2, $host2, $dep2 + 1);
next;
} elsif ($from1 ne $from2) {
# split brain is sure now, but continue computing the common split point
my $vers1 = _get_prev_pos($basedir, $nr1, $host1);
@ -621,6 +623,7 @@ sub _get_common_ancestor {
}
lwarn "error in algorithm: $p1, $nr1, $from1, $len1 : $p2, $nr2, $from2, $len2\n";
return ("", -1);
}
}
sub get_common_ancestor {