AnyEvent-MP
view release on metacpan or search on metacpan
MP/Kernel.pm view on Meta::CPAN
global_req_add "g_find $_[0]", [g_find => $_[0]];
}
# reply for g_find started in Node.pm
$NODE_REQ{g_found} = sub {
global_req_del "g_find $_[0]";
my $node = $NODE{$_[0]} or return;
$node->connect_to ($_[1]);
};
sub master_set {
$MASTER = $_[0];
AE::log 8 => "new master node: $MASTER.";
$MASTER_MON = mon_nodes sub {
if ($_[0] eq $MASTER && !$_[1]) {
undef $MASTER;
master_search ();
}
};
snd $MASTER, g_slave => \%LOCAL_DB;
# (re-)send queued requests
snd $MASTER, @$_
for values %GLOBAL_REQ;
}
sub master_search {
AE::log 9 => "starting search for master node.";
#TODO: should also look for other global nodes, but we don't know them
for (keys %NODE_SEED) {
if (node_is_up $_) {
master_set $_;
return;
}
}
$MASTER_MON = mon_nodes sub {
return unless $_[1]; # we are only interested in node-ups
return unless $NODE_SEED{$_[0]}; # we are only interested in seed nodes
master_set $_[0];
};
}
# other node wants to make us the master, so start the global service
$NODE_REQ{g_slave} = sub {
# load global module and redo the request
require AnyEvent::MP::Global;
&{ $NODE_REQ{g_slave} }
};
#############################################################################
# local database operations
# canonical probably not needed
our $sv_eq_coder = JSON::XS->new->utf8->allow_nonref;
# are the two scalars equal? very very ugly and slow, need better way
sub sv_eq($$) {
ref $_[0] || ref $_[1]
? (JSON::XS::encode $sv_eq_coder, $_[0]) eq (JSON::XS::encode $sv_eq_coder, $_[1])
: $_[0] eq $_[1]
&& defined $_[0] == defined $_[1]
}
# local database management
sub db_del($@) {
my $family = shift;
my @del = grep exists $LOCAL_DB{$family}{$_}, @_;
return unless @del;
delete @{ $LOCAL_DB{$family} }{@del};
snd $MASTER, g_upd => $family => undef, \@del
if defined $MASTER;
}
sub db_set($$;$) {
my ($family, $subkey) = @_;
# if (ref $_[1]) {
# # bulk
# my @del = grep exists $LOCAL_DB{$_[0]}{$_}, keys ${ $_[1] };
# $LOCAL_DB{$_[0]} = $_[1];
# snd $MASTER, g_upd => $_[0] => $_[1], \@del
# if defined $MASTER;
# } else {
# single-key
unless (exists $LOCAL_DB{$family}{$subkey} && sv_eq $LOCAL_DB{$family}{$subkey}, $_[2]) {
$LOCAL_DB{$family}{$subkey} = $_[2];
snd $MASTER, g_upd => $family => { $subkey => $_[2] }
if defined $MASTER;
}
# }
defined wantarray
and Guard::guard { db_del $family => $subkey }
}
# database query
sub db_family {
my ($family, $cb) = @_;
global_call g_db_family => $family, $cb;
}
sub db_keys {
my ($family, $cb) = @_;
global_call g_db_keys => $family, $cb;
}
sub db_values {
my ($family, $cb) = @_;
global_call g_db_values => $family, $cb;
( run in 0.580 second using v1.01-cache-2.11-cpan-39bf76dae61 )