Skip to content

Commit

Permalink
feat(v2 volume/configurable cpu mask): sync CPU mask in instanceManag…
Browse files Browse the repository at this point in the history
…er controller

Longhorn 8835

Signed-off-by: Derek Su <[email protected]>
  • Loading branch information
derekbit committed Aug 27, 2024
1 parent 19f23b9 commit 86c83e0
Showing 1 changed file with 48 additions and 3 deletions.
51 changes: 48 additions & 3 deletions controller/instance_manager_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,27 @@ func (imc *InstanceManagerController) syncInstanceStatus(im *longhorn.InstanceMa
return nil
}

func (imc *InstanceManagerController) syncDateEngineCPUMask(im *longhorn.InstanceManager) (bool, error) {
if types.IsDataEngineV1(im.Spec.DataEngine) {
return true, nil
}

if im.Status.CurrentState != longhorn.InstanceManagerStateRunning {
return true, nil
}

if im.Spec.DataEngineSpec.V2.CPUMask != "" {
return im.Spec.DataEngineSpec.V2.CPUMask == im.Status.DataEngineStatus.V2.CPUMask, nil
}

setting, err := imc.ds.GetSettingWithAutoFillingRO(types.SettingNameV2DataEngineCPUMask)
if err != nil {
return true, errors.Wrapf(err, "failed to get %v setting for updating data engine CPU mask", types.SettingNameV2DataEngineCPUMask)
}

return setting.Value == im.Status.DataEngineStatus.V2.CPUMask, nil
}

func (imc *InstanceManagerController) syncLogSettingsToInstanceManagerPod(im *longhorn.InstanceManager) error {
if types.IsDataEngineV1(im.Spec.DataEngine) {
return nil
Expand Down Expand Up @@ -554,12 +575,17 @@ func (imc *InstanceManagerController) handlePod(im *longhorn.InstanceManager) er
log.WithError(err).Warnf("Failed to sync log settings to instance manager pod %v", im.Name)
}

isDataEngineCPUMaskApplied, err := imc.syncDateEngineCPUMask(im)
if err != nil {
log.WithError(err).Warnf("Failed to sync date engine CPU mask to instance manager pod %v", im.Name)
}

isSettingSynced, isPodDeletedOrNotRunning, areInstancesRunningInPod, err := imc.areDangerZoneSettingsSyncedToIMPod(im)
if err != nil {
return err
}

isPodDeletionNotRequired := isSettingSynced || areInstancesRunningInPod || isPodDeletedOrNotRunning
isPodDeletionNotRequired := (isSettingSynced && isDataEngineCPUMaskApplied) || areInstancesRunningInPod || isPodDeletedOrNotRunning
if im.Status.CurrentState != longhorn.InstanceManagerStateError &&
im.Status.CurrentState != longhorn.InstanceManagerStateStopped &&
isPodDeletionNotRequired {
Expand Down Expand Up @@ -1364,9 +1390,28 @@ func (imc *InstanceManagerController) createInstanceManagerPodSpec(im *longhorn.
logFlags = strings.ToLower(logFlagsSetting.Value)
}

cpuMask := im.Spec.DataEngineSpec.V2.CPUMask
if cpuMask == "" {
value, err := imc.ds.GetSettingWithAutoFillingRO(types.SettingNameV2DataEngineCPUMask)
if err != nil {
return nil, err
}

cpuMask = value.Value
}

im.Status.DataEngineStatus.V2.CPUMask = cpuMask

args := []string{
"instance-manager", "--spdk-log", logFlags, "--enable-spdk", "--debug",
"daemon", "--spdk-enabled", "--listen", fmt.Sprintf("0.0.0.0:%d", engineapi.InstanceManagerProcessManagerServiceDefaultPort)}
"instance-manager",
"--spdk-log", logFlags,
"--spdk-cpumask", cpuMask,
"--enable-spdk", "--debug",
"daemon",
"--spdk-enabled",
"--listen", fmt.Sprintf("0.0.0.0:%d", engineapi.InstanceManagerProcessManagerServiceDefaultPort)}

imc.logger.Infof("Creating instance manager pod %v with args %+v", podSpec.Name, args)

podSpec.Spec.Containers[0].Args = args

Expand Down

0 comments on commit 86c83e0

Please sign in to comment.