DBD-Patroni
view release on metacpan or search on metacpan
lib/DBD/Patroni.pm view on Meta::CPAN
my $ua = LWP::UserAgent->new(
timeout => $timeout,
env_proxy => 1,
);
for my $url ( split /[,\s]+/, $urls ) {
next unless $url;
my $resp = $ua->get($url);
next unless $resp->is_success;
my $data = eval { JSON::decode_json( $resp->decoded_content ) };
next if $@ or !$data->{members} or ref( $data->{members} ) ne 'ARRAY';
my ($leader) = grep { $_->{role} eq 'leader' } @{ $data->{members} };
my @replicas = grep { $_->{role} ne 'leader' } @{ $data->{members} };
return ( $leader, @replicas ) if $leader;
}
return;
}
t/03-failover.t view on Meta::CPAN
my $dsn = "dbi:Patroni:dbname=$dbname;sslmode=$sslmode;patroni_url=$patroni_urls";
# Helper to get cluster info
sub get_cluster_info {
my $ua = LWP::UserAgent->new( timeout => 5 );
for my $url ( split /,/, $patroni_urls ) {
my $resp = $ua->get($url);
next unless $resp->is_success;
my $data = eval { decode_json( $resp->decoded_content ) };
next unless $data && $data->{members};
my ($leader) = grep { $_->{role} eq 'leader' } @{ $data->{members} };
my @replicas = grep { $_->{role} ne 'leader' } @{ $data->{members} };
return {
leader => $leader,
replicas => \@replicas,
members => $data->{members},
};
t/03-failover.t view on Meta::CPAN
my $leader_host = $info->{leader}{host};
my $failover_url = "http://${leader_host}:8008/failover";
my $resp = $ua->post(
$failover_url,
'Content-Type' => 'application/json',
Content => encode_json( { candidate => $new_leader } ),
);
diag( "Failover response: " . $resp->status_line );
diag( "Failover body: " . $resp->decoded_content ) if !$resp->is_success;
return $resp->is_success;
}
# Wait for all replicas to be running
sub wait_for_replicas {
my $max_attempts = shift || 60;
for my $i ( 1 .. $max_attempts ) {
my $info = get_cluster_info();
( run in 1.072 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )