DBD-Patroni

 view release on metacpan or  search on metacpan

t/03-failover.t  view on Meta::CPAN

}

# 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();
        next unless $info;

        # Count nodes that are running or streaming (replicas in sync)
        my @ready =
          grep { $_->{state} eq 'running' || $_->{state} eq 'streaming' }
          @{ $info->{members} };

        if ( @ready >= 3 ) {
            diag("All 3 nodes are ready");
            return 1;
        }

        # Show all states for debugging
        my $states =
          join( ", ", map { "$_->{name}:$_->{state}" } @{ $info->{members} } );

t/03-failover.t  view on Meta::CPAN


    # Get cluster state and trigger failover
    my $info       = get_cluster_info();
    my $old_leader = $info->{leader}{host};
    diag("Current leader before cached failover: $old_leader");

    my @replicas = @{ $info->{replicas} };
    skip "Need at least one replica for cached failover test", 4
      unless @replicas;

    # Find a replica that is ready (running or streaming)
    my ($ready_replica) =
      grep { $_->{state} eq 'running' || $_->{state} eq 'streaming' } @replicas;

    skip "No ready replica for failover", 4 unless $ready_replica;

    my $new_leader = $ready_replica->{name};
    diag("Triggering failover to: $new_leader");

    my $failover_ok = trigger_failover($new_leader);
    ok( $failover_ok, 'Failover triggered for cached test' );

    # Wait for failover

t/03-failover.t  view on Meta::CPAN

    $dbh->disconnect;
};

# Test 6: Verify cluster state (informational - cluster may still be recovering)
subtest 'Verify cluster state after tests' => sub {
    my $info = get_cluster_info();

    ok( $info,           'Cluster is accessible' );
    ok( $info->{leader}, 'Cluster has a leader' );

    # Count running or streaming nodes
    my $ready = grep { $_->{state} eq 'running' || $_->{state} eq 'streaming' }
      @{ $info->{members} };

    diag("Final cluster state:");
    diag( "  Leader: " . $info->{leader}{host} );
    diag("  Ready members: $ready");
    for my $m ( @{ $info->{members} } ) {
        diag("    $m->{name}: $m->{state}");
    }

    # After failover, some nodes may still be recovering - just check we have a leader



( run in 0.473 second using v1.01-cache-2.11-cpan-140bd7fdf52 )