This is an automated email from the ASF dual-hosted git repository.
wilfreds pushed a commit to branch branch-1.4
in repository https://gitbox.apache.org/repos/asf/yunikorn-core.git
The following commit(s) were added to refs/heads/branch-1.4 by this push:
new ea623cd5 [YUNIKORN-2139] Pass split queue path in ugm (#709)
ea623cd5 is described below
commit ea623cd5ec24bb5d75b36f263a3c31c5eec44de8
Author: Manikandan R <[email protected]>
AuthorDate: Mon Nov 13 09:57:43 2023 +1100
[YUNIKORN-2139] Pass split queue path in ugm (#709)
Move queuepath split from user and group trackers to manager. Reduce
number of calls to split the queue path string.
Closes: #709
Signed-off-by: Wilfred Spiegelenburg <[email protected]>
---
pkg/scheduler/ugm/group_tracker.go | 38 ++++++++--------
pkg/scheduler/ugm/group_tracker_test.go | 62 +++++++++++++-------------
pkg/scheduler/ugm/manager.go | 79 ++++++++++++++++++---------------
pkg/scheduler/ugm/user_tracker.go | 39 ++++++++--------
pkg/scheduler/ugm/user_tracker_test.go | 72 +++++++++++++++++-------------
5 files changed, 153 insertions(+), 137 deletions(-)
diff --git a/pkg/scheduler/ugm/group_tracker.go
b/pkg/scheduler/ugm/group_tracker.go
index f1b6272a..6987d5cf 100644
--- a/pkg/scheduler/ugm/group_tracker.go
+++ b/pkg/scheduler/ugm/group_tracker.go
@@ -19,11 +19,9 @@
package ugm
import (
- "strings"
"sync"
"github.com/apache/yunikorn-core/pkg/common"
- "github.com/apache/yunikorn-core/pkg/common/configs"
"github.com/apache/yunikorn-core/pkg/common/resources"
"github.com/apache/yunikorn-core/pkg/webservice/dao"
)
@@ -46,17 +44,17 @@ func newGroupTracker(group string) *GroupTracker {
return groupTracker
}
-func (gt *GroupTracker) increaseTrackedResource(queuePath, applicationID
string, usage *resources.Resource, user string) bool {
+func (gt *GroupTracker) increaseTrackedResource(hierarchy []string,
applicationID string, usage *resources.Resource, user string) bool {
if gt == nil {
return true
}
gt.Lock()
defer gt.Unlock()
gt.applications[applicationID] = user
- return gt.queueTracker.increaseTrackedResource(strings.Split(queuePath,
configs.DOT), applicationID, group, usage)
+ return gt.queueTracker.increaseTrackedResource(hierarchy,
applicationID, group, usage)
}
-func (gt *GroupTracker) decreaseTrackedResource(queuePath, applicationID
string, usage *resources.Resource, removeApp bool) (bool, bool) {
+func (gt *GroupTracker) decreaseTrackedResource(hierarchy []string,
applicationID string, usage *resources.Resource, removeApp bool) (bool, bool) {
if gt == nil {
return false, true
}
@@ -65,7 +63,7 @@ func (gt *GroupTracker) decreaseTrackedResource(queuePath,
applicationID string,
if removeApp {
delete(gt.applications, applicationID)
}
- return gt.queueTracker.decreaseTrackedResource(strings.Split(queuePath,
configs.DOT), applicationID, usage, removeApp)
+ return gt.queueTracker.decreaseTrackedResource(hierarchy,
applicationID, usage, removeApp)
}
func (gt *GroupTracker) getTrackedApplications() map[string]string {
@@ -74,16 +72,16 @@ func (gt *GroupTracker) getTrackedApplications()
map[string]string {
return gt.applications
}
-func (gt *GroupTracker) setLimits(queuePath string, resource
*resources.Resource, maxApps uint64) {
+func (gt *GroupTracker) setLimits(hierarchy []string, resource
*resources.Resource, maxApps uint64) {
gt.Lock()
defer gt.Unlock()
- gt.queueTracker.setLimit(strings.Split(queuePath, configs.DOT),
resource, maxApps)
+ gt.queueTracker.setLimit(hierarchy, resource, maxApps)
}
-func (gt *GroupTracker) headroom(queuePath string) *resources.Resource {
+func (gt *GroupTracker) headroom(hierarchy []string) *resources.Resource {
gt.Lock()
defer gt.Unlock()
- return gt.queueTracker.headroom(strings.Split(queuePath, configs.DOT),
group)
+ return gt.queueTracker.headroom(hierarchy, group)
}
func (gt *GroupTracker) GetGroupResourceUsageDAOInfo()
*dao.GroupResourceUsageDAOInfo {
@@ -100,22 +98,22 @@ func (gt *GroupTracker) GetGroupResourceUsageDAOInfo()
*dao.GroupResourceUsageDA
return groupResourceUsage
}
-func (gt *GroupTracker) IsQueuePathTrackedCompletely(queuePath string) bool {
+func (gt *GroupTracker) IsQueuePathTrackedCompletely(hierarchy []string) bool {
gt.RLock()
defer gt.RUnlock()
- return
gt.queueTracker.IsQueuePathTrackedCompletely(strings.Split(queuePath,
configs.DOT))
+ return gt.queueTracker.IsQueuePathTrackedCompletely(hierarchy)
}
-func (gt *GroupTracker) IsUnlinkRequired(queuePath string) bool {
+func (gt *GroupTracker) IsUnlinkRequired(hierarchy []string) bool {
gt.RLock()
defer gt.RUnlock()
- return gt.queueTracker.IsUnlinkRequired(strings.Split(queuePath,
configs.DOT))
+ return gt.queueTracker.IsUnlinkRequired(hierarchy)
}
-func (gt *GroupTracker) UnlinkQT(queuePath string) bool {
+func (gt *GroupTracker) UnlinkQT(hierarchy []string) bool {
gt.RLock()
defer gt.RUnlock()
- return gt.queueTracker.UnlinkQT(strings.Split(queuePath, configs.DOT))
+ return gt.queueTracker.UnlinkQT(hierarchy)
}
func (gt *GroupTracker) canBeRemoved() bool {
@@ -131,13 +129,13 @@ func (gt *GroupTracker) getName() string {
return gt.groupName
}
-func (gt *GroupTracker) decreaseAllTrackedResourceUsage(queuePath string)
map[string]string {
+func (gt *GroupTracker) decreaseAllTrackedResourceUsage(hierarchy []string)
map[string]string {
if gt == nil {
return nil
}
gt.Lock()
defer gt.Unlock()
- applications :=
gt.queueTracker.decreaseTrackedResourceUsageDownwards(strings.Split(queuePath,
configs.DOT))
+ applications :=
gt.queueTracker.decreaseTrackedResourceUsageDownwards(hierarchy)
removedApplications := make(map[string]string)
for app := range applications {
if u, ok := gt.applications[app]; ok {
@@ -147,8 +145,8 @@ func (gt *GroupTracker)
decreaseAllTrackedResourceUsage(queuePath string) map[st
return removedApplications
}
-func (gt *GroupTracker) canRunApp(queuePath, applicationID string) bool {
+func (gt *GroupTracker) canRunApp(hierarchy []string, applicationID string)
bool {
gt.Lock()
defer gt.Unlock()
- return gt.queueTracker.canRunApp(strings.Split(queuePath, configs.DOT),
applicationID, group)
+ return gt.queueTracker.canRunApp(hierarchy, applicationID, group)
}
diff --git a/pkg/scheduler/ugm/group_tracker_test.go
b/pkg/scheduler/ugm/group_tracker_test.go
index 4a8f3563..c969113a 100644
--- a/pkg/scheduler/ugm/group_tracker_test.go
+++ b/pkg/scheduler/ugm/group_tracker_test.go
@@ -40,36 +40,36 @@ func TestGTIncreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage1)
}
- result := groupTracker.increaseTrackedResource(queuePath1, TestApp1,
usage1, user.User)
+ result := groupTracker.increaseTrackedResource(hierarchy1, TestApp1,
usage1, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath1, TestApp1, usage1)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy1, TestApp1, usage1)
}
usage2, err := resources.NewResourceFromConf(map[string]string{"mem":
"20M", "vcore": "20"})
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage2)
}
- result = groupTracker.increaseTrackedResource(queuePath2, TestApp2,
usage2, user.User)
+ result = groupTracker.increaseTrackedResource(hierarchy2, TestApp2,
usage2, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath2, TestApp2, usage2)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy2, TestApp2, usage2)
}
usage3, err := resources.NewResourceFromConf(map[string]string{"mem":
"30M", "vcore": "30"})
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- result = groupTracker.increaseTrackedResource(queuePath3, TestApp3,
usage3, user.User)
+ result = groupTracker.increaseTrackedResource(hierarchy3, TestApp3,
usage3, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath3, TestApp3, usage3)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy3, TestApp3, usage3)
}
usage4, err := resources.NewResourceFromConf(map[string]string{"mem":
"20M", "vcore": "20"})
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- result = groupTracker.increaseTrackedResource(queuePath4, TestApp4,
usage4, user.User)
+ result = groupTracker.increaseTrackedResource(hierarchy4, TestApp4,
usage4, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath4, TestApp4, usage4)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy4, TestApp4, usage4)
}
actualResources := getGroupResource(groupTracker)
@@ -94,9 +94,9 @@ func TestGTDecreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage1)
}
- result := groupTracker.increaseTrackedResource(queuePath1, TestApp1,
usage1, user.User)
+ result := groupTracker.increaseTrackedResource(hierarchy1, TestApp1,
usage1, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath1, TestApp1, usage1)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy1, TestApp1, usage1)
}
assert.Equal(t, 1, len(groupTracker.getTrackedApplications()))
@@ -104,9 +104,9 @@ func TestGTDecreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage2)
}
- result = groupTracker.increaseTrackedResource(queuePath2, TestApp2,
usage2, user.User)
+ result = groupTracker.increaseTrackedResource(hierarchy2, TestApp2,
usage2, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath2, TestApp2, usage2)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy2, TestApp2, usage2)
}
actualResources := getGroupResource(groupTracker)
@@ -120,15 +120,15 @@ func TestGTDecreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- removeQT, decreased := groupTracker.decreaseTrackedResource(queuePath1,
TestApp1, usage3, false)
+ removeQT, decreased := groupTracker.decreaseTrackedResource(hierarchy1,
TestApp1, usage3, false)
if !decreased {
- t.Fatalf("unable to decrease tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath1, TestApp1, usage3, err)
+ t.Fatalf("unable to decrease tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy1, TestApp1, usage3, err)
}
assert.Equal(t, removeQT, false, "wrong remove queue tracker value")
- removeQT, decreased = groupTracker.decreaseTrackedResource(queuePath2,
TestApp2, usage3, false)
+ removeQT, decreased = groupTracker.decreaseTrackedResource(hierarchy2,
TestApp2, usage3, false)
if !decreased {
- t.Fatalf("unable to decrease tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath2, TestApp2, usage3, err)
+ t.Fatalf("unable to decrease tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy2, TestApp2, usage3, err)
}
assert.Equal(t, removeQT, false, "wrong remove queue tracker value")
@@ -144,9 +144,9 @@ func TestGTDecreaseTrackedResource(t *testing.T) {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- removeQT, decreased = groupTracker.decreaseTrackedResource(queuePath1,
TestApp1, usage4, true)
+ removeQT, decreased = groupTracker.decreaseTrackedResource(hierarchy1,
TestApp1, usage4, true)
if !decreased {
- t.Fatalf("unable to decrease tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath1, TestApp1, usage1, err)
+ t.Fatalf("unable to decrease tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy1, TestApp1, usage1, err)
}
assert.Equal(t, 1, len(groupTracker.getTrackedApplications()))
assert.Equal(t, removeQT, false, "wrong remove queue tracker value")
@@ -156,9 +156,9 @@ func TestGTDecreaseTrackedResource(t *testing.T) {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- removeQT, decreased = groupTracker.decreaseTrackedResource(queuePath2,
TestApp2, usage5, true)
+ removeQT, decreased = groupTracker.decreaseTrackedResource(hierarchy2,
TestApp2, usage5, true)
if !decreased {
- t.Fatalf("unable to decrease tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath2, TestApp2, usage2, err)
+ t.Fatalf("unable to decrease tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy2, TestApp2, usage2, err)
}
assert.Equal(t, 0, len(groupTracker.getTrackedApplications()))
assert.Equal(t, removeQT, true, "wrong remove queue tracker value")
@@ -167,6 +167,8 @@ func TestGTDecreaseTrackedResource(t *testing.T) {
func TestGTSetMaxLimits(t *testing.T) {
// Queue setup:
// root->parent->child1
+ // Initialize ugm
+ GetUserManager()
user := security.UserGroup{User: "test", Groups: []string{"test"}}
groupTracker := newGroupTracker(user.User)
usage1, err := resources.NewResourceFromConf(map[string]string{"mem":
"10M", "vcore": "10"})
@@ -174,24 +176,24 @@ func TestGTSetMaxLimits(t *testing.T) {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage1)
}
- result := groupTracker.increaseTrackedResource(queuePath1, TestApp1,
usage1, user.User)
+ result := groupTracker.increaseTrackedResource(hierarchy1, TestApp1,
usage1, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath1, TestApp1, usage1)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy1, TestApp1, usage1)
}
- groupTracker.setLimits(queuePath1, resources.Multiply(usage1, 5), 5)
- groupTracker.setLimits("root.parent", resources.Multiply(usage1, 10),
10)
+ groupTracker.setLimits(hierarchy1, resources.Multiply(usage1, 5), 5)
+ groupTracker.setLimits(hierarchy5, resources.Multiply(usage1, 10), 10)
- result = groupTracker.increaseTrackedResource(queuePath1, TestApp2,
usage1, user.User)
+ result = groupTracker.increaseTrackedResource(hierarchy1, TestApp2,
usage1, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath1, TestApp2, usage1)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy1, TestApp2, usage1)
}
- result = groupTracker.increaseTrackedResource(queuePath1, TestApp3,
usage1, user.User)
+ result = groupTracker.increaseTrackedResource(hierarchy1, TestApp3,
usage1, user.User)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath1, TestApp2, usage1)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy1, TestApp3, usage1)
}
- groupTracker.setLimits(queuePath1, usage1, 1)
- groupTracker.setLimits("root.parent", usage1, 1)
+ groupTracker.setLimits(hierarchy1, usage1, 1)
+ groupTracker.setLimits(hierarchy5, usage1, 1)
}
func getGroupResource(gt *GroupTracker) map[string]*resources.Resource {
diff --git a/pkg/scheduler/ugm/manager.go b/pkg/scheduler/ugm/manager.go
index bbbd37f0..ceb3ba21 100644
--- a/pkg/scheduler/ugm/manager.go
+++ b/pkg/scheduler/ugm/manager.go
@@ -20,6 +20,7 @@ package ugm
import (
"fmt"
+ "strings"
"sync"
"go.uber.org/zap"
@@ -92,7 +93,7 @@ func (m *Manager) IncreaseTrackedResource(queuePath,
applicationID string, usage
if !userTracker.hasGroupForApp(applicationID) {
m.ensureGroupTrackerForApp(queuePath, applicationID, user)
}
- return userTracker.increaseTrackedResource(queuePath, applicationID,
usage)
+ return userTracker.increaseTrackedResource(strings.Split(queuePath,
configs.DOT), applicationID, usage)
}
// DecreaseTrackedResource Decrease the resource usage for the given user
group and queue path combination.
@@ -106,6 +107,7 @@ func (m *Manager) DecreaseTrackedResource(queuePath,
applicationID string, usage
zap.String("application", applicationID),
zap.Stringer("resource", usage),
zap.Bool("removeApp", removeApp))
+ hierarchy := strings.Split(queuePath, configs.DOT)
if queuePath == common.Empty || applicationID == common.Empty || usage
== nil || user.User == common.Empty {
log.Log(log.SchedUGM).Debug("Mandatory parameters are missing
to decrease the resource usage")
return false
@@ -126,7 +128,7 @@ func (m *Manager) DecreaseTrackedResource(queuePath,
applicationID string, usage
zap.String("tracked group", appGroup),
zap.Stringer("resource", usage),
zap.Bool("removeApp", removeApp))
- removeQT, decreased := userTracker.decreaseTrackedResource(queuePath,
applicationID, usage, removeApp)
+ removeQT, decreased := userTracker.decreaseTrackedResource(hierarchy,
applicationID, usage, removeApp)
if !decreased {
return decreased
}
@@ -152,7 +154,7 @@ func (m *Manager) DecreaseTrackedResource(queuePath,
applicationID string, usage
zap.String("application", applicationID),
zap.Stringer("resource", usage),
zap.Bool("removeApp", removeApp))
- removeQT, decreased = groupTracker.decreaseTrackedResource(queuePath,
applicationID, usage, removeApp)
+ removeQT, decreased = groupTracker.decreaseTrackedResource(hierarchy,
applicationID, usage, removeApp)
if !decreased {
return decreased
}
@@ -317,6 +319,7 @@ func (m *Manager) UpdateConfig(config configs.QueueConfig,
queuePath string) err
func (m *Manager) internalProcessConfig(cur configs.QueueConfig, queuePath
string, newUserLimits map[string]map[string]*LimitConfig, newGroupLimits
map[string]map[string]*LimitConfig,
newUserWildCardLimitsConfig map[string]*LimitConfig,
newGroupWildCardLimitsConfig map[string]*LimitConfig, newConfiguredGroups
map[string][]string) error {
+ hierarchy := strings.Split(queuePath, configs.DOT)
// Traverse limits of specific queue path
for _, limit := range cur.Limits {
var maxResource *resources.Resource
@@ -343,7 +346,7 @@ func (m *Manager) internalProcessConfig(cur
configs.QueueConfig, queuePath strin
newUserWildCardLimitsConfig[queuePath] =
limitConfig
continue
}
- if err := m.setUserLimits(user, limitConfig,
queuePath); err != nil {
+ if err := m.setUserLimits(user, limitConfig,
hierarchy); err != nil {
return err
}
if _, ok := newUserLimits[queuePath]; !ok {
@@ -361,7 +364,7 @@ func (m *Manager) internalProcessConfig(cur
configs.QueueConfig, queuePath strin
zap.String("queue path", queuePath),
zap.Uint64("max application",
limit.MaxApplications),
zap.Any("max resources", limit.MaxResources))
- if err := m.setGroupLimits(group, limitConfig,
queuePath); err != nil {
+ if err := m.setGroupLimits(group, limitConfig,
hierarchy); err != nil {
return err
}
if _, ok := newGroupLimits[queuePath]; !ok {
@@ -402,11 +405,12 @@ func (m *Manager) clearEarlierSetLimits(newUserLimits
map[string]map[string]*Lim
// by comparing with the existing config. Reset earlier usage only config set
earlier but not now
func (m *Manager) clearEarlierSetUserLimits(newUserLimits
map[string]map[string]*LimitConfig) {
for queuePath, limitConfig := range m.userLimits {
+ hierarchy := strings.Split(queuePath, configs.DOT)
// Is queue path exists?
if newUserLimit, ok := newUserLimits[queuePath]; !ok {
for u := range limitConfig {
if ut, utExists := m.userTrackers[u]; utExists {
- m.resetUserEarlierUsage(ut, queuePath)
+ m.resetUserEarlierUsage(ut, hierarchy)
}
}
} else {
@@ -414,7 +418,7 @@ func (m *Manager) clearEarlierSetUserLimits(newUserLimits
map[string]map[string]
for u := range limitConfig {
if _, ulExists := newUserLimit[u]; !ulExists {
if ut, utExists := m.userTrackers[u];
utExists {
- m.resetUserEarlierUsage(ut,
queuePath)
+ m.resetUserEarlierUsage(ut,
hierarchy)
}
}
}
@@ -425,20 +429,20 @@ func (m *Manager) clearEarlierSetUserLimits(newUserLimits
map[string]map[string]
// resetUserEarlierUsage Clear or reset earlier usage only when user already
tracked for the queue path.
// Reset the max apps and max resources to default, unlink the end leaf queue
of queue path from its immediate parent and
// eventually remove user tracker object itself from ugm if it can be removed.
-func (m *Manager) resetUserEarlierUsage(ut *UserTracker, queuePath string) {
+func (m *Manager) resetUserEarlierUsage(ut *UserTracker, hierarchy []string) {
// Is this user already tracked for the queue path?
- if ut.IsQueuePathTrackedCompletely(queuePath) {
+ if ut.IsQueuePathTrackedCompletely(hierarchy) {
log.Log(log.SchedUGM).Debug("Need to clear earlier set configs
for user",
zap.String("user", ut.userName),
- zap.String("queue path", queuePath))
- ut.setLimits(queuePath, nil, 0)
+ zap.Strings("queue path", hierarchy))
+ ut.setLimits(hierarchy, nil, 0)
// Is there any running applications in end queue of this queue
path? If not, then remove the linkage between end queue and its immediate parent
- if ut.IsUnlinkRequired(queuePath) {
- ut.UnlinkQT(queuePath)
+ if ut.IsUnlinkRequired(hierarchy) {
+ ut.UnlinkQT(hierarchy)
}
log.Log(log.SchedUGM).Debug("Cleared earlier set limit configs
for user",
zap.String("user", ut.userName),
- zap.String("queue path", queuePath))
+ zap.Strings("queue path", hierarchy))
if ut.canBeRemoved() {
delete(m.userTrackers, ut.userName)
}
@@ -449,11 +453,12 @@ func (m *Manager) resetUserEarlierUsage(ut *UserTracker,
queuePath string) {
// by comparing with the existing config. Reset earlier usage only config set
earlier but not now
func (m *Manager) clearEarlierSetGroupLimits(newGroupLimits
map[string]map[string]*LimitConfig) {
for queuePath, limitConfig := range m.groupLimits {
+ hierarchy := strings.Split(queuePath, configs.DOT)
// Is queue path exists?
if newGroupLimit, ok := newGroupLimits[queuePath]; !ok {
for g := range limitConfig {
if gt, gtExists := m.groupTrackers[g]; gtExists
{
- m.resetGroupEarlierUsage(gt, queuePath)
+ m.resetGroupEarlierUsage(gt, hierarchy)
}
}
} else {
@@ -461,7 +466,7 @@ func (m *Manager) clearEarlierSetGroupLimits(newGroupLimits
map[string]map[strin
for g := range limitConfig {
if _, glExists := newGroupLimit[g]; !glExists {
if gt, gtExists := m.groupTrackers[g];
gtExists {
- m.resetGroupEarlierUsage(gt,
queuePath)
+ m.resetGroupEarlierUsage(gt,
hierarchy)
}
}
}
@@ -473,24 +478,24 @@ func (m *Manager)
clearEarlierSetGroupLimits(newGroupLimits map[string]map[strin
// Decrease the group usage and collect the list of applications for which
user app group linkage needs to be broken.
// Reset the max apps and max resources to default, unlink the end leaf queue
of queue path from its immediate parent and
// eventually remove group tracker object itself from ugm if it can be removed.
-func (m *Manager) resetGroupEarlierUsage(gt *GroupTracker, queuePath string) {
- if gt.IsQueuePathTrackedCompletely(queuePath) {
+func (m *Manager) resetGroupEarlierUsage(gt *GroupTracker, hierarchy []string)
{
+ if gt.IsQueuePathTrackedCompletely(hierarchy) {
log.Log(log.SchedUGM).Debug("Need to clear earlier set configs
for group",
zap.String("group", gt.groupName),
- zap.String("queue path", queuePath))
- appUsersMap := gt.decreaseAllTrackedResourceUsage(queuePath)
+ zap.Strings("queue path", hierarchy))
+ appUsersMap := gt.decreaseAllTrackedResourceUsage(hierarchy)
for app, u := range appUsersMap {
ut := m.userTrackers[u]
delete(ut.appGroupTrackers, app)
}
- gt.setLimits(queuePath, nil, 0)
+ gt.setLimits(hierarchy, nil, 0)
// Is there any running applications in end queue of this queue
path? If not, then remove the linkage between end queue and its immediate parent
- if gt.IsUnlinkRequired(queuePath) {
- gt.UnlinkQT(queuePath)
+ if gt.IsUnlinkRequired(hierarchy) {
+ gt.UnlinkQT(hierarchy)
}
log.Log(log.SchedUGM).Debug("Cleared earlier set limit configs
for group",
zap.String("group", gt.groupName),
- zap.String("queue path", queuePath))
+ zap.Strings("queue path", hierarchy))
if gt.canBeRemoved() {
delete(m.groupTrackers, gt.groupName)
}
@@ -508,43 +513,43 @@ func (m *Manager) replaceLimitConfigs(newUserLimits
map[string]map[string]*Limit
m.configuredGroups = newConfiguredGroups
}
-func (m *Manager) setUserLimits(user string, limitConfig *LimitConfig,
queuePath string) error {
+func (m *Manager) setUserLimits(user string, limitConfig *LimitConfig,
hierarchy []string) error {
m.Lock()
defer m.Unlock()
log.Log(log.SchedUGM).Debug("Setting user limits",
zap.String("user", user),
- zap.String("queue path", queuePath),
+ zap.Strings("queue path", hierarchy),
zap.Uint64("max application", limitConfig.maxApplications),
zap.Any("max resources", limitConfig.maxResources))
userTracker, ok := m.userTrackers[user]
if !ok {
log.Log(log.SchedUGM).Debug("User tracker does not exist.
Creating user tracker object to set the limit configuration",
zap.String("user", user),
- zap.String("queue path", queuePath))
+ zap.Strings("queue path", hierarchy))
userTracker = newUserTracker(user)
m.userTrackers[user] = userTracker
}
- userTracker.setLimits(queuePath, limitConfig.maxResources,
limitConfig.maxApplications)
+ userTracker.setLimits(hierarchy, limitConfig.maxResources,
limitConfig.maxApplications)
return nil
}
-func (m *Manager) setGroupLimits(group string, limitConfig *LimitConfig,
queuePath string) error {
+func (m *Manager) setGroupLimits(group string, limitConfig *LimitConfig,
hierarchy []string) error {
m.Lock()
defer m.Unlock()
log.Log(log.SchedUGM).Debug("Setting group limits",
zap.String("group", group),
- zap.String("queue path", queuePath),
+ zap.Strings("queue path", hierarchy),
zap.Uint64("max application", limitConfig.maxApplications),
zap.Any("max resources", limitConfig.maxResources))
groupTracker, ok := m.groupTrackers[group]
if !ok {
log.Log(log.SchedUGM).Debug("Group tracker does not exist.
Creating group tracker object to set the limit configuration",
zap.String("group", group),
- zap.String("queue path", queuePath))
+ zap.Strings("queue path", hierarchy))
groupTracker = newGroupTracker(group)
m.groupTrackers[group] = groupTracker
}
- groupTracker.setLimits(queuePath, limitConfig.maxResources,
limitConfig.maxApplications)
+ groupTracker.setLimits(hierarchy, limitConfig.maxResources,
limitConfig.maxApplications)
return nil
}
@@ -584,8 +589,9 @@ func (m *Manager) getGroupWildCardLimitsConfig(queuePath
string) *LimitConfig {
// Headroom calculates the headroom for this specific application that runs as
the user and group.
func (m *Manager) Headroom(queuePath, applicationID string, user
security.UserGroup) *resources.Resource {
+ hierarchy := strings.Split(queuePath, configs.DOT)
userTracker := m.getUserTracker(user.User)
- userHeadroom := userTracker.headroom(queuePath)
+ userHeadroom := userTracker.headroom(hierarchy)
log.Log(log.SchedUGM).Debug("Calculated headroom for user",
zap.String("user", user.User),
zap.String("queue path", queuePath),
@@ -603,7 +609,7 @@ func (m *Manager) Headroom(queuePath, applicationID string,
user security.UserGr
if groupTracker == nil {
return userHeadroom
}
- groupHeadroom := groupTracker.headroom(queuePath)
+ groupHeadroom := groupTracker.headroom(hierarchy)
log.Log(log.SchedUGM).Debug("Calculated headroom for group",
zap.String("group", appGroup),
zap.String("queue path", queuePath),
@@ -613,8 +619,9 @@ func (m *Manager) Headroom(queuePath, applicationID string,
user security.UserGr
// CanRunApp checks the maxApplications for this specific application that
runs as the user and group.
func (m *Manager) CanRunApp(queuePath, applicationID string, user
security.UserGroup) bool {
+ hierarchy := strings.Split(queuePath, configs.DOT)
userTracker := m.getUserTracker(user.User)
- userCanRunApp := userTracker.canRunApp(queuePath, applicationID)
+ userCanRunApp := userTracker.canRunApp(hierarchy, applicationID)
log.Log(log.SchedUGM).Debug("Check whether user can run app",
zap.String("user", user.User),
zap.String("queue path", queuePath),
@@ -632,7 +639,7 @@ func (m *Manager) CanRunApp(queuePath, applicationID
string, user security.UserG
if groupTracker == nil {
return userCanRunApp
}
- groupCanRunApp := groupTracker.canRunApp(queuePath, applicationID)
+ groupCanRunApp := groupTracker.canRunApp(hierarchy, applicationID)
log.Log(log.SchedUGM).Debug("Check whether group can run app",
zap.String("group", appGroup),
zap.String("queue path", queuePath),
diff --git a/pkg/scheduler/ugm/user_tracker.go
b/pkg/scheduler/ugm/user_tracker.go
index 1a4e2c81..f2361cd1 100644
--- a/pkg/scheduler/ugm/user_tracker.go
+++ b/pkg/scheduler/ugm/user_tracker.go
@@ -19,13 +19,11 @@
package ugm
import (
- "strings"
"sync"
"go.uber.org/zap"
"github.com/apache/yunikorn-core/pkg/common"
- "github.com/apache/yunikorn-core/pkg/common/configs"
"github.com/apache/yunikorn-core/pkg/common/resources"
"github.com/apache/yunikorn-core/pkg/log"
"github.com/apache/yunikorn-core/pkg/webservice/dao"
@@ -54,24 +52,23 @@ func newUserTracker(user string) *UserTracker {
return userTracker
}
-func (ut *UserTracker) increaseTrackedResource(queuePath, applicationID
string, usage *resources.Resource) bool {
+func (ut *UserTracker) increaseTrackedResource(hierarchy []string,
applicationID string, usage *resources.Resource) bool {
ut.Lock()
defer ut.Unlock()
- hierarchy := strings.Split(queuePath, configs.DOT)
increased := ut.queueTracker.increaseTrackedResource(hierarchy,
applicationID, user, usage)
if increased {
gt := ut.appGroupTrackers[applicationID]
log.Log(log.SchedUGM).Debug("Increasing resource usage for
group",
zap.String("group", gt.getName()),
- zap.String("queue path", queuePath),
+ zap.Strings("queue path", hierarchy),
zap.String("application", applicationID),
zap.Stringer("resource", usage))
- increasedGroupUsage := gt.increaseTrackedResource(queuePath,
applicationID, usage, ut.userName)
+ increasedGroupUsage := gt.increaseTrackedResource(hierarchy,
applicationID, usage, ut.userName)
if !increasedGroupUsage {
_, decreased :=
ut.queueTracker.decreaseTrackedResource(hierarchy, applicationID, usage, false)
if !decreased {
log.Log(log.SchedUGM).Error("User resource
usage rollback has failed",
- zap.String("queue path", queuePath),
+ zap.Strings("queue path", hierarchy),
zap.String("application",
applicationID),
zap.String("user", ut.userName))
}
@@ -81,13 +78,13 @@ func (ut *UserTracker) increaseTrackedResource(queuePath,
applicationID string,
return increased
}
-func (ut *UserTracker) decreaseTrackedResource(queuePath, applicationID
string, usage *resources.Resource, removeApp bool) (bool, bool) {
+func (ut *UserTracker) decreaseTrackedResource(hierarchy []string,
applicationID string, usage *resources.Resource, removeApp bool) (bool, bool) {
ut.Lock()
defer ut.Unlock()
if removeApp {
delete(ut.appGroupTrackers, applicationID)
}
- return ut.queueTracker.decreaseTrackedResource(strings.Split(queuePath,
configs.DOT), applicationID, usage, removeApp)
+ return ut.queueTracker.decreaseTrackedResource(hierarchy,
applicationID, usage, removeApp)
}
func (ut *UserTracker) hasGroupForApp(applicationID string) bool {
@@ -118,16 +115,16 @@ func (ut *UserTracker) getTrackedApplications()
map[string]*GroupTracker {
return ut.appGroupTrackers
}
-func (ut *UserTracker) setLimits(queuePath string, resource
*resources.Resource, maxApps uint64) {
+func (ut *UserTracker) setLimits(hierarchy []string, resource
*resources.Resource, maxApps uint64) {
ut.Lock()
defer ut.Unlock()
- ut.queueTracker.setLimit(strings.Split(queuePath, configs.DOT),
resource, maxApps)
+ ut.queueTracker.setLimit(hierarchy, resource, maxApps)
}
-func (ut *UserTracker) headroom(queuePath string) *resources.Resource {
+func (ut *UserTracker) headroom(hierarchy []string) *resources.Resource {
ut.Lock()
defer ut.Unlock()
- return ut.queueTracker.headroom(strings.Split(queuePath, configs.DOT),
user)
+ return ut.queueTracker.headroom(hierarchy, user)
}
func (ut *UserTracker) GetUserResourceUsageDAOInfo()
*dao.UserResourceUsageDAOInfo {
@@ -146,22 +143,22 @@ func (ut *UserTracker) GetUserResourceUsageDAOInfo()
*dao.UserResourceUsageDAOIn
return userResourceUsage
}
-func (ut *UserTracker) IsQueuePathTrackedCompletely(queuePath string) bool {
+func (ut *UserTracker) IsQueuePathTrackedCompletely(hierarchy []string) bool {
ut.RLock()
defer ut.RUnlock()
- return
ut.queueTracker.IsQueuePathTrackedCompletely(strings.Split(queuePath,
configs.DOT))
+ return ut.queueTracker.IsQueuePathTrackedCompletely(hierarchy)
}
-func (ut *UserTracker) IsUnlinkRequired(queuePath string) bool {
+func (ut *UserTracker) IsUnlinkRequired(hierarchy []string) bool {
ut.RLock()
defer ut.RUnlock()
- return ut.queueTracker.IsUnlinkRequired(strings.Split(queuePath,
configs.DOT))
+ return ut.queueTracker.IsUnlinkRequired(hierarchy)
}
-func (ut *UserTracker) UnlinkQT(queuePath string) bool {
+func (ut *UserTracker) UnlinkQT(hierarchy []string) bool {
ut.RLock()
defer ut.RUnlock()
- return ut.queueTracker.UnlinkQT(strings.Split(queuePath, configs.DOT))
+ return ut.queueTracker.UnlinkQT(hierarchy)
}
func (ut *UserTracker) canBeRemoved() bool {
@@ -170,8 +167,8 @@ func (ut *UserTracker) canBeRemoved() bool {
return ut.queueTracker.canBeRemoved()
}
-func (ut *UserTracker) canRunApp(queuePath, applicationID string) bool {
+func (ut *UserTracker) canRunApp(hierarchy []string, applicationID string)
bool {
ut.Lock()
defer ut.Unlock()
- return ut.queueTracker.canRunApp(strings.Split(queuePath, configs.DOT),
applicationID, user)
+ return ut.queueTracker.canRunApp(hierarchy, applicationID, user)
}
diff --git a/pkg/scheduler/ugm/user_tracker_test.go
b/pkg/scheduler/ugm/user_tracker_test.go
index bf9cc143..4edece6b 100644
--- a/pkg/scheduler/ugm/user_tracker_test.go
+++ b/pkg/scheduler/ugm/user_tracker_test.go
@@ -39,20 +39,28 @@ const (
queuePath4 = "root.parent.child12"
)
+var hierarchy1 = []string{"root", "parent", "child1"}
+var hierarchy2 = []string{"root", "parent", "child2"}
+var hierarchy3 = []string{"root", "parent", "child1", "child12"}
+var hierarchy4 = []string{"root", "parent", "child12"}
+var hierarchy5 = []string{"root", "parent"}
+
func TestIncreaseTrackedResource(t *testing.T) {
// Queue setup:
// root->parent->child1->child12
// root->parent->child2
// root->parent->child12 (similar name like above leaf queue, but it is
being treated differently as similar names are allowed)
+ // Initialize ugm
+ GetUserManager()
user := security.UserGroup{User: "test", Groups: []string{"test"}}
userTracker := newUserTracker(user.User)
usage1, err := resources.NewResourceFromConf(map[string]string{"mem":
"10M", "vcore": "10"})
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage1)
}
- result := userTracker.increaseTrackedResource(queuePath1, TestApp1,
usage1)
+ result := userTracker.increaseTrackedResource(hierarchy1, TestApp1,
usage1)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath1, TestApp1, usage1)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy1, TestApp1, usage1)
}
groupTracker := newGroupTracker(user.User)
userTracker.setGroupForApp(TestApp1, groupTracker)
@@ -61,9 +69,9 @@ func TestIncreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage2)
}
- result = userTracker.increaseTrackedResource(queuePath2, TestApp2,
usage2)
+ result = userTracker.increaseTrackedResource(hierarchy2, TestApp2,
usage2)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath2, TestApp2, usage2, err)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy2, TestApp2, usage2, err)
}
userTracker.setGroupForApp(TestApp2, groupTracker)
@@ -71,9 +79,9 @@ func TestIncreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- result = userTracker.increaseTrackedResource(queuePath3, TestApp3,
usage3)
+ result = userTracker.increaseTrackedResource(hierarchy3, TestApp3,
usage3)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath3, TestApp3, usage3, err)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy3, TestApp3, usage3, err)
}
userTracker.setGroupForApp(TestApp3, groupTracker)
@@ -81,9 +89,9 @@ func TestIncreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- result = userTracker.increaseTrackedResource(queuePath4, TestApp4,
usage4)
+ result = userTracker.increaseTrackedResource(hierarchy4, TestApp4,
usage4)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath4, TestApp4, usage4, err)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy4, TestApp4, usage4, err)
}
userTracker.setGroupForApp(TestApp4, groupTracker)
@@ -104,6 +112,8 @@ func TestDecreaseTrackedResource(t *testing.T) {
// Queue setup:
// root->parent->child1
// root->parent->child2
+ // Initialize ugm
+ GetUserManager()
user := security.UserGroup{User: "test", Groups: []string{"test"}}
userTracker := newUserTracker(user.User)
@@ -111,9 +121,9 @@ func TestDecreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage1)
}
- result := userTracker.increaseTrackedResource(queuePath1, TestApp1,
usage1)
+ result := userTracker.increaseTrackedResource(hierarchy1, TestApp1,
usage1)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath1, TestApp1, usage1, err)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy1, TestApp1, usage1, err)
}
groupTracker := newGroupTracker(user.User)
userTracker.setGroupForApp(TestApp1, groupTracker)
@@ -123,9 +133,9 @@ func TestDecreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage2)
}
- result = userTracker.increaseTrackedResource(queuePath2, TestApp2,
usage2)
+ result = userTracker.increaseTrackedResource(hierarchy2, TestApp2,
usage2)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath2, TestApp2, usage2, err)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy2, TestApp2, usage2, err)
}
userTracker.setGroupForApp(TestApp2, groupTracker)
actualResources := getUserResource(userTracker)
@@ -140,15 +150,15 @@ func TestDecreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- removeQT, decreased := userTracker.decreaseTrackedResource(queuePath1,
TestApp1, usage3, false)
+ removeQT, decreased := userTracker.decreaseTrackedResource(hierarchy1,
TestApp1, usage3, false)
if !decreased {
- t.Fatalf("unable to decrease tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath1, TestApp1, usage3, err)
+ t.Fatalf("unable to decrease tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy1, TestApp1, usage3, err)
}
assert.Equal(t, removeQT, false, "wrong remove queue tracker value")
- removeQT, decreased = userTracker.decreaseTrackedResource(queuePath2,
TestApp2, usage3, false)
+ removeQT, decreased = userTracker.decreaseTrackedResource(hierarchy2,
TestApp2, usage3, false)
if !decreased {
- t.Fatalf("unable to decrease tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath2, TestApp2, usage3, err)
+ t.Fatalf("unable to decrease tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy2, TestApp2, usage3, err)
}
actualResources1 := getUserResource(userTracker)
@@ -163,9 +173,9 @@ func TestDecreaseTrackedResource(t *testing.T) {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage3)
}
- removeQT, decreased = userTracker.decreaseTrackedResource(queuePath1,
TestApp1, usage4, true)
+ removeQT, decreased = userTracker.decreaseTrackedResource(hierarchy1,
TestApp1, usage4, true)
if !decreased {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath1, TestApp1, usage1, err)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy1, TestApp1, usage1, err)
}
assert.Equal(t, 1, len(userTracker.getTrackedApplications()))
assert.Equal(t, removeQT, false, "wrong remove queue tracker value")
@@ -174,9 +184,9 @@ func TestDecreaseTrackedResource(t *testing.T) {
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage5)
}
- removeQT, decreased = userTracker.decreaseTrackedResource(queuePath2,
TestApp2, usage5, true)
+ removeQT, decreased = userTracker.decreaseTrackedResource(hierarchy2,
TestApp2, usage5, true)
if !decreased {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath2, TestApp2, usage2, err)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy2, TestApp2, usage2, err)
}
assert.Equal(t, 0, len(userTracker.getTrackedApplications()))
assert.Equal(t, removeQT, true, "wrong remove queue tracker value")
@@ -185,31 +195,33 @@ func TestDecreaseTrackedResource(t *testing.T) {
func TestSetMaxLimits(t *testing.T) {
// Queue setup:
// root->parent->child1
+ // Initialize ugm
+ GetUserManager()
user := security.UserGroup{User: "test", Groups: []string{"test"}}
userTracker := newUserTracker(user.User)
usage1, err := resources.NewResourceFromConf(map[string]string{"mem":
"10M", "vcore": "10"})
if err != nil {
t.Errorf("new resource create returned error or wrong resource:
error %t, res %v", err, usage1)
}
- result := userTracker.increaseTrackedResource(queuePath1, TestApp1,
usage1)
+ result := userTracker.increaseTrackedResource(hierarchy1, TestApp1,
usage1)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v, error %t", queuePath1, TestApp1, usage1, err)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v, error %t", hierarchy1, TestApp1, usage1, err)
}
- userTracker.setLimits(queuePath1, resources.Multiply(usage1, 5), 5)
- userTracker.setLimits("root.parent", resources.Multiply(usage1, 10), 10)
+ userTracker.setLimits(hierarchy1, resources.Multiply(usage1, 5), 5)
+ userTracker.setLimits(hierarchy5, resources.Multiply(usage1, 10), 10)
- result = userTracker.increaseTrackedResource(queuePath1, TestApp1,
usage1)
+ result = userTracker.increaseTrackedResource(hierarchy1, TestApp1,
usage1)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath1, TestApp1, usage1)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy1, TestApp1, usage1)
}
- result = userTracker.increaseTrackedResource(queuePath1, TestApp2,
usage1)
+ result = userTracker.increaseTrackedResource(hierarchy1, TestApp2,
usage1)
if !result {
- t.Fatalf("unable to increase tracked resource: queuepath %s,
app %s, res %v", queuePath1, TestApp2, usage1)
+ t.Fatalf("unable to increase tracked resource: queuepath %+q,
app %s, res %v", hierarchy1, TestApp2, usage1)
}
- userTracker.setLimits(queuePath1, usage1, 1)
- userTracker.setLimits("root.parent", usage1, 1)
+ userTracker.setLimits(hierarchy1, usage1, 1)
+ userTracker.setLimits(hierarchy5, usage1, 1)
}
func getUserResource(ut *UserTracker) map[string]*resources.Resource {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]