@@ -45,9 +45,10 @@ func createRotateServerStoragePlan(ctx context.Context,
4545 return nil
4646 }
4747 var plan api.Plan
48+ var canContinue = true
4849 status .Members .ForeachServerGroup (func (group api.ServerGroup , members api.MemberStatusList ) error {
4950 for _ , m := range members {
50- if ! plan .IsEmpty () {
51+ if ! plan .IsEmpty () && ! canContinue {
5152 // Only 1 change at a time
5253 continue
5354 }
@@ -73,21 +74,17 @@ func createRotateServerStoragePlan(ctx context.Context,
7374 }
7475
7576 if util .StringOrDefault (pvc .Spec .StorageClassName ) != storageClassName && storageClassName != "" {
77+ // Do not append more than 1 operation if we replace storageClass
78+ canContinue = false
79+
7680 // Storageclass has changed
7781 log .Info ().Str ("pod-name" , m .PodName ).
7882 Str ("pvc-storage-class" , util .StringOrDefault (pvc .Spec .StorageClassName )).
7983 Str ("group-storage-class" , storageClassName ).Msg ("Storage class has changed - pod needs replacement" )
8084
8185 if group == api .ServerGroupDBServers {
8286 plan = append (plan ,
83- api .NewAction (api .ActionTypeDisableClusterScaling , group , "" ),
84- api .NewAction (api .ActionTypeAddMember , group , "" ),
85- api .NewAction (api .ActionTypeWaitForMemberUp , group , api .MemberIDPreviousAction ),
86- api .NewAction (api .ActionTypeCleanOutMember , group , m .ID ),
87- api .NewAction (api .ActionTypeShutdownMember , group , m .ID ),
88- api .NewAction (api .ActionTypeRemoveMember , group , m .ID ),
89- api .NewAction (api .ActionTypeEnableClusterScaling , group , "" ),
90- )
87+ api .NewAction (api .ActionTypeMarkToRemoveMember , group , m .ID ))
9188 } else if group == api .ServerGroupAgents {
9289 plan = append (plan ,
9390 api .NewAction (api .ActionTypeShutdownMember , group , m .ID ),
@@ -100,25 +97,30 @@ func createRotateServerStoragePlan(ctx context.Context,
10097 context .CreateEvent (k8sutil .NewCannotChangeStorageClassEvent (apiObject , m .ID , group .AsRole (), "Not supported" ))
10198 }
10299 } else {
100+ var res core.ResourceList
103101 if groupSpec .HasVolumeClaimTemplate () {
104- res := groupSpec .GetVolumeClaimTemplate ().Spec .Resources .Requests
105- // For pvc only resources.requests is mutable
106- if comparePVCResourceList (pvc .Spec .Resources .Requests , res ) {
107- plan = append (plan , pvcResizePlan (log , group , groupSpec , m .ID )... )
108- }
102+ res = groupSpec .GetVolumeClaimTemplate ().Spec .Resources .Requests
109103 } else {
110- if requestedSize , ok := groupSpec .Resources .Requests [core .ResourceStorage ]; ok {
111- if volumeSize , ok := pvc .Spec .Resources .Requests [core .ResourceStorage ]; ok {
112- cmp := volumeSize .Cmp (requestedSize )
113- if cmp < 0 {
114- plan = append (plan , pvcResizePlan (log , group , groupSpec , m .ID )... )
115- } else if cmp > 0 {
116- if groupSpec .GetVolumeAllowShrink () && group == api .ServerGroupDBServers {
117- plan = append (plan , api .NewAction (api .ActionTypeMarkToRemoveMember , group , m .ID ))
118- } else {
119- log .Error ().Str ("server-group" , group .AsRole ()).Str ("pvc-storage-size" , volumeSize .String ()).Str ("requested-size" , requestedSize .String ()).
120- Msg ("Volume size should not shrink" )
121- }
104+ res = groupSpec .Resources .Requests
105+ }
106+ if requestedSize , ok := res [core .ResourceStorage ]; ok {
107+ if volumeSize , ok := pvc .Spec .Resources .Requests [core .ResourceStorage ]; ok {
108+ cmp := volumeSize .Cmp (requestedSize )
109+ if cmp < 0 {
110+ if groupSpec .VolumeResizeMode .Get () == api .PVCResizeModeRotate {
111+ // Do not append more than 1 operation if we hard restart member
112+ canContinue = false
113+ }
114+ plan = append (plan , pvcResizePlan (log , group , groupSpec , m .ID )... )
115+ } else if cmp > 0 {
116+ // Do not append more than 1 operation if we schrink volume
117+ canContinue = false
118+
119+ if groupSpec .GetVolumeAllowShrink () && group == api .ServerGroupDBServers && ! m .Conditions .IsTrue (api .ConditionTypeMarkedToRemove ) {
120+ plan = append (plan , api .NewAction (api .ActionTypeMarkToRemoveMember , group , m .ID ))
121+ } else {
122+ log .Error ().Str ("server-group" , group .AsRole ()).Str ("pvc-storage-size" , volumeSize .String ()).Str ("requested-size" , requestedSize .String ()).
123+ Msg ("Volume size should not shrink" )
122124 }
123125 }
124126 }
@@ -153,21 +155,3 @@ func pvcResizePlan(log zerolog.Logger, group api.ServerGroup, groupSpec api.Serv
153155 return nil
154156 }
155157}
156-
157- func comparePVCResourceList (wanted , given core.ResourceList ) bool {
158- for k , v := range wanted {
159- if gv , ok := given [k ]; ! ok {
160- return true
161- } else if v .Cmp (gv ) != 0 {
162- return true
163- }
164- }
165-
166- for k := range given {
167- if _ , ok := wanted [k ]; ! ok {
168- return true
169- }
170- }
171-
172- return false
173- }
0 commit comments