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 )