in oracle/controllers/instancecontroller/instance_controller_parameters.go [176:258]
func (r *InstanceReconciler) parameterUpdateStateMachine(ctx context.Context, req ctrl.Request, inst v1alpha1.Instance, log logr.Logger) (ctrl.Result, error) {
if !isParameterUpdateStateMachineEntryCondition(&inst) {
return ctrl.Result{}, nil
}
// If the current parameter state is equal to the requested state skip the update
if eq := reflect.DeepEqual(inst.Spec.Parameters, inst.Status.CurrentParameters); eq {
return ctrl.Result{}, nil
}
// If the last failed parameter update is equal to the requested state skip it.
if eq := reflect.DeepEqual(inst.Spec.Parameters, inst.Status.LastFailedParameterUpdate); eq {
return ctrl.Result{}, nil
}
if result, err := r.sanityCheckTimeRange(inst, log); err != nil {
return result, err
}
log.Info("parameterUpdateStateMachine: Entered state machine")
instanceReadyCond := k8s.FindCondition(inst.Status.Conditions, k8s.Ready)
switch instanceReadyCond.Reason {
case k8s.CreateComplete:
inst.Status.CurrentActiveStateMachine = controllers.ParameterUpdateStateMachine
_, dynamicParamsRollbackState, err := fetchCurrentParameterState(ctx, r, r.DatabaseClientFactory, inst)
if err != nil {
msg := "parameterUpdateStateMachine: Sanity check failed for instance parameters"
r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateRollbackInProgress, fmt.Sprintf("%s: %v", msg, err), log)
return ctrl.Result{Requeue: true}, err
}
inst.Status.CurrentParameters = dynamicParamsRollbackState
msg := "parameterUpdateStateMachine: parameter update in progress"
r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateInProgress, msg, log)
log.Info("parameterUpdateStateMachine: SM CreateComplete -> ParameterUpdateInProgress")
case k8s.ParameterUpdateInProgress:
restartRequired, err := r.setParameters(ctx, inst, log)
if err != nil {
msg := "parameterUpdateStateMachine: Error while setting instance parameters"
r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateRollbackInProgress, fmt.Sprintf("%s: %v", msg, err), log)
log.Info("parameterUpdateStateMachine: SM ParameterUpdateInProgress -> ParameterUpdateRollbackInProgress")
return ctrl.Result{Requeue: true}, nil
}
if restartRequired {
log.Info("parameterUpdateStateMachine: static parameter specified in config, scheduling restart to activate them")
if err := controllers.BounceDatabase(ctx, r, r.DatabaseClientFactory, inst.Namespace, inst.Name, controllers.BounceDatabaseRequest{
Sid: inst.Spec.CDBName,
}); err != nil {
msg := "parameterUpdateStateMachine: error while restarting database after setting static parameters"
r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateRollbackInProgress, fmt.Sprintf("%s: %v", msg, err), log)
log.Info("parameterUpdateStateMachine: SM ParameterUpdateInProgress -> ParameterUpdateRollbackInProgress")
return ctrl.Result{Requeue: true}, nil
}
}
r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionFalse, k8s.ParameterUpdateComplete, "", log)
log.Info("parameterUpdateStateMachine: SM ParameterUpdateInProgress -> ParameterUpdateComplete")
return ctrl.Result{Requeue: true}, nil
case k8s.ParameterUpdateComplete:
inst.Status.CurrentParameters = inst.Spec.Parameters
msg := "parameterUpdateStateMachine: Parameter update successful"
r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionTrue, k8s.CreateComplete, msg, log)
inst.Status.CurrentActiveStateMachine = ""
log.Info("parameterUpdateStateMachine: SM ParameterUpdateComplete -> CreateComplete")
return ctrl.Result{}, nil
case k8s.ParameterUpdateRollbackInProgress:
if err := r.initiateRecovery(ctx, inst, inst.Status.CurrentParameters, log); err != nil {
log.Info("parameterUpdateStateMachine: recovery failed, instance currently in irrecoverable state", "err", err)
return ctrl.Result{}, err
}
inst.Status.LastFailedParameterUpdate = inst.Spec.Parameters
msg := "parameterUpdateStateMachine: instance recovered after bad parameter update"
r.recordEventAndUpdateStatus(ctx, &inst, v1.ConditionTrue, k8s.CreateComplete, msg, log)
inst.Status.CurrentActiveStateMachine = ""
log.Info("parameterUpdateStateMachine: SM ParameterUpdateRollbackInProgress -> CreateComplete")
return ctrl.Result{}, nil
}
return ctrl.Result{}, nil
}