You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@yunikorn.apache.org by pb...@apache.org on 2025/06/11 11:29:29 UTC

(yunikorn-core) branch branch-1.7 updated: ADDENDUM [YUNIKORN-2772] Scheduler restart does not preserve app start time (#1019)

This is an automated email from the ASF dual-hosted git repository.

pbacsko pushed a commit to branch branch-1.7
in repository https://gitbox.apache.org/repos/asf/yunikorn-core.git


The following commit(s) were added to refs/heads/branch-1.7 by this push:
     new 2d0abdae ADDENDUM [YUNIKORN-2772] Scheduler restart does not preserve app start time (#1019)
2d0abdae is described below

commit 2d0abdae1e7bdea5b88ade6963cb4ee802ce6c5f
Author: Peter Bacsko <ba...@gmail.com>
AuthorDate: Tue Jun 10 20:56:04 2025 +0200

    ADDENDUM [YUNIKORN-2772] Scheduler restart does not preserve app start time (#1019)
    
    Closes: #1019
    
    Signed-off-by: Peter Bacsko <ba...@gmail.com>
    (cherry picked from commit d5edb7abdf65149845d1fb41b12f388003cdfa4e)
---
 pkg/scheduler/objects/application.go      |  3 +++
 pkg/scheduler/objects/application_test.go | 12 +++++++++
 pkg/scheduler/partition_test.go           | 42 +++++++++++++++++++++++++------
 pkg/scheduler/utilities_test.go           |  5 ++++
 4 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/pkg/scheduler/objects/application.go b/pkg/scheduler/objects/application.go
index 9eb0e3ed..c9e15a41 100644
--- a/pkg/scheduler/objects/application.go
+++ b/pkg/scheduler/objects/application.go
@@ -1723,6 +1723,9 @@ func (sa *Application) addAllocationInternal(allocType AllocationResultType, all
 		sa.allocatedResource = resources.Add(sa.allocatedResource, alloc.GetAllocatedResource())
 		sa.maxAllocatedResource = resources.ComponentWiseMax(sa.allocatedResource, sa.maxAllocatedResource)
 	}
+	if alloc.createTime.Before(sa.submissionTime) {
+		sa.submissionTime = alloc.createTime
+	}
 	sa.appEvents.SendNewAllocationEvent(sa.ApplicationID, alloc.allocationKey, alloc.GetAllocatedResource())
 	sa.allocations[alloc.GetAllocationKey()] = alloc
 }
diff --git a/pkg/scheduler/objects/application_test.go b/pkg/scheduler/objects/application_test.go
index 2c110330..cf79b3a6 100644
--- a/pkg/scheduler/objects/application_test.go
+++ b/pkg/scheduler/objects/application_test.go
@@ -3657,6 +3657,7 @@ func TestAppSubmissionTime(t *testing.T) {
 	assert.NilError(t, err, "queue create failed")
 	app.queue = queue
 
+	// asks
 	res := resources.NewResourceFromMap(map[string]resources.Quantity{"first": 5})
 	ask1 := newAllocationAsk(aKey, appID1, res)
 	ask1.createTime = time.Unix(0, 100)
@@ -3672,4 +3673,15 @@ func TestAppSubmissionTime(t *testing.T) {
 	err = app.AddAllocationAsk(ask3)
 	assert.NilError(t, err)
 	assert.Equal(t, app.submissionTime, time.Unix(0, 50), "app submission time is not set properly")
+
+	// allocations
+	alloc1 := newAllocation(appID1, nodeID1, res)
+	alloc1.createTime = time.Unix(0, 60)
+	app.AddAllocation(alloc1)
+	assert.Equal(t, app.submissionTime, time.Unix(0, 50), "app submission time is not set properly")
+
+	alloc2 := newAllocation(appID1, nodeID1, res)
+	alloc2.createTime = time.Unix(0, 30)
+	app.AddAllocation(alloc2)
+	assert.Equal(t, app.submissionTime, time.Unix(0, 30), "app submission time is not set properly")
 }
diff --git a/pkg/scheduler/partition_test.go b/pkg/scheduler/partition_test.go
index fb3ee7ac..a01d4599 100644
--- a/pkg/scheduler/partition_test.go
+++ b/pkg/scheduler/partition_test.go
@@ -4843,32 +4843,60 @@ func TestAppSchedulingOrderFIFO(t *testing.T) {
 	// add two asks to app2 first
 	app2AskRes := resources.NewResourceFromMap(map[string]resources.Quantity{"first": 2})
 
-	app2Ask1 := newAllocationAskAll(allocKey2, appID2, "", app2AskRes, 0, false, map[string]string{
+	app2Ask1 := newAllocationAskAll("app2-alloc-1", appID2, "", app2AskRes, 0, false, map[string]string{
 		siCommon.CreationTime: "100",
 	})
 	err = app2.AddAllocationAsk(app2Ask1)
 	assert.NilError(t, err, "could not add ask")
-	app2Ask2 := newAllocationAskAll(allocKey3, appID2, "", app2AskRes, 0, false, map[string]string{
+	app2Ask2 := newAllocationAskAll("app2-alloc-2", appID2, "", app2AskRes, 0, false, map[string]string{
 		siCommon.CreationTime: "50",
 	})
 	err = app2.AddAllocationAsk(app2Ask2)
 	assert.NilError(t, err, "could not add ask")
+	app2Ask3 := newAllocationAskAll("app2-alloc-3", appID2, "", app2AskRes, 0, false, map[string]string{
+		siCommon.CreationTime: "150",
+	})
+	err = app2.AddAllocationAsk(app2Ask3)
+	assert.NilError(t, err, "could not add ask")
 
 	askRes1 := resources.NewResourceFromMap(map[string]resources.Quantity{"first": 1})
-	ask1 := newAllocationAskAll(allocKey, appID1, "", askRes1, 0, false, map[string]string{
+	app1Ask1 := newAllocationAskAll("app1-alloc-1", appID1, "", askRes1, 0, false, map[string]string{
 		siCommon.CreationTime: "1000",
 	})
-	err = app1.AddAllocationAsk(ask1)
+	err = app1.AddAllocationAsk(app1Ask1)
+	assert.NilError(t, err, "could not add ask")
+	app1Ask2 := newAllocationAskAll("app1-alloc-2", appID1, "", askRes1, 0, false, map[string]string{
+		siCommon.CreationTime: "1100",
+	})
+	err = app1.AddAllocationAsk(app1Ask2)
 	assert.NilError(t, err, "could not add ask")
 
 	// the two asks from app2 should be scheduled
 	alloc := partition.tryAllocate()
 	assert.Assert(t, alloc != nil, "no allocation was made")
-	assert.Equal(t, allocKey3, alloc.Request.GetAllocationKey())
+	assert.Equal(t, "app2-alloc-2", alloc.Request.GetAllocationKey())
 	alloc = partition.tryAllocate()
 	assert.Assert(t, alloc != nil, "no allocation was made")
-	assert.Equal(t, allocKey2, alloc.Request.GetAllocationKey())
+	assert.Equal(t, "app2-alloc-1", alloc.Request.GetAllocationKey())
+
+	// add existing allocation to appID1 - should change scheduling order
+	allocExisting := newAllocationAllTags("allocExisting", appID1, nodeID1, "",
+		resources.NewResourceFromMap(map[string]resources.Quantity{"first": 1}), 0, false, map[string]string{
+			siCommon.CreationTime: "30", // older than app2Ask2 (alloc-3)
+		})
+	app1.AddAllocation(allocExisting)
+
+	// should schedule from app-1
+	alloc = partition.tryAllocate()
+	assert.Assert(t, alloc != nil, "no allocation was made")
+	assert.Equal(t, "app1-alloc-1", alloc.Request.GetAllocationKey())
+
+	alloc = partition.tryAllocate()
+	assert.Assert(t, alloc != nil, "no allocation was made")
+	assert.Equal(t, "app1-alloc-2", alloc.Request.GetAllocationKey())
+
+	// latest from app-2 again
 	alloc = partition.tryAllocate()
 	assert.Assert(t, alloc != nil, "no allocation was made")
-	assert.Equal(t, allocKey, alloc.Request.GetAllocationKey())
+	assert.Equal(t, "app2-alloc-3", alloc.Request.GetAllocationKey())
 }
diff --git a/pkg/scheduler/utilities_test.go b/pkg/scheduler/utilities_test.go
index 8e6a9af3..95ec88f0 100644
--- a/pkg/scheduler/utilities_test.go
+++ b/pkg/scheduler/utilities_test.go
@@ -590,6 +590,10 @@ func newAllocation(allocKey, appID, nodeID string, res *resources.Resource) *obj
 }
 
 func newAllocationAll(allocKey, appID, nodeID, taskGroup string, res *resources.Resource, prio int32, placeHolder bool) *objects.Allocation {
+	return newAllocationAllTags(allocKey, appID, nodeID, taskGroup, res, prio, placeHolder, nil)
+}
+
+func newAllocationAllTags(allocKey, appID, nodeID, taskGroup string, res *resources.Resource, prio int32, placeHolder bool, tags map[string]string) *objects.Allocation {
 	return objects.NewAllocationFromSI(&si.Allocation{
 		AllocationKey:    allocKey,
 		ApplicationID:    appID,
@@ -599,6 +603,7 @@ func newAllocationAll(allocKey, appID, nodeID, taskGroup string, res *resources.
 		Priority:         prio,
 		TaskGroupName:    taskGroup,
 		Placeholder:      placeHolder,
+		AllocationTags:   tags,
 	})
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@yunikorn.apache.org
For additional commands, e-mail: issues-help@yunikorn.apache.org