This is an automated email from the ASF dual-hosted git repository.
mani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/yunikorn-core.git
The following commit(s) were added to refs/heads/master by this push:
new 47c3ddcf [YUNIKORN-2483] Core: Remove stateaware sort policy (#820)
47c3ddcf is described below
commit 47c3ddcfca23dd72bb6a58dbba595c709fec716f
Author: Craig Condit <[email protected]>
AuthorDate: Thu Mar 14 11:18:47 2024 +0530
[YUNIKORN-2483] Core: Remove stateaware sort policy (#820)
Closes: #820
Signed-off-by: Manikandan R <[email protected]>
---
pkg/common/configs/config_test.go | 4 +-
pkg/scheduler/objects/application.go | 7 +--
pkg/scheduler/objects/application_test.go | 20 -------
pkg/scheduler/objects/queue.go | 27 +++------
pkg/scheduler/objects/queue_test.go | 79 +++------------------------
pkg/scheduler/objects/sorters.go | 44 ---------------
pkg/scheduler/objects/sorters_test.go | 65 ----------------------
pkg/scheduler/partition.go | 2 +-
pkg/scheduler/partition_test.go | 26 ---------
pkg/scheduler/policies/sorting_policy.go | 15 +++--
pkg/scheduler/policies/sorting_policy_test.go | 4 +-
pkg/webservice/handlers_test.go | 10 ++--
12 files changed, 35 insertions(+), 268 deletions(-)
diff --git a/pkg/common/configs/config_test.go
b/pkg/common/configs/config_test.go
index 43c1c10e..e672a202 100644
--- a/pkg/common/configs/config_test.go
+++ b/pkg/common/configs/config_test.go
@@ -45,7 +45,7 @@ partitions:
- name: root
submitacl: '*'
properties:
- application.sort.policy: stateaware
+ application.sort.policy: fifo
sample: value2
`
@@ -1714,7 +1714,7 @@ partitions:
- name: root
submitacl: '*'
properties:
- application.sort.policy: stateaware
+ application.sort.policy: fifo
`
testCases := []struct {
name string
diff --git a/pkg/scheduler/objects/application.go
b/pkg/scheduler/objects/application.go
index a064d321..1461a497 100644
--- a/pkg/scheduler/objects/application.go
+++ b/pkg/scheduler/objects/application.go
@@ -39,7 +39,6 @@ import (
"github.com/apache/yunikorn-core/pkg/metrics"
"github.com/apache/yunikorn-core/pkg/rmproxy/rmevent"
"github.com/apache/yunikorn-core/pkg/scheduler/ugm"
- siCommon "github.com/apache/yunikorn-scheduler-interface/lib/go/common"
"github.com/apache/yunikorn-scheduler-interface/lib/go/si"
)
@@ -185,11 +184,7 @@ func NewApplication(siApp *si.AddApplicationRequest, ugi
security.UserGroup, eve
}
app.gangSchedulingStyle = gangSchedStyle
app.execTimeout = placeholderTimeout
- if app.GetTag(siCommon.AppTagStateAwareDisable) != "" {
- app.startTimeout = 0 // transition immediately to Running
- } else {
- app.startTimeout = startingTimeout
- }
+ app.startTimeout = startingTimeout
app.user = ugi
app.rmEventHandler = eventHandler
app.rmID = rmID
diff --git a/pkg/scheduler/objects/application_test.go
b/pkg/scheduler/objects/application_test.go
index 04439672..4ddafa0b 100644
--- a/pkg/scheduler/objects/application_test.go
+++ b/pkg/scheduler/objects/application_test.go
@@ -1013,26 +1013,6 @@ func TestStateTimeOut(t *testing.T) {
if !app.stateMachine.Is(Running.String()) || app.stateTimer != nil {
t.Fatalf("State is not running or timer was not cleared, state:
%s, timer %v", app.stateMachine.Current(), app.stateTimer)
}
-
- startingTimeout = time.Minute * 5
- app = newApplicationWithTags(appID2, "default", "root.a",
map[string]string{siCommon.AppTagStateAwareDisable: "true"})
- err = app.handleApplicationEventWithLocking(RunApplication)
- assert.NilError(t, err, "no error expected new to accepted (timeout
test)")
- err = app.handleApplicationEventWithLocking(RunApplication)
- assert.NilError(t, err, "no error expected accepted to starting
(timeout test)")
- // give it some time to run and progress
- time.Sleep(time.Millisecond * 100)
- if app.IsStarting() {
- t.Fatal("Starting state should have timed out")
- }
- if app.stateTimer != nil {
- t.Fatalf("Startup timer has not be cleared on time out as
expected, %v", app.stateTimer)
- }
- log := app.GetStateLog()
- assert.Equal(t, len(log), 3, "wrong number of app events")
- assert.Equal(t, log[0].ApplicationState, Accepted.String())
- assert.Equal(t, log[1].ApplicationState, Starting.String())
- assert.Equal(t, log[2].ApplicationState, Running.String())
}
func TestCompleted(t *testing.T) {
diff --git a/pkg/scheduler/objects/queue.go b/pkg/scheduler/objects/queue.go
index 43c66e8b..d0d8bb2f 100644
--- a/pkg/scheduler/objects/queue.go
+++ b/pkg/scheduler/objects/queue.go
@@ -1126,7 +1126,7 @@ func (sq *Queue) IsPrioritySortEnabled() bool {
// Only applications with a pending resource request are considered.
// Lock free call all locks are taken when needed in called functions
// If withPlaceholdersOnly is true, then only applications with at least one
placeholder allocation are considered.
-func (sq *Queue) sortApplications(filterApps, withPlaceholdersOnly bool)
[]*Application {
+func (sq *Queue) sortApplications(withPlaceholdersOnly bool) []*Application {
if !sq.IsLeafQueue() {
return nil
}
@@ -1144,16 +1144,7 @@ func (sq *Queue) sortApplications(filterApps,
withPlaceholdersOnly bool) []*Appl
}
// sort applications based on the sorting policy
- // some apps might be filtered out based on the policy specific
conditions.
- // currently, only the stateAware policy does the filtering (based on
app state).
- // if the filterApps flag is true, the app filtering is skipped while
doing the sorting.
- queueSortType := sq.getSortType()
- if !filterApps && queueSortType == policies.StateAwarePolicy {
- // fallback to FIFO policy if the filterApps flag is false
- // this is to skip the app filtering in the StateAware policy
sorting
- queueSortType = policies.FifoSortPolicy
- }
- return sortApplications(apps, queueSortType,
sq.IsPrioritySortEnabled(), sq.GetGuaranteedResource())
+ return sortApplications(apps, sq.getSortType(),
sq.IsPrioritySortEnabled(), sq.GetGuaranteedResource())
}
// sortQueues returns a sorted shallow copy of the queues for this parent
queue.
@@ -1360,7 +1351,7 @@ func (sq *Queue) TryAllocate(iterator func()
NodeIterator, fullIterator func() N
preemptAttemptsRemaining := maxPreemptionsPerQueue
// process the apps (filters out app without pending requests)
- for _, app := range sq.sortApplications(true, false) {
+ for _, app := range sq.sortApplications(false) {
runnableInQueue := sq.canRunApp(app.ApplicationID)
runnableByUserLimit :=
ugm.GetUserManager().CanRunApp(sq.QueuePath, app.ApplicationID, app.user)
app.updateRunnableStatus(runnableInQueue,
runnableByUserLimit)
@@ -1402,7 +1393,7 @@ func (sq *Queue) TryAllocate(iterator func()
NodeIterator, fullIterator func() N
func (sq *Queue) TryPlaceholderAllocate(iterator func() NodeIterator, getnode
func(string) *Node) *Allocation {
if sq.IsLeafQueue() {
// process the apps (filters out app without pending requests)
- for _, app := range sq.sortApplications(true, true) {
+ for _, app := range sq.sortApplications(true) {
alloc := app.tryPlaceholderAllocate(iterator, getnode)
if alloc != nil {
log.Log(log.SchedQueue).Info("allocation found
on queue",
@@ -1428,11 +1419,9 @@ func (sq *Queue) TryPlaceholderAllocate(iterator func()
NodeIterator, getnode fu
func (sq *Queue) GetQueueOutstandingRequests(total *[]*AllocationAsk) {
if sq.IsLeafQueue() {
headRoom := sq.getMaxHeadRoom()
- // while calculating outstanding requests, we do not need to
filter apps.
- // e.g. StateAware filters apps by state in order to schedule
app one by one.
- // we calculate all the requests that can fit into the queue's
headroom,
+ // while calculating outstanding requests, we calculate all the
requests that can fit into the queue's headroom,
// all these requests are qualified to trigger the up scaling.
- for _, app := range sq.sortApplications(false, false) {
+ for _, app := range sq.sortApplications(false) {
// calculate the users' headroom
userHeadroom :=
ugm.GetUserManager().Headroom(app.queuePath, app.ApplicationID, app.user)
app.getOutstandingRequests(headRoom, userHeadroom,
total)
@@ -1586,7 +1575,7 @@ func (sq *Queue) getSortType() policies.SortPolicy {
}
// SupportTaskGroup returns true if the queue supports task groups.
-// FIFO and StateAware sorting policies can support this.
+// FIFO policy is required to support this.
// NOTE: this call does not make sense for a parent queue, and always returns
false
func (sq *Queue) SupportTaskGroup() bool {
sq.RLock()
@@ -1594,7 +1583,7 @@ func (sq *Queue) SupportTaskGroup() bool {
if !sq.isLeaf {
return false
}
- return sq.sortType == policies.FifoSortPolicy || sq.sortType ==
policies.StateAwarePolicy
+ return sq.sortType == policies.FifoSortPolicy
}
// updateGuaranteedResourceMetrics updates guaranteed resource metrics.
diff --git a/pkg/scheduler/objects/queue_test.go
b/pkg/scheduler/objects/queue_test.go
index 7c46484e..6947b358 100644
--- a/pkg/scheduler/objects/queue_test.go
+++ b/pkg/scheduler/objects/queue_test.go
@@ -647,21 +647,21 @@ func TestSortApplications(t *testing.T) {
// empty parent queue
parent, err = createManagedQueue(root, "parent", true, nil)
assert.NilError(t, err, "failed to create parent queue: %v")
- if apps := parent.sortApplications(true, false); apps != nil {
+ if apps := parent.sortApplications(false); apps != nil {
t.Errorf("parent queue should not return sorted apps: %v", apps)
}
// empty leaf queue
leaf, err = createManagedQueue(parent, "leaf", false, nil)
assert.NilError(t, err, "failed to create leaf queue")
- if len(leaf.sortApplications(true, false)) != 0 {
+ if len(leaf.sortApplications(false)) != 0 {
t.Errorf("empty queue should return no app from sort: %v", leaf)
}
// new app does not have pending res, does not get returned
app := newApplication(appID1, "default", leaf.QueuePath)
app.queue = leaf
leaf.AddApplication(app)
- if len(leaf.sortApplications(true, false)) != 0 {
+ if len(leaf.sortApplications(false)) != 0 {
t.Errorf("app without ask should not be in sorted apps: %v",
app)
}
var res *resources.Resource
@@ -670,73 +670,17 @@ func TestSortApplications(t *testing.T) {
// add an ask app must be returned
err = app.AddAllocationAsk(newAllocationAsk("alloc-1", appID1, res))
assert.NilError(t, err, "failed to add allocation ask")
- sortedApp := leaf.sortApplications(true, false)
+ sortedApp := leaf.sortApplications(false)
if len(sortedApp) != 1 || sortedApp[0].ApplicationID != appID1 {
t.Errorf("sorted application is missing expected app: %v",
sortedApp)
}
// set 0 repeat
_, err = app.UpdateAskRepeat("alloc-1", -1)
- if err != nil || len(leaf.sortApplications(true, false)) != 0 {
+ if err != nil || len(leaf.sortApplications(false)) != 0 {
t.Errorf("app with ask but 0 pending resources should not be in
sorted apps: %v (err = %v)", app, err)
}
}
-func TestSortApplicationsWithoutFiltering(t *testing.T) {
- // create the root
- root, err := createRootQueue(nil)
- assert.NilError(t, err, "queue create failed")
-
- var leaf *Queue
- properties := map[string]string{configs.ApplicationSortPolicy:
"stateaware"}
- leaf, err = createManagedQueueWithProps(root, "leaf", false, nil,
properties)
- assert.NilError(t, err, "failed to create queue: %v", err)
-
- // new app does not have pending res, does not get returned
- app1 := newApplication(appID1, "default", leaf.QueuePath)
- app1.queue = leaf
- leaf.AddApplication(app1)
-
- app2 := newApplication(appID2, "default", leaf.QueuePath)
- app2.queue = leaf
- leaf.AddApplication(app2)
-
- // both apps have no pending resource, they will be excluded by the
sorting result
- apps := leaf.sortApplications(true, false)
- assertAppListLength(t, apps, []string{}, "sort with the filter")
- apps = leaf.sortApplications(false, false)
- assertAppListLength(t, apps, []string{}, "sort without the filter")
-
- // add pending ask to app1
- var res *resources.Resource
- res, err = resources.NewResourceFromConf(map[string]string{"first":
"1"})
- assert.NilError(t, err, "failed to create basic resource")
- // add an ask app must be returned
- err = app1.AddAllocationAsk(newAllocationAsk("app1-alloc-1", appID1,
res))
- assert.NilError(t, err, "failed to add allocation ask")
-
- // the sorting result will return app1
- apps = leaf.sortApplications(true, false)
- assertAppListLength(t, apps, []string{appID1}, "sort with the filter")
- apps = leaf.sortApplications(false, false)
- assertAppListLength(t, apps, []string{appID1}, "sort without the
filter")
-
- // add pending ask to app2
- res, err = resources.NewResourceFromConf(map[string]string{"first":
"1"})
- assert.NilError(t, err, "failed to create basic resource")
- // add an ask app must be returned
- err = app2.AddAllocationAsk(newAllocationAsk("app2-alloc-1", appID2,
res))
- assert.NilError(t, err, "failed to add allocation ask")
-
- // now there are 2 apps in the queue
- // according to the state aware policy, if we sort with the filter
- // only 1 app will be returning in the result; if sort without the
filter
- // it should return the both 2 apps
- apps = leaf.sortApplications(true, false)
- assertAppListLength(t, apps, []string{appID1}, "sort with the filter")
- apps = leaf.sortApplications(false, false)
- assertAppListLength(t, apps, []string{appID1, appID2}, "sort without
the filter")
-}
-
func TestSortAppsWithPlaceholderAllocations(t *testing.T) {
root, err := createRootQueue(nil)
assert.NilError(t, err, "queue create failed")
@@ -758,9 +702,7 @@ func TestSortAppsWithPlaceholderAllocations(t *testing.T) {
app1.AddAllocation(alloc)
err = app1.AddAllocationAsk(newAllocationAsk("ask-0", appID1, res))
assert.NilError(t, err, "could not add ask")
- phApps := leaf.sortApplications(true, true)
- assert.Equal(t, 1, len(phApps))
- phApps = leaf.sortApplications(false, true)
+ phApps := leaf.sortApplications(true)
assert.Equal(t, 1, len(phApps))
// adding a placeholder allocation & pending request to "app2"
@@ -769,9 +711,7 @@ func TestSortAppsWithPlaceholderAllocations(t *testing.T) {
app2.AddAllocation(alloc2)
err = app2.AddAllocationAsk(newAllocationAsk("ask-0", appID1, res))
assert.NilError(t, err, "could not add ask")
- phApps = leaf.sortApplications(true, true)
- assert.Equal(t, 2, len(phApps))
- phApps = leaf.sortApplications(false, true)
+ phApps = leaf.sortApplications(true)
assert.Equal(t, 2, len(phApps))
}
@@ -1668,11 +1608,6 @@ func TestSupportTaskGroup(t *testing.T) {
assert.NilError(t, err, "failed to create queue: %v", err)
assert.Assert(t, leaf.SupportTaskGroup(), "leaf queue (FIFO policy)
should support task group")
- properties = map[string]string{configs.ApplicationSortPolicy:
"StateAware"}
- leaf, err = createManagedQueueWithProps(parent, "leaf2", false, nil,
properties)
- assert.NilError(t, err, "failed to create queue: %v", err)
- assert.Assert(t, leaf.SupportTaskGroup(), "leaf queue (StateAware
policy) should support task group")
-
properties = map[string]string{configs.ApplicationSortPolicy: "fair"}
leaf, err = createManagedQueueWithProps(parent, "leaf3", false, nil,
properties)
assert.NilError(t, err, "failed to create queue: %v", err)
diff --git a/pkg/scheduler/objects/sorters.go b/pkg/scheduler/objects/sorters.go
index eb195e9b..1d7f039b 100644
--- a/pkg/scheduler/objects/sorters.go
+++ b/pkg/scheduler/objects/sorters.go
@@ -113,13 +113,6 @@ func sortApplications(apps map[string]*Application,
sortType policies.SortPolicy
} else {
sortApplicationsBySubmissionTimeAndPriority(sortedApps)
}
- case policies.StateAwarePolicy:
- sortedApps = stateAwareFilter(apps)
- if considerPriority {
- sortApplicationsByPriorityAndSubmissionTime(sortedApps)
- } else {
- sortApplicationsBySubmissionTimeAndPriority(sortedApps)
- }
}
metrics.GetSchedulerMetrics().ObserveAppSortingLatency(sortingStart)
return sortedApps
@@ -192,40 +185,3 @@ func filterOnPendingResources(apps
map[string]*Application) []*Application {
}
return filteredApps
}
-
-// This filter only allows one (1) application with a state that is not
running in the list of candidates.
-// The preference is a state of Starting. If we can not find an app with a
starting state we will use an app
-// with an Accepted state. However if there is an app with a Starting state
even with no pending resource
-// requests, no Accepted apps can be scheduled. An app in New state does not
have any asks and can never be
-// scheduled.
-func stateAwareFilter(apps map[string]*Application) []*Application {
- filteredApps := make([]*Application, 0)
- var acceptedApp *Application
- var foundStarting bool
- for _, app := range apps {
- // found a starting app clear out the accepted app (independent
of pending resources)
- if app.IsStarting() {
- foundStarting = true
- acceptedApp = nil
- }
- // Now just look at app when pending-res > 0
- if resources.StrictlyGreaterThanZero(app.GetPendingResource()) {
- // filter accepted apps
- if app.IsAccepted() {
- // check if we have not seen a starting app
- // replace the currently tracked accepted app
if this is an older one
- if !foundStarting && (acceptedApp == nil ||
acceptedApp.SubmissionTime.After(app.SubmissionTime)) {
- acceptedApp = app
- }
- continue
- }
- // this is a running or starting app add it to the list
- filteredApps = append(filteredApps, app)
- }
- }
- // just add the accepted app if we need to: apps are not sorted yet
- if acceptedApp != nil {
- filteredApps = append(filteredApps, acceptedApp)
- }
- return filteredApps
-}
diff --git a/pkg/scheduler/objects/sorters_test.go
b/pkg/scheduler/objects/sorters_test.go
index 10ed5a6c..aaa3951a 100644
--- a/pkg/scheduler/objects/sorters_test.go
+++ b/pkg/scheduler/objects/sorters_test.go
@@ -174,11 +174,6 @@ func TestSortAppsNoPending(t *testing.T) {
list = sortApplications(input, policies.FifoSortPolicy, true, nil)
assertAppListLength(t, list, []string{}, "fifo no pending - priority")
- list = sortApplications(input, policies.StateAwarePolicy, false, nil)
- assertAppListLength(t, list, []string{}, "state no pending")
- list = sortApplications(input, policies.StateAwarePolicy, true, nil)
- assertAppListLength(t, list, []string{}, "state no pending - priority")
-
// set one app with pending
appID := "app-1"
input[appID].pending = res
@@ -191,11 +186,6 @@ func TestSortAppsNoPending(t *testing.T) {
assertAppListLength(t, list, []string{appID}, "fifo one pending")
list = sortApplications(input, policies.FifoSortPolicy, true, nil)
assertAppListLength(t, list, []string{appID}, "fifo one pending -
priority")
-
- list = sortApplications(input, policies.StateAwarePolicy, false, nil)
- assertAppListLength(t, list, []string{appID}, "state one pending")
- list = sortApplications(input, policies.StateAwarePolicy, true, nil)
- assertAppListLength(t, list, []string{appID}, "state one pending -
priority")
}
func TestSortAppsFifo(t *testing.T) {
@@ -332,61 +322,6 @@ func TestSortAppsPriorityFair(t *testing.T) {
assertAppList(t, list, []int{2, 0, 3, 1}, "app-1 & app-3 allocated")
}
-func TestSortAppsStateAware(t *testing.T) {
- // stable sort is used so equal values stay where they were
- res := resources.NewResourceFromMap(map[string]resources.Quantity{
- "vcore": resources.Quantity(100)})
- // setup all apps with pending resources, all accepted state
- input := make(map[string]*Application, 4)
- for i := 0; i < 4; i++ {
- num := strconv.Itoa(i)
- appID := "app-" + num
- app := newApplication(appID, "partition", "queue")
- app.pending = res
- input[appID] = app
- err := app.HandleApplicationEvent(RunApplication)
- assert.NilError(t, err, "state change failed for app %v", appID)
- // make sure the time stamps differ at least a bit (tracking in
nano seconds)
- time.Sleep(time.Nanosecond * 5)
- }
- // only first app should be returned (all in accepted)
- list := sortApplications(input, policies.StateAwarePolicy, false, nil)
- appID0 := "app-0"
- assertAppListLength(t, list, []string{appID0}, "state all accepted")
-
- // set first app pending to zero, should get 2nd app back
- input[appID0].pending = resources.NewResource()
- list = sortApplications(input, policies.StateAwarePolicy, false, nil)
- appID1 := "app-1"
- assertAppListLength(t, list, []string{appID1}, "state no pending")
-
- // move the first app to starting no pending resource should get nothing
- err := input[appID0].HandleApplicationEvent(RunApplication)
- assert.NilError(t, err, "state change failed for app-0")
- list = sortApplications(input, policies.StateAwarePolicy, false, nil)
- assertAppListLength(t, list, []string{}, "state starting no pending")
-
- // move first app to running (no pending resource) and 4th app to
starting should get starting app
- err = input[appID0].HandleApplicationEvent(RunApplication)
- assert.NilError(t, err, "state change failed for app-0")
- appID3 := "app-3"
- err = input[appID3].HandleApplicationEvent(RunApplication)
- assert.NilError(t, err, "state change failed for app-3")
- list = sortApplications(input, policies.StateAwarePolicy, false, nil)
- assertAppListLength(t, list, []string{appID3}, "state starting")
-
- // set pending for first app, should get back 1st and 4th in that order
- input[appID0].pending = res
- list = sortApplications(input, policies.StateAwarePolicy, false, nil)
- assertAppListLength(t, list, []string{appID0, appID3}, "state first
pending")
-
- // move 4th to running should get back: 1st, 2nd and 4th in that order
- err = input[appID3].HandleApplicationEvent(RunApplication)
- assert.NilError(t, err, "state change failed for app-3")
- list = sortApplications(input, policies.StateAwarePolicy, false, nil)
- assertAppListLength(t, list, []string{appID0, appID1, appID3}, "state
not app-2")
-}
-
func queueNames(list []*Queue) string {
result := make([]string, 0)
for _, v := range list {
diff --git a/pkg/scheduler/partition.go b/pkg/scheduler/partition.go
index c318c6b8..26ae861c 100644
--- a/pkg/scheduler/partition.go
+++ b/pkg/scheduler/partition.go
@@ -345,7 +345,7 @@ func (pc *PartitionContext) AddApplication(app
*objects.Application) error {
queue.AddApplication(app)
// check only for gang request
// - make sure the taskgroup request fits in the maximum set for the
queue hierarchy
- // - task groups should only be used in FIFO or StateAware queues
+ // - task groups should only be used in FIFO queues
// if the check fails remove the app from the queue again
if placeHolder := app.GetPlaceholderAsk();
!resources.IsZero(placeHolder) {
// check the queue sorting
diff --git a/pkg/scheduler/partition_test.go b/pkg/scheduler/partition_test.go
index 14bef767..f1f0de89 100644
--- a/pkg/scheduler/partition_test.go
+++ b/pkg/scheduler/partition_test.go
@@ -1064,32 +1064,6 @@ func TestAddAppTaskGroup(t *testing.T) {
if err == nil || partition.getApplication(appID2) != nil {
t.Errorf("add application should have failed due to queue sort
policy but did not")
}
-
- // queue with stateaware as sort policy, with a max set smaller than
placeholder ask: app add should fail
- err = queue.ApplyConf(configs.QueueConfig{
- Name: "default",
- Parent: false,
- Queues: nil,
- Properties: map[string]string{configs.ApplicationSortPolicy:
"stateaware"},
- Resources: configs.Resources{Max: map[string]string{"vcore":
"5"}},
- })
- assert.NilError(t, err, "updating queue should not have failed
(stateaware & max)")
- queue.UpdateQueueProperties()
- err = partition.AddApplication(app)
- if err == nil || partition.getApplication(appID2) != nil {
- t.Errorf("add application should have failed due to max queue
resource but did not")
- }
-
- // queue with stateaware as sort policy, with a max set larger than
placeholder ask: app add works
- err = queue.ApplyConf(configs.QueueConfig{
- Name: "default",
- Parent: false,
- Queues: nil,
- Resources: configs.Resources{Max: map[string]string{"vcore":
"20"}},
- })
- assert.NilError(t, err, "updating queue should not have failed (max
resource)")
- err = partition.AddApplication(app)
- assert.NilError(t, err, "add application to partition should not have
failed")
}
func TestRemoveApp(t *testing.T) {
diff --git a/pkg/scheduler/policies/sorting_policy.go
b/pkg/scheduler/policies/sorting_policy.go
index 99e017c6..f53cb36f 100644
--- a/pkg/scheduler/policies/sorting_policy.go
+++ b/pkg/scheduler/policies/sorting_policy.go
@@ -20,16 +20,18 @@ package policies
import (
"fmt"
+
+ "github.com/apache/yunikorn-core/pkg/log"
)
// Sort type for queues & apps.
type SortPolicy int
const (
- FifoSortPolicy SortPolicy = iota // first in first out, submit time
- FairSortPolicy // fair based on usage
- StateAwarePolicy // only 1 app in starting state
- Undefined // not initialised or parsing failed
+ FifoSortPolicy SortPolicy = iota // first in first out,
submit time
+ FairSortPolicy // fair based on usage
+ deprecatedStateAwarePolicy // deprecated: now alias
for FIFO
+ Undefined // not initialised or
parsing failed
)
func (s SortPolicy) String() string {
@@ -43,8 +45,9 @@ func SortPolicyFromString(str string) (SortPolicy, error) {
return FifoSortPolicy, nil
case FairSortPolicy.String():
return FairSortPolicy, nil
- case StateAwarePolicy.String():
- return StateAwarePolicy, nil
+ case deprecatedStateAwarePolicy.String():
+ log.Log(log.Deprecation).Warn("Sort policy 'stateaware' is
deprecated; using 'fifo' instead")
+ return FifoSortPolicy, nil
default:
return Undefined, fmt.Errorf("undefined policy: %s", str)
}
diff --git a/pkg/scheduler/policies/sorting_policy_test.go
b/pkg/scheduler/policies/sorting_policy_test.go
index 1900d34b..07b29408 100644
--- a/pkg/scheduler/policies/sorting_policy_test.go
+++ b/pkg/scheduler/policies/sorting_policy_test.go
@@ -32,7 +32,7 @@ func TestAppFromString(t *testing.T) {
{"EmptyString", "", FifoSortPolicy, false},
{"FifoString", "fifo", FifoSortPolicy, false},
{"FairString", "fair", FairSortPolicy, false},
- {"StatusString", "stateaware", StateAwarePolicy, false},
+ {"StatusString", "stateaware", FifoSortPolicy, false},
{"UnknownString", "unknown", Undefined, true},
}
for _, tt := range tests {
@@ -56,7 +56,7 @@ func TestAppToString(t *testing.T) {
}{
{"FifoString", FifoSortPolicy, "fifo"},
{"FairString", FairSortPolicy, "fair"},
- {"StatusString", StateAwarePolicy, "stateaware"},
+ {"StatusString", deprecatedStateAwarePolicy, "stateaware"},
{"DefaultString", Undefined, "undefined"},
{"NoneString", someSP, "fifo"},
}
diff --git a/pkg/webservice/handlers_test.go b/pkg/webservice/handlers_test.go
index 6745ce16..6b0f8a90 100644
--- a/pkg/webservice/handlers_test.go
+++ b/pkg/webservice/handlers_test.go
@@ -142,11 +142,11 @@ partitions:
-
name: root
properties:
- application.sort.policy: stateaware
+ application.sort.policy: fifo
childtemplate:
maxapplications: 10
properties:
- application.sort.policy: stateaware
+ application.sort.policy: fifo
resources:
guaranteed:
memory: 400000
@@ -1058,7 +1058,7 @@ func TestGetPartitionQueuesHandler(t *testing.T) {
MaxResource: tMaxResource.DAOMap(),
GuaranteedResource: tGuaranteedResource.DAOMap(),
Properties: map[string]string{
- configs.ApplicationSortPolicy:
policies.StateAwarePolicy.String(),
+ configs.ApplicationSortPolicy:
policies.FifoSortPolicy.String(),
},
}
@@ -1095,7 +1095,7 @@ func TestGetPartitionQueuesHandler(t *testing.T) {
assert.Equal(t, partitionQueuesDao.CurrentPriority, configs.MinPriority)
assert.Assert(t, partitionQueuesDao.AllocatingAcceptedApps == nil)
assert.Equal(t, len(partitionQueuesDao.Properties), 1)
- assert.Equal(t,
partitionQueuesDao.Properties[configs.ApplicationSortPolicy],
policies.StateAwarePolicy.String())
+ assert.Equal(t,
partitionQueuesDao.Properties[configs.ApplicationSortPolicy],
policies.FifoSortPolicy.String())
assert.DeepEqual(t, partitionQueuesDao.TemplateInfo, &templateInfo)
// assert child root.a fields
@@ -1119,7 +1119,7 @@ func TestGetPartitionQueuesHandler(t *testing.T) {
assert.Equal(t, child.CurrentPriority, configs.MinPriority)
assert.Assert(t, child.AllocatingAcceptedApps == nil)
assert.Equal(t, len(child.Properties), 1)
- assert.Equal(t, child.Properties[configs.ApplicationSortPolicy],
policies.StateAwarePolicy.String())
+ assert.Equal(t, child.Properties[configs.ApplicationSortPolicy],
policies.FifoSortPolicy.String())
assert.DeepEqual(t, child.TemplateInfo, &templateInfo)
// assert child root.a.a1 fields
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]