AC-Yenta
view release on metacpan or search on metacpan
lib/AC/Yenta/Store/Sharded.pm view on Meta::CPAN
# -*- perl -*-
# Copyright (c) 2010 AdCopy
# Author: Jeff Weisberg
# Created: 2010-Jun-07 17:34 (EDT)
# Function: consistently-hashed shards (unfinished)
#
# $Id$
package AC::Yenta::Store::Sharded;
use AC::Yenta::Debug 'map';
use AC::Yenta::Config;
use strict;
our @ISA = 'AC::Yenta::Store::Map';
# using too large a size, makes the tree heavy at the top, thin at the bottom
# taking up more space, and slowing down AE
my $SHARDLEN = 5;
sub new {
my $class = shift;
my $name = shift;
my $bend = shift;
my $conf = shift;
# die "nyi\n";
my $me = $class->SUPER::new( $name, $bend, $conf );
$me->{merkle_height} = 16 + $SHARDLEN;
return $me;
}
sub _shver_lev {
my $me = shift;
my $ver = shift;
my $lev = shift;
return substr($ver, 0, $lev) . ('0' x (16 - $lev));
}
sub _mkey {
my $me = shift;
my $shard = shift;
my $ver = shift;
my $lev = shift;
# L/<S & mask>:V
# least significant only
$shard = ('0' x (16 - $SHARDLEN)) . substr($shard, - $SHARDLEN);
if( $lev == $me->{merkle_height} ){
return sprintf '%02X/%s:%s', $lev, $shard, $ver;
}
if( $lev >= $SHARDLEN ){
return sprintf '%02X/%s:%s', $lev, $shard, $me->_shver_lev($ver, $lev - $SHARDLEN);
}
return sprintf '%02X/%s:%s', $lev, $me->_shver_lev($shard, 16 + $lev - $SHARDLEN), ('0' x 16);
}
sub _decode_mkey {
my $me = shift;
my $mk = shift;
# 20/8843d7f92416211d:0000000049D2A314
my($l,$sv) = split m|/|, $mk, 2;
my($s,$v) = split /:/, $sv, 2;
return ($l, $s, $v);
}
( run in 0.889 second using v1.01-cache-2.11-cpan-99c4e6809bf )