diff --git a/pkg/controller/perconaservermongodb/mgo.go b/pkg/controller/perconaservermongodb/mgo.go index 9905c4d4d..e9c5d032b 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] + + if len(mongosPods) > 0 && + rsStatus.Initialized && + rsStatus.Status == api.AppStateReady && + cr.Status.Mongos != nil && + cr.Status.Mongos.Status == api.AppStateReady { - defer func() { - err := mongosSession.Disconnect(ctx) + 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, nil + } } if replset.Arbiter.Enabled && !cr.Spec.Sharding.Enabled {