@@ -56,10 +56,6 @@ func SetReconnectInterval(interval time.Duration) {
56
56
reconnectInterval = interval
57
57
}
58
58
59
- func samePKIidAliveMessage (a interface {}, b interface {}) bool {
60
- return equalPKIid (a .(* proto.GossipMessage ).GetAliveMsg ().Membership .PkiID , b .(* proto.GossipMessage ).GetAliveMsg ().Membership .PkiID )
61
- }
62
-
63
59
type timestamp struct {
64
60
incTime time.Time
65
61
seqNum uint64
@@ -71,13 +67,14 @@ func (ts *timestamp) String() string {
71
67
}
72
68
73
69
type gossipDiscoveryImpl struct {
74
- incTime uint64
75
- seqNum uint64
76
- self NetworkMember
77
- deadLastTS map [string ]* timestamp // H
78
- aliveLastTS map [string ]* timestamp // V
79
- id2Member map [string ]* NetworkMember // all known members
80
- cachedMembership * proto.MembershipResponse
70
+ incTime uint64
71
+ seqNum uint64
72
+ self NetworkMember
73
+ deadLastTS map [string ]* timestamp // H
74
+ aliveLastTS map [string ]* timestamp // V
75
+ id2Member map [string ]* NetworkMember // all known members
76
+ aliveMembership membershipStore
77
+ deadMembership membershipStore
81
78
82
79
bootstrapPeers []string
83
80
@@ -93,22 +90,20 @@ type gossipDiscoveryImpl struct {
93
90
// NewDiscoveryService returns a new discovery service with the comm module passed and the crypto service passed
94
91
func NewDiscoveryService (bootstrapPeers []string , self NetworkMember , comm CommService , crypt CryptoService ) Discovery {
95
92
d := & gossipDiscoveryImpl {
96
- self : self ,
97
- incTime : uint64 (time .Now ().UnixNano ()),
98
- seqNum : uint64 (0 ),
99
- deadLastTS : make (map [string ]* timestamp ),
100
- aliveLastTS : make (map [string ]* timestamp ),
101
- id2Member : make (map [string ]* NetworkMember ),
102
- cachedMembership : & proto.MembershipResponse {
103
- Alive : make ([]* proto.GossipMessage , 0 ),
104
- Dead : make ([]* proto.GossipMessage , 0 ),
105
- },
106
- crypt : crypt ,
107
- comm : comm ,
108
- lock : & sync.RWMutex {},
109
- toDieChan : make (chan struct {}, 1 ),
110
- toDieFlag : int32 (0 ),
111
- logger : util .GetLogger (util .LoggingDiscoveryModule , self .InternalEndpoint .Endpoint ),
93
+ self : self ,
94
+ incTime : uint64 (time .Now ().UnixNano ()),
95
+ seqNum : uint64 (0 ),
96
+ deadLastTS : make (map [string ]* timestamp ),
97
+ aliveLastTS : make (map [string ]* timestamp ),
98
+ id2Member : make (map [string ]* NetworkMember ),
99
+ aliveMembership : make (membershipStore , 0 ),
100
+ deadMembership : make (membershipStore , 0 ),
101
+ crypt : crypt ,
102
+ comm : comm ,
103
+ lock : & sync.RWMutex {},
104
+ toDieChan : make (chan struct {}, 1 ),
105
+ toDieFlag : int32 (0 ),
106
+ logger : util .GetLogger (util .LoggingDiscoveryModule , self .InternalEndpoint .Endpoint ),
112
107
}
113
108
114
109
go d .periodicalSendAlive ()
@@ -188,14 +183,15 @@ func (d *gossipDiscoveryImpl) InitiateSync(peerNum int) {
188
183
189
184
d .lock .RLock ()
190
185
191
- n := len (d .cachedMembership . Alive )
186
+ n := len (d .aliveMembership )
192
187
k := peerNum
193
188
if k > n {
194
189
k = n
195
190
}
196
191
192
+ aliveMembersAsSlice := d .aliveMembership .ToSlice ()
197
193
for _ , i := range util .GetRandomIndices (k , n - 1 ) {
198
- pulledPeer := d . cachedMembership . Alive [i ].GetAliveMsg ().Membership
194
+ pulledPeer := aliveMembersAsSlice [i ].GetAliveMsg ().Membership
199
195
netMember := & NetworkMember {
200
196
Endpoint : pulledPeer .Endpoint ,
201
197
Metadata : pulledPeer .Metadata ,
@@ -335,7 +331,7 @@ func (d *gossipDiscoveryImpl) createMembershipResponse(known [][]byte) *proto.Me
335
331
336
332
deadPeers := []* proto.GossipMessage {}
337
333
338
- for _ , dm := range d .cachedMembership . Dead {
334
+ for _ , dm := range d .deadMembership . ToSlice () {
339
335
isKnown := false
340
336
for _ , knownPeer := range known {
341
337
if equalPKIid (knownPeer , dm .GetAliveMsg ().Membership .PkiID ) {
@@ -344,13 +340,19 @@ func (d *gossipDiscoveryImpl) createMembershipResponse(known [][]byte) *proto.Me
344
340
}
345
341
}
346
342
if ! isKnown {
347
- deadPeers = append (deadPeers , dm )
343
+ deadPeers = append (deadPeers , dm . GossipMessage )
348
344
break
349
345
}
350
346
}
351
347
348
+ aliveMembersAsSlice := d .aliveMembership .ToSlice ()
349
+ aliveSnapshot := make ([]* proto.GossipMessage , len (aliveMembersAsSlice ))
350
+ for i , msg := range aliveMembersAsSlice {
351
+ aliveSnapshot [i ] = msg .GossipMessage
352
+ }
353
+
352
354
return & proto.MembershipResponse {
353
- Alive : append (d . cachedMembership . Alive , aliveMsg ),
355
+ Alive : append (aliveSnapshot , aliveMsg ),
354
356
Dead : deadPeers ,
355
357
}
356
358
}
@@ -441,24 +443,10 @@ func (d *gossipDiscoveryImpl) resurrectMember(am *proto.GossipMessage, t proto.P
441
443
PKIid : member .PkiID ,
442
444
InternalEndpoint : member .InternalEndpoint ,
443
445
}
444
- delete (d .deadLastTS , string (pkiID ))
445
446
446
- aliveMsgWithID := & proto.GossipMessage {
447
- Content : & proto.GossipMessage_AliveMsg {
448
- AliveMsg : & proto.AliveMessage {
449
- Membership : & proto.Member {PkiID : pkiID },
450
- },
451
- },
452
- }
453
-
454
- i := util .IndexInSlice (d .cachedMembership .Dead , aliveMsgWithID , samePKIidAliveMessage )
455
- if i != - 1 {
456
- d .cachedMembership .Dead = append (d .cachedMembership .Dead [:i ], d .cachedMembership .Dead [i + 1 :]... )
457
- }
458
-
459
- if util .IndexInSlice (d .cachedMembership .Alive , am , samePKIidAliveMessage ) == - 1 {
460
- d .cachedMembership .Alive = append (d .cachedMembership .Alive , am )
461
- }
447
+ delete (d .deadLastTS , string (pkiID ))
448
+ d .deadMembership .Remove (common .PKIidType (pkiID ))
449
+ d .aliveMembership .Put (common .PKIidType (pkiID ), & message {GossipMessage : am })
462
450
}
463
451
464
452
func (d * gossipDiscoveryImpl ) periodicalReconnectToDead () {
@@ -559,19 +547,9 @@ func (d *gossipDiscoveryImpl) expireDeadMembers(dead []common.PKIidType) {
559
547
delete (d .aliveLastTS , string (pkiID ))
560
548
}
561
549
562
- aliveMsgWithPKIid := & proto.GossipMessage {
563
- Content : & proto.GossipMessage_AliveMsg {
564
- AliveMsg : & proto.AliveMessage {
565
- Membership : & proto.Member {PkiID : pkiID },
566
- },
567
- },
568
- }
569
- aliveMemberIndex := util .IndexInSlice (d .cachedMembership .Alive , aliveMsgWithPKIid , samePKIidAliveMessage )
570
- if aliveMemberIndex != - 1 {
571
- // Move the alive member to the dead members
572
- d .cachedMembership .Dead = append (d .cachedMembership .Dead , d .cachedMembership .Alive [aliveMemberIndex ])
573
- // Delete the alive member from the cached membership
574
- d .cachedMembership .Alive = append (d .cachedMembership .Alive [:aliveMemberIndex ], d .cachedMembership .Alive [aliveMemberIndex + 1 :]... )
550
+ if am := d .aliveMembership .msgByID (pkiID ); am != nil {
551
+ d .deadMembership .Put (pkiID , am )
552
+ d .aliveMembership .Remove (pkiID )
575
553
}
576
554
}
577
555
@@ -677,13 +655,12 @@ func (d *gossipDiscoveryImpl) learnExistingMembers(aliveArr []*proto.GossipMessa
677
655
alive .lastSeen = time .Now ()
678
656
alive .seqNum = am .Timestamp .SeqNum
679
657
680
- i := util .IndexInSlice (d .cachedMembership .Alive , m , samePKIidAliveMessage )
681
- if i == - 1 {
658
+ if am := d .aliveMembership .msgByID (m .GetAliveMsg ().Membership .PkiID ); am == nil {
682
659
d .logger .Debug ("Appended" , am , "to d.cachedMembership.Alive" )
683
- d .cachedMembership . Alive = append ( d . cachedMembership . Alive , m )
660
+ d .aliveMembership . Put ( m . GetAliveMsg (). Membership . PkiID , & message { GossipMessage : m } )
684
661
} else {
685
662
d .logger .Debug ("Replaced" , am , "in d.cachedMembership.Alive" )
686
- d . cachedMembership . Alive [ i ] = m
663
+ am . GossipMessage = m
687
664
}
688
665
}
689
666
}
@@ -706,7 +683,7 @@ func (d *gossipDiscoveryImpl) learnNewMembers(aliveMembers []*proto.GossipMessag
706
683
seqNum : am .GetAliveMsg ().Timestamp .SeqNum ,
707
684
}
708
685
709
- d .cachedMembership . Alive = append ( d . cachedMembership . Alive , am )
686
+ d .aliveMembership . Put ( am . GetAliveMsg (). Membership . PkiID , & message { GossipMessage : am } )
710
687
d .logger .Infof ("Learned about a new alive member: %v" , am )
711
688
}
712
689
@@ -720,7 +697,7 @@ func (d *gossipDiscoveryImpl) learnNewMembers(aliveMembers []*proto.GossipMessag
720
697
seqNum : dm .GetAliveMsg ().Timestamp .SeqNum ,
721
698
}
722
699
723
- d .cachedMembership . Dead = append ( d . cachedMembership . Dead , dm )
700
+ d .deadMembership . Put ( dm . GetAliveMsg (). Membership . PkiID , & message { GossipMessage : dm } )
724
701
d .logger .Infof ("Learned about a new dead member: %v" , dm )
725
702
}
726
703
@@ -750,7 +727,7 @@ func (d *gossipDiscoveryImpl) GetMembership() []NetworkMember {
750
727
defer d .lock .RUnlock ()
751
728
752
729
response := []NetworkMember {}
753
- for _ , m := range d .cachedMembership . Alive {
730
+ for _ , m := range d .aliveMembership . ToSlice () {
754
731
member := m .GetAliveMsg ()
755
732
response = append (response , NetworkMember {
756
733
PKIid : member .Membership .PkiID ,
0 commit comments