1
0
mirror of https://github.com/newnius/YAO-scheduler.git synced 2025-12-15 16:16:44 +00:00
This commit is contained in:
2020-05-26 20:57:22 +08:00
parent 41945726f1
commit fe6f9f2b63

View File

@@ -789,69 +789,68 @@ func (pool *ResourcePool) acquireResource(job Job) []NodeStatus {
/* assign */ /* assign */
var ress []NodeStatus var ress []NodeStatus
if len(candidates) > 0 { if len(candidates) > 0 {
for range job.Tasks { //append would cause uncertain order
ress = append(ress, NodeStatus{ClientID: "null"})
}
var nodesT []NodeStatus var nodesT []NodeStatus
for _, node := range candidates { for _, node := range candidates {
nodesT = append(nodesT, node.Copy()) nodesT = append(nodesT, node.Copy())
} }
allocation := fastBestFit(nodesT, job.Tasks) allocation := fastBestFit(nodesT, job.Tasks)
if !allocation.Flags["valid"] { if allocation.Flags["valid"] {
return []NodeStatus{}
}
for nodeID, tasks := range allocation.TasksOnNode { for range job.Tasks { //append would cause uncertain order
var node *NodeStatus ress = append(ress, NodeStatus{ClientID: "null"})
for i := range candidates {
if candidates[i].ClientID == nodeID {
node = &candidates[i]
}
} }
var available []GPUStatus for nodeID, tasks := range allocation.TasksOnNode {
for _, gpu := range node.Status { var node *NodeStatus
if gpu.MemoryAllocated == 0 { for i := range candidates {
available = append(available, gpu) if candidates[i].ClientID == nodeID {
node = &candidates[i]
}
} }
}
for _, task := range tasks {
res := NodeStatus{}
res.ClientID = node.ClientID
res.ClientHost = node.ClientHost
res.NumCPU = task.NumberCPU
res.MemTotal = task.Memory
res.Status = available[0:task.NumberGPU]
available = available[task.NumberGPU:]
for i := range res.Status { var available []GPUStatus
for j := range node.Status { for _, gpu := range node.Status {
if res.Status[i].UUID == node.Status[j].UUID { if gpu.MemoryAllocated == 0 {
if node.Status[j].MemoryAllocated == 0 { available = append(available, gpu)
pool.UsingGPUMu.Lock() }
pool.UsingGPU ++ }
pool.UsingGPUMu.Unlock() for _, task := range tasks {
res := NodeStatus{}
res.ClientID = node.ClientID
res.ClientHost = node.ClientHost
res.NumCPU = task.NumberCPU
res.MemTotal = task.Memory
res.Status = available[0:task.NumberGPU]
available = available[task.NumberGPU:]
for i := range res.Status {
for j := range node.Status {
if res.Status[i].UUID == node.Status[j].UUID {
if node.Status[j].MemoryAllocated == 0 {
pool.UsingGPUMu.Lock()
pool.UsingGPU ++
pool.UsingGPUMu.Unlock()
}
node.Status[j].MemoryAllocated += task.MemoryGPU
res.Status[i].MemoryTotal = task.MemoryGPU
} }
node.Status[j].MemoryAllocated += task.MemoryGPU
res.Status[i].MemoryTotal = task.MemoryGPU
} }
} }
} for _, t := range res.Status {
for _, t := range res.Status { pool.attach(t.UUID, job.Name)
pool.attach(t.UUID, job.Name)
}
for i := range job.Tasks {
if job.Tasks[i].Name == task.Name {
ress[i] = res
} }
for i := range job.Tasks {
if job.Tasks[i].Name == task.Name {
ress[i] = res
}
}
} }
} }
}
}
} }
for segID, lock := range locks { for segID, lock := range locks {