Skip to content

Commit e977c27

Browse files
authored
Fix scheduler peer state (dragonflyoss#1267)
* fix: prevent traversal tree from infinite loop Signed-off-by: Gaius <gaius.qi@gmail.com> * fix: schedule peer state Signed-off-by: Gaius <gaius.qi@gmail.com>
1 parent 85a3237 commit e977c27

3 files changed

Lines changed: 56 additions & 7 deletions

File tree

scheduler/resource/peer.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,9 @@ func (p *Peer) ReplaceParent(parent *Peer) {
353353

354354
// Depth represents depth of tree
355355
func (p *Peer) Depth() int {
356+
p.mu.RLock()
357+
defer p.mu.RUnlock()
358+
356359
node := p
357360
var depth int
358361
for node != nil {
@@ -381,22 +384,19 @@ func (p *Peer) Depth() int {
381384

382385
// IsDescendant determines whether it is ancestor of peer
383386
func (p *Peer) IsDescendant(ancestor *Peer) bool {
384-
p.mu.RLock()
385-
defer p.mu.RUnlock()
386-
387387
return p.isDescendant(ancestor, p)
388388
}
389389

390390
// IsAncestor determines whether it is descendant of peer
391391
func (p *Peer) IsAncestor(descendant *Peer) bool {
392-
p.mu.RLock()
393-
defer p.mu.RUnlock()
394-
395392
return p.isDescendant(p, descendant)
396393
}
397394

398395
// isDescendant determines whether it is ancestor of peer
399396
func (p *Peer) isDescendant(ancestor, descendant *Peer) bool {
397+
p.mu.RLock()
398+
defer p.mu.RUnlock()
399+
400400
node := descendant
401401
for node != nil {
402402
parent, ok := node.LoadParent()

scheduler/scheduler/evaluator/evaluator_base.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ func calculateMultiElementAffinityScore(dst, src string) float64 {
177177
}
178178

179179
func (eb *evaluatorBase) IsBadNode(peer *resource.Peer) bool {
180-
if peer.FSM.Is(resource.PeerStateFailed) || peer.FSM.Is(resource.PeerStateLeave) || peer.FSM.Is(resource.PeerStatePending) {
180+
if peer.FSM.Is(resource.PeerStateFailed) || peer.FSM.Is(resource.PeerStateLeave) || peer.FSM.Is(resource.PeerStatePending) ||
181+
peer.FSM.Is(resource.PeerStateReceivedTiny) || peer.FSM.Is(resource.PeerStateReceivedSmall) || peer.FSM.Is(resource.PeerStateReceivedNormal) {
181182
peer.Log.Debugf("peer is bad node because peer status is %s", peer.FSM.Current())
182183
return true
183184
}

scheduler/scheduler/evaluator/evaluator_base_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,54 @@ func TestEvaluatorBase_IsBadNode(t *testing.T) {
593593
assert.True(isBadNode)
594594
},
595595
},
596+
{
597+
name: "peer state is PeerStatePending",
598+
peer: resource.NewPeer(mockPeerID, mockTask, mockHost),
599+
totalPieceCount: 1,
600+
mock: func(peer *resource.Peer) {
601+
peer.FSM.SetState(resource.PeerStatePending)
602+
},
603+
expect: func(t *testing.T, isBadNode bool) {
604+
assert := assert.New(t)
605+
assert.True(isBadNode)
606+
},
607+
},
608+
{
609+
name: "peer state is PeerStateReceivedTiny",
610+
peer: resource.NewPeer(mockPeerID, mockTask, mockHost),
611+
totalPieceCount: 1,
612+
mock: func(peer *resource.Peer) {
613+
peer.FSM.SetState(resource.PeerStateReceivedTiny)
614+
},
615+
expect: func(t *testing.T, isBadNode bool) {
616+
assert := assert.New(t)
617+
assert.True(isBadNode)
618+
},
619+
},
620+
{
621+
name: "peer state is PeerStateReceivedSmall",
622+
peer: resource.NewPeer(mockPeerID, mockTask, mockHost),
623+
totalPieceCount: 1,
624+
mock: func(peer *resource.Peer) {
625+
peer.FSM.SetState(resource.PeerStateReceivedSmall)
626+
},
627+
expect: func(t *testing.T, isBadNode bool) {
628+
assert := assert.New(t)
629+
assert.True(isBadNode)
630+
},
631+
},
632+
{
633+
name: "peer state is PeerStateReceivedNormal",
634+
peer: resource.NewPeer(mockPeerID, mockTask, mockHost),
635+
totalPieceCount: 1,
636+
mock: func(peer *resource.Peer) {
637+
peer.FSM.SetState(resource.PeerStateReceivedNormal)
638+
},
639+
expect: func(t *testing.T, isBadNode bool) {
640+
assert := assert.New(t)
641+
assert.True(isBadNode)
642+
},
643+
},
596644
{
597645
name: "download costs does not meet the normal distribution and last cost is twenty times more than mean",
598646
peer: resource.NewPeer(mockPeerID, mockTask, mockHost),

0 commit comments

Comments
 (0)