AC-Yenta
view release on metacpan or search on metacpan
lib/AC/Yenta/Store/Merkle.pm view on Meta::CPAN
my $ver = shift;
my $db = $me->{db};
# get range on data
my @key = map {
my $k = $_->{k}; $k =~ s|.*/||; $k
} $db->range($me->{name}, 'data', encode_version($ver), encode_version($ver + 1));
debug("actual key: @key");
return @key unless defined $shard;
# get vers list to filter on shard
my $sh = encode_shard($shard);
return grep {
my $k = $_;
my $vl = $db->get($me->{name}, 'vers', $k);
my($s) = $vl =~ /;\s*(.*)/;
$s == $sh;
} @key;
}
# check merkle leaf node against actual data
sub merkle_scrub {
my $me = shift;
my $shard = shift;
my $ver = shift;
debug("scrub $me->{name} $shard/$ver");
# get list of keys from merkle leaf node
my $mlist = $me->get_merkle($shard, $ver, $me->{merkle_height}) || [];
my @mkey = map { $_->{key} } @$mlist;
my %mkey;
@mkey{@mkey} = @mkey;
# get list of keys from actual data
my @akey = $me->_get_actual_keys( $shard, $ver );
# compare lists
for my $k (@akey){
next if $mkey{$k};
debug("missing key in merkle tree: $shard/$ver/$k");
$me->merkle( { key => $k, shard => $shard, version => $ver } );
}
}
################################################################
sub _mkey {
my $me = shift;
my $shard = shift;
my $ver = shift;
my $lev = shift;
# 10/000484D6594DB72B
sprintf '%02X/%s', $lev, $me->_ver_lev($ver, $lev);
}
sub _decode_mkey {
my $me = shift;
my $mk = shift;
# 10/000484D6594DB72B
my($l,$sv) = split m|/|, $mk, 2;
# level, shard, version
return ($l, undef, $sv);
}
sub _lkey {
my $me = shift;
my $k = shift;
my $v = shift;
my $s = shift;
# 000484D6594DB72B/foobar
return "$v/$k";
}
sub _decode_lkey {
my $me = shift;
my $lk = shift;
# 000484D6594DB72B/foobar
my($sv, $k) = split m|/|, $lk, 2;
# shard, version, key
return (undef, $sv, $k);
}
sub _ver_lev {
my $me = shift;
my $ver = shift;
my $lev = shift;
return substr($ver, 0, $lev) . ('0' x ($me->{merkle_height} - $lev));
}
################################################################
sub encode_version {
my $v = shift;
return x64_number_to_hex($v);
}
sub decode_version {
my $v = shift;
return x64_hex_to_number($v);
}
sub encode_shard {
my $v = shift;
return undef unless defined $v;
return x64_number_to_hex($v);
}
sub decode_shard {
my $v = shift;
( run in 1.012 second using v1.01-cache-2.11-cpan-97f6503c9c8 )