2121package controller
2222
2323import (
24+ "bytes"
2425 "encoding/json"
2526 "errors"
2627 "fmt"
@@ -38,12 +39,14 @@ import (
3839 "github.com/m3db/m3db-operator/pkg/m3admin/namespace"
3940 "github.com/m3db/m3db-operator/pkg/util/eventer"
4041
42+ "github.com/m3db/m3/src/cluster/generated/proto/placementpb"
4143 "github.com/m3db/m3/src/cluster/placement"
4244 dbns "github.com/m3db/m3/src/dbnode/generated/proto/namespace"
4345 "github.com/m3db/m3/src/query/generated/proto/admin"
4446
4547 appsv1 "k8s.io/api/apps/v1"
4648 corev1 "k8s.io/api/core/v1"
49+ v1 "k8s.io/api/core/v1"
4750 klabels "k8s.io/apimachinery/pkg/labels"
4851 "k8s.io/apimachinery/pkg/util/runtime"
4952
@@ -306,16 +309,14 @@ func (c *M3DBController) setStatusPlacementCreated(cluster *myspec.M3DBCluster)
306309 return cluster , nil
307310}
308311
309- func (c * M3DBController ) setStatusPodBootstrapping (cluster * myspec.M3DBCluster ,
312+ func (c * M3DBController ) setStatusPodsBootstrapping (cluster * myspec.M3DBCluster ,
310313 status corev1.ConditionStatus ,
311314 reason , message string ) (* myspec.M3DBCluster , error ) {
312-
313- return c .setStatus (cluster , myspec .ClusterConditionPodBootstrapping , status , reason , message )
315+ return c .setStatus (cluster , myspec .ClusterConditionPodsBootstrapping , status , reason , message )
314316}
315317
316318func (c * M3DBController ) setStatus (cluster * myspec.M3DBCluster , condition myspec.ClusterConditionType ,
317319 status corev1.ConditionStatus , reason , message string ) (* myspec.M3DBCluster , error ) {
318-
319320 cond , ok := cluster .Status .GetCondition (condition )
320321 if ! ok {
321322 cond = myspec.ClusterCondition {
@@ -355,43 +356,52 @@ func (c *M3DBController) reconcileBootstrappingStatus(cluster *myspec.M3DBCluste
355356 }
356357 }
357358
358- return c .setStatus (cluster , myspec .ClusterConditionPodBootstrapping , corev1 .ConditionFalse ,
359+ return c .setStatus (cluster , myspec .ClusterConditionPodsBootstrapping , corev1 .ConditionFalse ,
359360 "BootstrapComplete" , "no bootstraps in progress" )
360361}
361362
362- func (c * M3DBController ) addPodToPlacement (cluster * myspec.M3DBCluster , pod * corev1.Pod ) error {
363- c .logger .Info ("found pod not in placement" , zap .String ("pod" , pod .Name ))
364- inst , err := m3db .PlacementInstanceFromPod (cluster , pod , c .podIDProvider )
365- if err != nil {
366- err := fmt .Errorf ("error creating instance for pod %s" , pod .Name )
367- c .logger .Error (err .Error ())
368- return err
363+ func (c * M3DBController ) addPodsToPlacement (cluster * myspec.M3DBCluster , pods []* corev1.Pod ) error {
364+ var (
365+ instances = make ([]* placementpb.Instance , 0 , len (pods ))
366+ reasonBuf = bytes .NewBufferString ("adding pods to placement (" )
367+ loggerFields = make ([]zap.Field , 0 , len (pods ))
368+ )
369+ for _ , pod := range pods {
370+ c .logger .Info ("found pod not in placement" , zap .String ("pod" , pod .Name ))
371+ inst , err := m3db .PlacementInstanceFromPod (cluster , pod , c .podIDProvider )
372+ if err != nil {
373+ err := fmt .Errorf ("error creating instance for pod %s" , pod .Name )
374+ c .logger .Error (err .Error ())
375+ return err
376+ }
377+ instances = append (instances , inst )
378+ reasonBuf .WriteString (fmt .Sprintf ("%s," , pod .Name ))
379+ loggerFields = append (loggerFields , zap .String ("pod" , pod .Name ))
369380 }
370-
371- reason := fmt . Sprintf ( "adding pod %s to placement" , pod . Name )
372- _ , err = c .setStatusPodBootstrapping (cluster , corev1 .ConditionTrue , "PodAdded" , reason )
381+ reasonBuf . WriteString ( ")" )
382+ reason := reasonBuf . String ( )
383+ _ , err : = c .setStatusPodsBootstrapping (cluster , corev1 .ConditionTrue , "PodAdded" , reason )
373384 if err != nil {
374- err := fmt .Errorf ("error setting pod bootstrapping status: %v" , err )
385+ err := fmt .Errorf ("error setting pods bootstrapping status: %v" , err )
375386 c .logger .Error (err .Error ())
376387 return err
377388 }
378389
379- err = c .adminClient .placementClientForCluster (cluster ).Add (* inst )
390+ err = c .adminClient .placementClientForCluster (cluster ).Add (instances )
380391 if err != nil {
381- err := fmt .Errorf ("error adding pod to placement : %s" , pod . Name )
392+ err := fmt .Errorf ("error: %s" , reason )
382393 c .logger .Error (err .Error ())
383394 return err
384395 }
385396
386- c .logger .Info ("added pod to placement" , zap . String ( "pod" , pod . Name ) )
397+ c .logger .Info ("added pods to placement" , loggerFields ... )
387398 return nil
388399}
389400
390401func (c * M3DBController ) checkPodsForReplacement (
391402 cluster * myspec.M3DBCluster ,
392403 pods []* corev1.Pod ,
393404 pl placement.Placement ) (string , * corev1.Pod , error ) {
394-
395405 insts := pl .Instances ()
396406 sort .Sort (placement .ByIDAscending (insts ))
397407
@@ -429,7 +439,6 @@ func (c *M3DBController) replacePodInPlacement(
429439 pl placement.Placement ,
430440 leavingInstanceID string ,
431441 newPod * corev1.Pod ) error {
432-
433442 c .logger .Info ("replacing pod in placement" , zap .String ("pod" , leavingInstanceID ))
434443
435444 newInst , err := m3db .PlacementInstanceFromPod (cluster , newPod , c .podIDProvider )
@@ -440,7 +449,7 @@ func (c *M3DBController) replacePodInPlacement(
440449 }
441450
442451 reason := fmt .Sprintf ("replacing %s pod in placement" , newPod .Name )
443- _ , err = c .setStatusPodBootstrapping (cluster , corev1 .ConditionTrue , "PodReplaced" , reason )
452+ _ , err = c .setStatusPodsBootstrapping (cluster , corev1 .ConditionTrue , "PodReplaced" , reason )
444453 if err != nil {
445454 err := fmt .Errorf ("error setting replacement pod bootstrapping status: %v" , err )
446455 c .logger .Error (err .Error ())
@@ -461,7 +470,6 @@ func (c *M3DBController) replacePodInPlacement(
461470// be added to the placement and chooses a pod to expand to the placement.
462471func (c * M3DBController ) expandPlacementForSet (cluster * myspec.M3DBCluster , set * appsv1.StatefulSet ,
463472 group myspec.IsolationGroup , placement placement.Placement ) error {
464-
465473 existInsts := instancesInIsoGroup (placement , group .Name )
466474 if len (existInsts ) >= int (group .NumInstances ) {
467475 c .logger .Warn ("not expanding set, already at desired capacity" ,
@@ -483,6 +491,7 @@ func (c *M3DBController) expandPlacementForSet(cluster *myspec.M3DBCluster, set
483491 return err
484492 }
485493
494+ podsToAdd := make ([]* v1.Pod , 0 , len (pods ))
486495 for _ , pod := range pods {
487496 id , err := c .podIDProvider .Identity (pod , cluster )
488497 if err != nil {
@@ -494,11 +503,14 @@ func (c *M3DBController) expandPlacementForSet(cluster *myspec.M3DBCluster, set
494503 }
495504 _ , ok := placement .Instance (idStr )
496505 if ! ok {
497- return c . addPodToPlacement ( cluster , pod )
506+ podsToAdd = append ( podsToAdd , pod )
498507 }
499508 }
509+ if len (podsToAdd ) == 0 {
510+ return errors .New ("could not find pod absent from placement" )
511+ }
500512
501- return errors . New ( "could not find pod absent from placement" )
513+ return c . addPodsToPlacement ( cluster , podsToAdd )
502514}
503515
504516// shrinkPlacementForSet takes a StatefulSet that needs to be shrunk and
0 commit comments