in pkg/controllers/mysqld_statefulset_controller.go [140:194]
func (mssc *mysqldStatefulSetController) ReconcileStatefulSet(ctx context.Context, sc *SyncContext) syncResult {
mysqldSfset := sc.mysqldSfset
cs := sc.configSummary
nc := sc.ndb
if mysqldSfset == nil {
// statefulset doesn't exist yet
if cs.NumOfMySQLServers == 0 {
// the current state is in sync with expectation
return continueProcessing()
}
// StatefulSet has to be created
// First ensure that a root password secret exists
secretClient := NewMySQLUserPasswordSecretInterface(mssc.client)
if _, err := secretClient.EnsureMySQLRootPassword(ctx, nc); err != nil {
klog.Errorf("Failed to ensure root password secret for StatefulSet %q : %s",
mssc.ndbNodeStatefulset.GetName(nc), err)
return errorWhileProcessing(err)
}
// create a statefulset
if _, err := mssc.createStatefulSet(ctx, sc); err != nil {
return errorWhileProcessing(err)
}
// StatefulSet was created successfully.
// Finish processing. Reconciliation will
// continue once the statefulset is updated.
return finishProcessing()
}
// At this point the statefulset exists and has already been verified
// to be complete (i.e. no previous updates still being applied) by HandleScaleDown.
// Check if the statefulset has the recent config generation.
if workloadHasConfigGeneration(mysqldSfset, cs.NdbClusterGeneration) {
// Statefulset upto date
klog.Info("All MySQL Servers are up-to-date and ready")
return continueProcessing()
}
// Statefulset has to be patched
// Patch the Governing Service first
if err := sc.serviceController.patchService(ctx, sc, mssc.ndbNodeStatefulset); err != nil {
return errorWhileProcessing(err)
}
// Patch the StatefulSet
updatedStatefulSet, err := mssc.ndbNodeStatefulset.NewStatefulSet(cs, nc)
if err != nil {
return errorWhileProcessing(err)
}
return mssc.patchStatefulSet(ctx, mysqldSfset, updatedStatefulSet)
}