mirror of
https://github.com/newnius/YAO-scheduler.git
synced 2025-12-15 08:16:43 +00:00
bugfix
This commit is contained in:
@@ -336,10 +336,10 @@ func (pool *ResourcePool) scaleSeg(seg *PoolSeg) {
|
|||||||
var pre *PoolSeg
|
var pre *PoolSeg
|
||||||
for i := seg.ID + pool.poolsCount - 1; i >= 0; i-- {
|
for i := seg.ID + pool.poolsCount - 1; i >= 0; i-- {
|
||||||
segIDs = append(segIDs, i%pool.poolsCount)
|
segIDs = append(segIDs, i%pool.poolsCount)
|
||||||
if pool.pools[i%pool.poolsCount].Next != seg {
|
if pool.pools[i%pool.poolsCount].Next.ID != seg.ID {
|
||||||
pre = &pool.pools[i%pool.poolsCount]
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
pre = &pool.pools[i%pool.poolsCount]
|
||||||
}
|
}
|
||||||
|
|
||||||
distance := seg.ID - pre.ID
|
distance := seg.ID - pre.ID
|
||||||
@@ -347,15 +347,19 @@ func (pool *ResourcePool) scaleSeg(seg *PoolSeg) {
|
|||||||
distance += pool.poolsCount
|
distance += pool.poolsCount
|
||||||
}
|
}
|
||||||
if distance <= 1 {
|
if distance <= 1 {
|
||||||
log.Warn("Unable to scale, already full")
|
log.Warn("Unable to scale, ", seg.ID, ", already full")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
candidate := pre
|
candidate := pre
|
||||||
/* walk to the nearest middle */
|
/* walk to the nearest middle */
|
||||||
for i := 0; i < distance/2; i++ {
|
if pre.ID < seg.ID {
|
||||||
candidate = candidate.Next
|
candidate = &pool.pools[(pre.ID+seg.ID)/2]
|
||||||
|
} else {
|
||||||
|
candidate = &pool.pools[(pre.ID+seg.ID+pool.poolsCount)/2%pool.poolsCount]
|
||||||
}
|
}
|
||||||
|
candidate.Next = seg
|
||||||
|
candidate.Nodes = map[string]*NodeStatus{}
|
||||||
|
|
||||||
/* lock in asc sequence to avoid deadlock */
|
/* lock in asc sequence to avoid deadlock */
|
||||||
sort.Ints(segIDs)
|
sort.Ints(segIDs)
|
||||||
@@ -365,8 +369,12 @@ func (pool *ResourcePool) scaleSeg(seg *PoolSeg) {
|
|||||||
log.Println(segIDs)
|
log.Println(segIDs)
|
||||||
|
|
||||||
/* update Next */
|
/* update Next */
|
||||||
for cur := pre; cur.ID != candidate.ID; {
|
for i := 0; ; i++ {
|
||||||
cur, cur.Next = cur.Next, candidate
|
id := (pre.ID + i) % pool.poolsCount
|
||||||
|
if id == candidate.ID {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
pool.pools[id].Next = candidate
|
||||||
}
|
}
|
||||||
|
|
||||||
/* move nodes */
|
/* move nodes */
|
||||||
@@ -377,7 +385,7 @@ func (pool *ResourcePool) scaleSeg(seg *PoolSeg) {
|
|||||||
if seg2.Nodes == nil {
|
if seg2.Nodes == nil {
|
||||||
seg2 = seg2.Next
|
seg2 = seg2.Next
|
||||||
}
|
}
|
||||||
if seg2 != seg {
|
if seg2.ID != seg.ID {
|
||||||
nodesToMove[node.ClientID] = node
|
nodesToMove[node.ClientID] = node
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -385,7 +393,7 @@ func (pool *ResourcePool) scaleSeg(seg *PoolSeg) {
|
|||||||
delete(seg.Nodes, node.ClientID)
|
delete(seg.Nodes, node.ClientID)
|
||||||
}
|
}
|
||||||
candidate.Nodes = nodesToMove
|
candidate.Nodes = nodesToMove
|
||||||
|
//log.Info("pre=", pre.ID, " active=", candidate.ID, " seg=", seg.ID)
|
||||||
for _, id := range segIDs {
|
for _, id := range segIDs {
|
||||||
pool.pools[id].Lock.Unlock()
|
pool.pools[id].Lock.Unlock()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user