AnyEvent-MP
view release on metacpan or search on metacpan
MP/Global.pm view on Meta::CPAN
db_set "'g" => $node;
# global nodes send all local databases of their slaves, merged,
# as their database to other global nodes
my %db;
while (my ($k, $v) = each %LOCAL_DBS) {
next unless exists $GLOBAL_SLAVE{$k};
while (my ($f, $fv) = each %$v) {
while (my ($k, $kv) = each %$fv) {
$db{$f}{$k} = $kv;
}
}
}
snd $node => g_set => \%db;
}
# overrides request in Kernel
$NODE_REQ{g_global} = sub {
g_disconnect $SRCNODE; # usually a nop, but not when a normal node becomes global
undef $GLOBAL_NODE{$SRCNODE}; # same as in Kernel.pm
g_global_connect $SRCNODE;
};
# delete data from other nodes on node-down
mon_nodes sub {
if ($_[1]) {
snd $_[0] => "g_global"; # tell everybody that we are a global node
} else {
g_disconnect $_[0];
}
};
# now, this is messy
AnyEvent::MP::Kernel::post_configure {
# enable global mode
$GLOBAL = 1;
# global nodes are their own masters - this
# resends global requests and sets the local database.
master_set $NODE;
# now add us to the set of global nodes
db_set "'g" => $NODE;
# tell other nodes that we are global now
for (up_nodes) {
snd $_, "g_global";
# if the node is global, connect
g_global_connect $_
if exists $GLOBAL_NODE{$_};
}
# from here on we should be able to act "normally"
# maintain connections to all global nodes that we know of
db_mon "'g" => sub {
keepalive_add $_ for @{ $_[1] };
keepalive_del $_ for @{ $_[3] };
};
};
#############################################################################
# compatibility functions for aemp 1.0
package AnyEvent::MP::Global;
use base "Exporter";
our @EXPORT = qw(grp_reg grp_get grp_mon);
sub grp_reg($$) {
&db_reg
}
sub grp_get($) {
my @ports = keys %{ $AnyEvent::MP::Kernel::GLOBAL_DB{$_[0]} };
@ports ? \@ports : undef
}
sub grp_mon($$) {
my ($grp, $cb) = @_;
db_mon $grp => sub {
my ($ports, $add, $chg, $del) = @_;
$cb->([keys %$ports], $add, $del);
};
}
=head1 SEE ALSO
L<AnyEvent::MP>.
=head1 AUTHOR
Marc Lehmann <schmorp@schmorp.de>
http://home.schmorp.de/
=cut
1
( run in 0.980 second using v1.01-cache-2.11-cpan-df04353d9ac )