1
0
mirror of https://github.com/newnius/YAO-scheduler.git synced 2025-12-15 08:16:43 +00:00
This commit is contained in:
2020-05-25 23:56:49 +08:00
parent 47e592b366
commit 3233574ab4

View File

@@ -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()
} }