Skip to content

Commit 7d77e0f

Browse files
authored
resourcemanager: add settings-only apply path (#10234)
ref #9737 resourcemanager: add settings-only apply path Signed-off-by: okjiang <819421878@qq.com>
1 parent db92c5b commit 7d77e0f

File tree

3 files changed

+70
-7
lines changed

3 files changed

+70
-7
lines changed

pkg/mcs/resourcemanager/server/resource_group.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,18 @@ func (rg *ResourceGroup) overrideFillRateAndBurstLimit(fillRate float64, burstLi
204204
func (rg *ResourceGroup) PatchSettings(metaGroup *rmpb.ResourceGroup) error {
205205
rg.Lock()
206206
defer rg.Unlock()
207+
return rg.patchSettingsLocked(metaGroup, true)
208+
}
207209

210+
// ApplySettings applies the resource group settings only.
211+
// It does not patch token delta.
212+
func (rg *ResourceGroup) ApplySettings(metaGroup *rmpb.ResourceGroup) error {
213+
rg.Lock()
214+
defer rg.Unlock()
215+
return rg.patchSettingsLocked(metaGroup, false)
216+
}
217+
218+
func (rg *ResourceGroup) patchSettingsLocked(metaGroup *rmpb.ResourceGroup, patchTokens bool) error {
208219
if metaGroup.GetMode() != rg.Mode {
209220
return errors.New("only support reconfigure in same mode, maybe you should delete and create a new one")
210221
}
@@ -220,7 +231,11 @@ func (rg *ResourceGroup) PatchSettings(metaGroup *rmpb.ResourceGroup) error {
220231
if settings == nil {
221232
return errors.New("invalid resource group settings, RU mode should set RU settings")
222233
}
223-
rg.RUSettings.RU.patch(settings.GetRU())
234+
if patchTokens {
235+
rg.RUSettings.RU.patch(settings.GetRU())
236+
} else {
237+
rg.RUSettings.RU.applySettings(settings.GetRU())
238+
}
224239
case rmpb.GroupMode_RawMode:
225240
panic("no implementation")
226241
}

pkg/mcs/resourcemanager/server/resource_group_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,41 @@ func TestClone(t *testing.T) {
6060
require.Equal(t, &rg, rgClone)
6161
}
6262
}
63+
64+
func TestApplySettingsWithoutTokenPatch(t *testing.T) {
65+
re := require.New(t)
66+
rg := &ResourceGroup{
67+
Name: testResourceGroupName,
68+
Mode: rmpb.GroupMode_RUMode,
69+
RUSettings: &RequestUnitSettings{
70+
RU: &GroupTokenBucket{
71+
Settings: &rmpb.TokenLimitSettings{
72+
FillRate: 100,
73+
BurstLimit: 200,
74+
},
75+
GroupTokenBucketState: GroupTokenBucketState{
76+
Tokens: 123.0,
77+
overrideFillRate: -1,
78+
overrideBurstLimit: -1,
79+
},
80+
},
81+
},
82+
}
83+
patch := &rmpb.ResourceGroup{
84+
Name: testResourceGroupName,
85+
Mode: rmpb.GroupMode_RUMode,
86+
RUSettings: &rmpb.GroupRequestUnitSettings{
87+
RU: &rmpb.TokenBucket{
88+
Settings: &rmpb.TokenLimitSettings{
89+
FillRate: 500,
90+
BurstLimit: 800,
91+
},
92+
Tokens: 999.0,
93+
},
94+
},
95+
}
96+
re.NoError(rg.ApplySettings(patch))
97+
re.Equal(float64(500), rg.getFillRate())
98+
re.Equal(int64(800), rg.getBurstLimit())
99+
re.Equal(123.0, rg.getRUToken())
100+
}

pkg/mcs/resourcemanager/server/token_buckets.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -407,11 +407,12 @@ func (gtb *GroupTokenBucket) getFillRateAndBurstLimit() (fillRate uint64, burstL
407407

408408
// NewGroupTokenBucket returns a new GroupTokenBucket
409409
func NewGroupTokenBucket(resourceGroupName string, tokenBucket *rmpb.TokenBucket) *GroupTokenBucket {
410-
if tokenBucket == nil || tokenBucket.Settings == nil {
410+
if tokenBucket == nil || tokenBucket.GetSettings() == nil {
411411
return &GroupTokenBucket{}
412412
}
413+
settings := proto.Clone(tokenBucket.GetSettings()).(*rmpb.TokenLimitSettings)
413414
return &GroupTokenBucket{
414-
Settings: tokenBucket.GetSettings(),
415+
Settings: settings,
415416
GroupTokenBucketState: GroupTokenBucketState{
416417
Tokens: tokenBucket.GetTokens(),
417418
resourceGroupName: resourceGroupName,
@@ -438,15 +439,24 @@ func (gtb *GroupTokenBucket) patch(tb *rmpb.TokenBucket) {
438439
if tb == nil {
439440
return
440441
}
441-
if setting := proto.Clone(tb.GetSettings()).(*rmpb.TokenLimitSettings); setting != nil {
442-
gtb.Settings = setting
443-
gtb.settingChanged = true
444-
}
442+
gtb.applySettings(tb)
445443

446444
// The settings in token is delta of the last update and now.
447445
gtb.Tokens += tb.GetTokens()
448446
}
449447

448+
// applySettings applies the token bucket settings only without patching token delta.
449+
func (gtb *GroupTokenBucket) applySettings(tb *rmpb.TokenBucket) {
450+
if tb == nil {
451+
return
452+
}
453+
if settings := tb.GetSettings(); settings != nil {
454+
setting := proto.Clone(settings).(*rmpb.TokenLimitSettings)
455+
gtb.Settings = setting
456+
gtb.settingChanged = true
457+
}
458+
}
459+
450460
// init initializes the group token bucket.
451461
func (gtb *GroupTokenBucket) init(now time.Time) {
452462
if gtb.getFillRate() == 0 {

0 commit comments

Comments
 (0)