in pkg/controllers/controller.go [485:552]
func (c *Controller) syncHandler(ctx context.Context, key string) (result syncResult) {
klog.Infof("Sync handler: %s", key)
// Convert the namespace/name string into a distinct namespace and name
namespace, name, err := cache.SplitMetaNamespaceKey(key)
if err != nil {
utilruntime.HandleError(fmt.Errorf("invalid resource key: %s", key))
// no need to retry as this is a permanent error
return finishProcessing()
}
// Get the NdbCluster resource with this namespace/name
ndbOrg, err := c.ndbsLister.NdbClusters(namespace).Get(name)
if err != nil {
if apierrors.IsNotFound(err) {
// Stop processing if the NdbCluster resource no longer exists
klog.Infof("NdbCluster resource %q does not exist anymore", key)
return finishProcessing()
}
klog.Infof("Failed to retrieve NdbCluster resource %q", key)
return errorWhileProcessing(err)
}
// Create a syncContext with a DeepCopied NdbCluster resource
// to prevent the sync method from accidentally mutating the
// cache object.
nc := ndbOrg.DeepCopy()
syncContext := c.newSyncContext(nc)
// Run sync.
if result = syncContext.sync(ctx); result.getError() != nil {
// The sync step returned an error - no need to update status yet
return result
}
// Update the status of the NdbCluster resource
statusUpdated, err := syncContext.updateNdbClusterStatus(ctx)
if err != nil {
// Status needs to be updated, but it failed.
// Do not record events yet.
// TODO: Ensure that the sync doesn't get stuck
return result
}
// No error returned by updateNdbClusterStatus.
// Check status and record events if necessary.
if nc.Status.ProcessedGeneration == nc.Generation {
// The latest generation of the NdbCluster has been processed
// and the MySQL Cluster is up-to-date.
if statusUpdated {
// The status was updated in this loop implying that this
// sync loop marks the end of the reconciliation of
// MySQL Cluster configuration with the latest spec.
// Record a SyncSuccess event to notify the same.
syncContext.recorder.Eventf(nc, nil,
corev1.EventTypeNormal, ReasonSyncSuccess, ActionSynced, MessageSyncSuccess)
} else {
// No status update this loop => the MySQL Cluster
// was already in sync with the latest NdbCluster spec.
// Record an InSync event
syncContext.recorder.Eventf(nc, nil,
corev1.EventTypeNormal, ReasonInSync, ActionNone, MessageInSync)
}
}
return result
}