From 7922e086e97de7676bff0fe8ef74e9beb2aeb64a Mon Sep 17 00:00:00 2001 From: Andrii Dema Date: Tue, 16 Dec 2025 12:26:29 +0200 Subject: [PATCH 1/2] K8SPSMDB-1429: improve cluster status https://perconadev.atlassian.net/browse/K8SPSMDB-1429 --- pkg/controller/perconaservermongodb/mgo.go | 83 ++++++++++++---------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/pkg/controller/perconaservermongodb/mgo.go b/pkg/controller/perconaservermongodb/mgo.go index 9905c4d4dd..54b7b17c90 100644 --- a/pkg/controller/perconaservermongodb/mgo.go +++ b/pkg/controller/perconaservermongodb/mgo.go @@ -17,6 +17,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/ptr" logf "sigs.k8s.io/controller-runtime/pkg/log" api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" @@ -177,58 +178,62 @@ func (r *ReconcilePerconaServerMongoDB) reconcileCluster(ctx context.Context, cr } if cr.Spec.Sharding.Enabled && + cr.Spec.Sharding.Mongos.Size > 0 && !rstRunning && - cr.Status.Replsets[replset.Name].Initialized && - cr.Status.Replsets[replset.Name].Status == api.AppStateReady && - cr.Status.Mongos != nil && - cr.Status.Mongos.Status == api.AppStateReady && - replset.ClusterRole == api.ClusterRoleShardSvr && - len(mongosPods) > 0 && cr.Spec.Sharding.Mongos.Size > 0 { - - mongosSession, err := r.mongosClientWithRole(ctx, cr, api.RoleClusterAdmin) - if err != nil { - return api.AppStateError, nil, errors.Wrap(err, "failed to get mongos connection") - } + replset.ClusterRole == api.ClusterRoleShardSvr { + + rsStatus := cr.Status.Replsets[replset.Name] - defer func() { - err := mongosSession.Disconnect(ctx) + if len(mongosPods) > 0 && + rsStatus.Initialized && + rsStatus.Status == api.AppStateReady && + cr.Status.Mongos != nil && + cr.Status.Mongos.Status == api.AppStateReady { + + mongosSession, err := r.mongosClientWithRole(ctx, cr, api.RoleClusterAdmin) if err != nil { - log.Error(err, "failed to close mongos connection") + return api.AppStateError, nil, errors.Wrap(err, "failed to get mongos connection") } - }() - err = mongosSession.SetDefaultRWConcern(ctx, mongo.DefaultReadConcern, mongo.DefaultWriteConcern) - // SetDefaultRWConcern introduced in MongoDB 4.4 - if err != nil && !strings.Contains(err.Error(), "CommandNotFound") { - return api.AppStateError, nil, errors.Wrap(err, "set default RW concern") - } + defer func() { + err := mongosSession.Disconnect(ctx) + if err != nil { + log.Error(err, "failed to close mongos connection") + } + }() - rsName := replset.Name - name, err := replset.CustomReplsetName() - if err == nil { - rsName = name - } + err = mongosSession.SetDefaultRWConcern(ctx, mongo.DefaultReadConcern, mongo.DefaultWriteConcern) + // SetDefaultRWConcern introduced in MongoDB 4.4 + if err != nil && !strings.Contains(err.Error(), "CommandNotFound") { + return api.AppStateError, nil, errors.Wrap(err, "set default RW concern") + } - in, err := inShard(ctx, mongosSession, rsName) - if err != nil { - return api.AppStateError, nil, errors.Wrap(err, "get shard") - } + rsName := replset.Name + name, err := replset.CustomReplsetName() + if err == nil { + rsName = name + } - if !in { - log.Info("adding rs to shard", "rs", rsName) - err := r.handleRsAddToShard(ctx, cr, replset, pods.Items[0], mongosPods[0]) + in, err := inShard(ctx, mongosSession, rsName) if err != nil { - return api.AppStateError, nil, errors.Wrap(err, "add shard") + return api.AppStateError, nil, errors.Wrap(err, "get shard") } - log.Info("added to shard", "rs", rsName) - } + if !in { + log.Info("adding rs to shard", "rs", rsName) + err := r.handleRsAddToShard(ctx, cr, replset, pods.Items[0], mongosPods[0]) + if err != nil { + return api.AppStateError, nil, errors.Wrap(err, "add shard") + } - rs := cr.Status.Replsets[replset.Name] - t := true - rs.AddedAsShard = &t - cr.Status.Replsets[replset.Name] = rs + log.Info("added to shard", "rs", rsName) + } + rsStatus.AddedAsShard = ptr.To(true) + cr.Status.Replsets[replset.Name] = rsStatus + } else { + return api.AppStateInit, nil, errors.Wrap(err, "failed to check running restore") + } } if replset.Arbiter.Enabled && !cr.Spec.Sharding.Enabled { From acf1043874094d43377c0bd78d02221fc55ee03f Mon Sep 17 00:00:00 2001 From: Andrii Dema Date: Tue, 16 Dec 2025 12:56:55 +0200 Subject: [PATCH 2/2] small fix --- pkg/controller/perconaservermongodb/mgo.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/perconaservermongodb/mgo.go b/pkg/controller/perconaservermongodb/mgo.go index 54b7b17c90..e9c5d032b3 100644 --- a/pkg/controller/perconaservermongodb/mgo.go +++ b/pkg/controller/perconaservermongodb/mgo.go @@ -232,7 +232,7 @@ func (r *ReconcilePerconaServerMongoDB) reconcileCluster(ctx context.Context, cr rsStatus.AddedAsShard = ptr.To(true) cr.Status.Replsets[replset.Name] = rsStatus } else { - return api.AppStateInit, nil, errors.Wrap(err, "failed to check running restore") + return api.AppStateInit, nil, nil } }