Apache-Session-Browseable
view release on metacpan or search on metacpan
lib/Apache/Session/Browseable/Store/Patroni.pm view on Meta::CPAN
ssl_opts => \%ssl_opts,
timeout => $args->{PatroniTimeout} || 3,
);
my $res;
foreach my $patroniUrl ( split /[,\s]\s*/,
( $args->{PatroniUrl} || $args->{patroniUrl} ) )
{
my $resp = $ua->get($patroniUrl);
if ( $resp->is_success ) {
my $c = eval { JSON::from_json( $resp->decoded_content ) };
if ( $@ or !$c->{members} or ref( $c->{members} ) ne 'ARRAY' ) {
print STDERR "Bad response from $patroniUrl: "
. $resp->decoded_content . "\n";
next;
}
my @leaders = grep { $_->{role} eq 'leader' } @{ $c->{members} };
# Check for split-brain scenario
if ( @leaders > 1 ) {
my $leadersList =
join( ', ', map { "$_->{host}:$_->{port}" } @leaders );
print STDERR
"Multiple leaders detected (split-brain) from $patroniUrl"
. " - Leaders: $leadersList\n";
next;
}
my ($leader) = @leaders;
unless ($leader) {
print STDERR "No leader found from $patroniUrl: "
. $resp->decoded_content . "\n";
next;
}
# Validate leader has required fields
unless ( defined $leader->{host} && defined $leader->{port} ) {
print STDERR "Leader missing host or port from $patroniUrl: "
. $resp->decoded_content . "\n";
next;
}
# Check leader health state
if ( $leader->{state} && $leader->{state} ne 'running' ) {
print STDERR
"Leader not in running state (state=$leader->{state})"
. " from $patroniUrl\n";
next;
}
( run in 1.690 second using v1.01-cache-2.11-cpan-99c4e6809bf )