From 549e8cfb5829e7b72c6202d5831348b241042ee0 Mon Sep 17 00:00:00 2001 From: Andrii Dema Date: Thu, 18 Dec 2025 16:58:39 +0200 Subject: [PATCH 1/2] K8SPSMDB-1541: fix PSA https://perconadev.atlassian.net/browse/K8SPSMDB-1541 --- pkg/controller/perconaservermongodb/mgo.go | 8 +------- pkg/psmdb/mongo/mongo.go | 3 +-- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/pkg/controller/perconaservermongodb/mgo.go b/pkg/controller/perconaservermongodb/mgo.go index 9905c4d4dd..829c5d930b 100644 --- a/pkg/controller/perconaservermongodb/mgo.go +++ b/pkg/controller/perconaservermongodb/mgo.go @@ -371,14 +371,8 @@ func (r *ReconcilePerconaServerMongoDB) getConfigMemberForExternalNode(id int, e func (r *ReconcilePerconaServerMongoDB) updateConfigMembers(ctx context.Context, cli mongo.Client, cr *api.PerconaServerMongoDB, rs *api.ReplsetSpec) (map[string]api.ReplsetMemberStatus, int, error) { log := logf.FromContext(ctx) // Primary with a Secondary and an Arbiter (PSA) - unsafePSA := false rsMembers := make(map[string]api.ReplsetMemberStatus) - - if cr.CompareVersion("1.15.0") <= 0 { - unsafePSA = cr.Spec.UnsafeConf && rs.Arbiter.Enabled && rs.Arbiter.Size == 1 && !rs.NonVoting.Enabled && rs.Size == 2 - } else { - unsafePSA = cr.Spec.Unsafe.ReplsetSize && rs.Arbiter.Enabled && rs.Arbiter.Size == 1 && !rs.NonVoting.Enabled && rs.Size == 2 - } + unsafePSA := cr.Spec.Unsafe.ReplsetSize && rs.Arbiter.Enabled && rs.Arbiter.Size == 1 && !rs.NonVoting.Enabled && rs.Size == 2 pods, err := psmdb.GetRSPods(ctx, r.client, cr, rs.Name) if err != nil { diff --git a/pkg/psmdb/mongo/mongo.go b/pkg/psmdb/mongo/mongo.go index f524b8b34e..5c8ee1e048 100644 --- a/pkg/psmdb/mongo/mongo.go +++ b/pkg/psmdb/mongo/mongo.go @@ -260,7 +260,6 @@ func (client *mongoClient) UpdateRole(ctx context.Context, db string, role Role) } return nil - } func (client *mongoClient) GetRole(ctx context.Context, db, role string) (*Role, error) { @@ -990,7 +989,7 @@ func (m *ConfigMembers) SetVotes(compareWith ConfigMembers, unsafePSA bool) { return } - if votes%2 == 0 { + if votes%2 == 0 && !unsafePSA { for j := lastVoteIdx; j >= 0; j-- { if []ConfigMember(*m)[j].Votes == 0 { continue From ced256226a700e1494bb072f99d59c5b197eb4ce Mon Sep 17 00:00:00 2001 From: Andrii Dema Date: Thu, 18 Dec 2025 17:14:50 +0200 Subject: [PATCH 2/2] add unit_test case --- pkg/psmdb/mongo/mongo_test.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/pkg/psmdb/mongo/mongo_test.go b/pkg/psmdb/mongo/mongo_test.go index b485fc8f3c..0495b5c1c3 100644 --- a/pkg/psmdb/mongo/mongo_test.go +++ b/pkg/psmdb/mongo/mongo_test.go @@ -209,6 +209,32 @@ func TestVoting(t *testing.T) { }, true, }, + { + "2 members (unsafe PSA start): 2 rs0 without arbiter", + &mongo.ConfigMembers{ + mongo.ConfigMember{ + Host: "host0", + Votes: mongo.DefaultVotes, + Priority: mongo.DefaultPriority, + }, + mongo.ConfigMember{ + Host: "host1", + Votes: mongo.DefaultVotes, + Priority: mongo.DefaultPriority, + }, + }, + &mongo.ConfigMembers{ + mongo.ConfigMember{ + Votes: mongo.DefaultVotes, + Priority: mongo.DefaultPriority, + }, + mongo.ConfigMember{ + Votes: mongo.DefaultVotes, + Priority: mongo.DefaultPriority, + }, + }, + true, + }, { "4 members: 4 rs0", &mongo.ConfigMembers{ @@ -1297,7 +1323,7 @@ func TestVoting(t *testing.T) { } assert.Falsef(t, votes > mongo.MaxVotingMembers, "there should be max (%d) votes in replset", mongo.MaxVotingMembers) - if votes != 0 { + if votes != 0 && !c.unsafePSA { assert.Falsef(t, votes%2 == 0, "total votes (%d) should be an odd number", votes) } })