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 )