@@ -90,17 +90,17 @@ func (r *TypesenseClusterReconciler) ReconcileStatefulSet(ctx context.Context, t
9090 r .logger .Error (err , "building statefulset failed" , "sts" , stsObjectKey .Name )
9191 }
9292
93- update , triggers := r .shouldUpdateStatefulSet (sts , desiredSts , ts )
93+ update , scaleOnly , triggers := r .shouldUpdateStatefulSet (sts , desiredSts , ts )
9494 if update {
95- r .logger .V (debugLevel ).Info ("updating statefulset" , "sts" , sts .Name , "triggers" , triggers )
96-
97- oldImage := strings .Replace (sts .Spec .Template .Spec .Containers [0 ].Image , "typesense/typesense:" , "" , - 1 )
98- newImage := strings .Replace (desiredSts .Spec .Template .Spec .Containers [0 ].Image , "typesense/typesense:" , "" , - 1 )
95+ oldImage := getImageTag (sts .Spec .Template .Spec .Containers [0 ].Image )
96+ newImage := getImageTag (desiredSts .Spec .Template .Spec .Containers [0 ].Image )
9997 if oldImage != newImage {
100- r . logger . V ( debugLevel ). Info ( "scheduling typesense update" , "current" , oldImage , "target" , newImage )
98+ triggers = append ( triggers , SpecTypesenseVersionChanged )
10199 r .Recorder .Eventf (ts , "Normal" , "TypesenseVersionUpdate" , "Scheduled update from %s to %s" , oldImage , newImage )
102100 }
103101
102+ r .logger .V (debugLevel ).Info ("updating statefulset" , "sts" , sts .Name , "triggers" , triggers )
103+
104104 updatedSts , err := r .updateStatefulSet (ctx , sts , desiredSts )
105105 if err != nil {
106106 r .logger .Error (err , "updating statefulset failed" , "sts" , stsObjectKey .Name )
@@ -126,6 +126,33 @@ func (r *TypesenseClusterReconciler) ReconcileStatefulSet(ctx context.Context, t
126126
127127 r .logLagThresholds (updatedSts )
128128 return updatedSts , nil
129+ } else if ! update && scaleOnly {
130+ r .logger .V (debugLevel ).Info ("scaling statefulset" , "sts" , sts .Name , "triggers" , triggers )
131+
132+ size := ts .Spec .Replicas
133+ err = r .ScaleStatefulSet (ctx , stsObjectKey , size )
134+ if err != nil {
135+ return desiredSts , nil
136+ }
137+
138+ configMapName := fmt .Sprintf (ClusterNodesConfigMap , ts .Name )
139+ configMapObjectKey := client.ObjectKey {Namespace : ts .Namespace , Name : configMapName }
140+
141+ var cm = & corev1.ConfigMap {}
142+ if err := r .Get (ctx , configMapObjectKey , cm ); err != nil {
143+ r .logger .V (debugLevel ).Error (err , fmt .Sprintf ("unable to fetch config map: %s" , configMapName ))
144+ }
145+ _ , _ , updated , err := r .updateConfigMap (ctx , ts , cm , & size , true )
146+ if err != nil {
147+ return desiredSts , nil
148+ }
149+
150+ if updated && ts .Spec .ForceResetPeersConfigOnUpdate {
151+ _ = r .forcePodsConfigMapUpdate (ctx , ts )
152+ }
153+
154+ r .logLagThresholds (desiredSts )
155+ return desiredSts , nil
129156 }
130157 }
131158 }
@@ -520,33 +547,35 @@ func (r *TypesenseClusterReconciler) buildStatefulSet(ctx context.Context, key c
520547type UpdateStatefulSetTrigger string
521548
522549var (
523- BelowSpecReplicas UpdateStatefulSetTrigger = "BelowSpecReplicas "
550+ SpecReplicasChanged UpdateStatefulSetTrigger = "SpecReplicasChanged "
524551 HashAnnotationChanged UpdateStatefulSetTrigger = "HashAnnotationChanged"
525552 PodAnnotationsChanged UpdateStatefulSetTrigger = "PodAnnotationsChanged"
526553 StatefulSetAnnotationsChanged UpdateStatefulSetTrigger = "StatefulSetAnnotationsChanged"
527554 SpecResourcesChanged UpdateStatefulSetTrigger = "SpecResourcesChanged"
528555 PodSecurityContextChanged UpdateStatefulSetTrigger = "PodSecurityContextChanged"
529556 InvalidContainerCount UpdateStatefulSetTrigger = "InvalidContainerCount"
530557 ContainerSecurityContextChanged UpdateStatefulSetTrigger = "ContainerSecurityContextChanged"
558+ SpecTypesenseVersionChanged UpdateStatefulSetTrigger = "SpecTypesenseVersionChanged"
531559)
532560
533- func (r * TypesenseClusterReconciler ) shouldUpdateStatefulSet (sts * appsv1.StatefulSet , desired * appsv1.StatefulSet , ts * tsv1alpha1.TypesenseCluster ) (update bool , triggers []UpdateStatefulSetTrigger ) {
561+ func (r * TypesenseClusterReconciler ) shouldUpdateStatefulSet (sts * appsv1.StatefulSet , desired * appsv1.StatefulSet , ts * tsv1alpha1.TypesenseCluster ) (update bool , scaleOnly bool , triggers []UpdateStatefulSetTrigger ) {
534562 update = false
563+ scaleOnly = false
535564
536565 if sts == nil || ts == nil {
537- return false , nil
566+ return false , false , nil
538567 }
539568
540569 condition := r .getConditionReady (ts )
541570 if condition == nil {
542- return false , nil
571+ return false , false , nil
543572 }
544573
545- // BelowSpecReplicas
574+ // SpecReplicasChanged
546575 if * sts .Spec .Replicas != ts .Spec .Replicas &&
547576 (condition .Reason != string (ConditionReasonQuorumDowngraded ) || condition .Reason != string (ConditionReasonQuorumQueuedWrites )) {
548- triggers = append (triggers , BelowSpecReplicas )
549- update = true
577+ triggers = append (triggers , SpecReplicasChanged )
578+ scaleOnly = true
550579 }
551580
552581 // HashAnnotationChanged
@@ -606,7 +635,7 @@ func (r *TypesenseClusterReconciler) shouldUpdateStatefulSet(sts *appsv1.Statefu
606635 update = true
607636 }
608637
609- return update , triggers
638+ return update , scaleOnly , triggers
610639}
611640
612641func (r * TypesenseClusterReconciler ) shouldEmergencyUpdateStatefulSet (sts * appsv1.StatefulSet , ts * tsv1alpha1.TypesenseCluster ) bool {
0 commit comments