You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@yunikorn.apache.org by ma...@apache.org on 2024/05/15 10:04:22 UTC

(yunikorn-k8shim) branch master updated: [YUNIKORN-2323] Gang scheduling user experience issues (#835)

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-k8shim.git


The following commit(s) were added to refs/heads/master by this push:
     new 0c90ea57 [YUNIKORN-2323] Gang scheduling user experience issues (#835)
0c90ea57 is described below

commit 0c90ea579ee13e3e998bb630d09e6dc43c89f8b4
Author: Manikandan R <ma...@gmail.com>
AuthorDate: Wed May 15 15:34:04 2024 +0530

    [YUNIKORN-2323] Gang scheduling user experience issues (#835)
    
    Closes: #835
    
    Signed-off-by: Manikandan R <ma...@gmail.com>
---
 pkg/cache/application.go      | 10 ++++++++++
 pkg/cache/application_test.go | 28 ++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/pkg/cache/application.go b/pkg/cache/application.go
index 3420cc43..b4c4f012 100644
--- a/pkg/cache/application.go
+++ b/pkg/cache/application.go
@@ -518,6 +518,10 @@ func (app *Application) onReserving() {
 // onReservationStateChange is called when there is an add or a release of a placeholder
 // If we have all the required placeholders progress the application status, otherwise nothing happens
 func (app *Application) onReservationStateChange() {
+	if app.originatingTask != nil {
+		events.GetRecorder().Eventf(app.originatingTask.GetTaskPod().DeepCopy(), nil, v1.EventTypeNormal, "GangScheduling",
+			"Placeholder Allocated", "Application %s placeholder has been allocated.", app.applicationID)
+	}
 	desireCounts := make(map[string]int32, len(app.taskGroups))
 	for _, tg := range app.taskGroups {
 		desireCounts[tg.Name] = tg.MinMember
@@ -542,6 +546,12 @@ func (app *Application) onReservationStateChange() {
 			return
 		}
 	}
+
+	if app.originatingTask != nil {
+		// Now that all placeholders has been allocated, send a final conclusion message
+		events.GetRecorder().Eventf(app.originatingTask.GetTaskPod().DeepCopy(), nil, v1.EventTypeNormal, "GangScheduling",
+			"Gang reservations completed. All placeholders are allocated.", "Application %s all placeholders are allocated. Transitioning to running state.", app.applicationID)
+	}
 	dispatcher.Dispatch(NewRunApplicationEvent(app.applicationID))
 }
 
diff --git a/pkg/cache/application_test.go b/pkg/cache/application_test.go
index 56c9e818..d6b45cb3 100644
--- a/pkg/cache/application_test.go
+++ b/pkg/cache/application_test.go
@@ -1220,6 +1220,11 @@ func TestApplication_onReservationStateChange(t *testing.T) {
 	dispatcher.Start()
 	defer dispatcher.Stop()
 
+	recorder, ok := events.GetRecorder().(*k8sEvents.FakeRecorder)
+	if !ok {
+		t.Fatal("the EventRecorder is expected to be of type FakeRecorder")
+	}
+
 	app := NewApplication(appID, "root.a", "testuser", testGroups, map[string]string{}, newMockSchedulerAPI())
 	context.addApplicationToContext(app)
 
@@ -1265,6 +1270,7 @@ func TestApplication_onReservationStateChange(t *testing.T) {
 	app.addTask(task1)
 	app.addTask(task2)
 	app.addTask(task3)
+	app.setOriginatingTask(task1)
 
 	// app stays in accepted with taskgroups defined none bound
 	app.onReservationStateChange()
@@ -1287,6 +1293,28 @@ func TestApplication_onReservationStateChange(t *testing.T) {
 	task3.setTaskGroupName("test-group-2")
 	app.onReservationStateChange()
 	assertAppState(t, app, ApplicationStates().Running, 1*time.Second)
+
+	message := "placeholder has been allocated"
+	reason := "GangScheduling"
+	counter := 0
+	// check that the event has been published
+	err := utils.WaitForCondition(func() bool {
+		for {
+			select {
+			case event := <-recorder.Events:
+				print(event)
+				if strings.Contains(event, reason) && strings.Contains(event, message) {
+					counter++
+					if counter == 4 {
+						return true
+					}
+				}
+			default:
+				return false
+			}
+		}
+	}, 5*time.Millisecond, time.Second)
+	assert.NilError(t, err, "event should have been emitted")
 }
 
 func TestTaskRemoval(t *testing.T) {


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