@@ -71,13 +71,9 @@ func (ts *timestamp) String() string {
71
71
}
72
72
73
73
type gossipDiscoveryImpl struct {
74
- pkiID common.PKIidType
75
- endpoint string
76
- incTime uint64
77
- metadata []byte
78
-
79
- seqNum uint64
80
-
74
+ incTime uint64
75
+ seqNum uint64
76
+ self NetworkMember
81
77
deadLastTS map [string ]* timestamp // H
82
78
aliveLastTS map [string ]* timestamp // V
83
79
id2Member map [string ]* NetworkMember // all known members
@@ -97,10 +93,8 @@ type gossipDiscoveryImpl struct {
97
93
// NewDiscoveryService returns a new discovery service with the comm module passed and the crypto service passed
98
94
func NewDiscoveryService (bootstrapPeers []string , self NetworkMember , comm CommService , crypt CryptoService ) Discovery {
99
95
d := & gossipDiscoveryImpl {
100
- endpoint : self . Endpoint ,
96
+ self : self ,
101
97
incTime : uint64 (time .Now ().UnixNano ()),
102
- metadata : self .Metadata ,
103
- pkiID : self .PKIid ,
104
98
seqNum : uint64 (0 ),
105
99
deadLastTS : make (map [string ]* timestamp ),
106
100
aliveLastTS : make (map [string ]* timestamp ),
@@ -109,13 +103,12 @@ func NewDiscoveryService(bootstrapPeers []string, self NetworkMember, comm CommS
109
103
Alive : make ([]* proto.GossipMessage , 0 ),
110
104
Dead : make ([]* proto.GossipMessage , 0 ),
111
105
},
112
- crypt : crypt ,
113
- bootstrapPeers : bootstrapPeers ,
114
- comm : comm ,
115
- lock : & sync.RWMutex {},
116
- toDieChan : make (chan struct {}, 1 ),
117
- toDieFlag : int32 (0 ),
118
- logger : util .GetLogger (util .LoggingDiscoveryModule , self .Endpoint ),
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 ),
119
112
}
120
113
121
114
go d .periodicalSendAlive ()
@@ -131,6 +124,15 @@ func NewDiscoveryService(bootstrapPeers []string, self NetworkMember, comm CommS
131
124
return d
132
125
}
133
126
127
+ // Exists returns whether a peer with given
128
+ // PKI-ID is known
129
+ func (d * gossipDiscoveryImpl ) Exists (PKIID common.PKIidType ) bool {
130
+ d .lock .RLock ()
131
+ defer d .lock .RUnlock ()
132
+ _ , exists := d .id2Member [string (PKIID )]
133
+ return exists
134
+ }
135
+
134
136
func (d * gossipDiscoveryImpl ) Connect (member NetworkMember ) {
135
137
d .logger .Debug ("Entering" , member )
136
138
defer d .logger .Debug ("Exiting" )
@@ -167,6 +169,9 @@ func (d *gossipDiscoveryImpl) connect2BootstrapPeers(endpoints []string) {
167
169
defer wg .Done ()
168
170
peer := & NetworkMember {
169
171
Endpoint : endpoint ,
172
+ InternalEndpoint : & proto.SignedEndpoint {
173
+ Endpoint : endpoint ,
174
+ },
170
175
}
171
176
d .comm .SendToPeer (peer , req )
172
177
}(endpoint )
@@ -192,9 +197,10 @@ func (d *gossipDiscoveryImpl) InitiateSync(peerNum int) {
192
197
for _ , i := range util .GetRandomIndices (k , n - 1 ) {
193
198
pulledPeer := d .cachedMembership .Alive [i ].GetAliveMsg ().Membership
194
199
netMember := & NetworkMember {
195
- Endpoint : pulledPeer .Endpoint ,
196
- Metadata : pulledPeer .Metadata ,
197
- PKIid : pulledPeer .PkiID ,
200
+ Endpoint : pulledPeer .Endpoint ,
201
+ Metadata : pulledPeer .Metadata ,
202
+ PKIid : pulledPeer .PkiID ,
203
+ InternalEndpoint : pulledPeer .InternalEndpoint ,
198
204
}
199
205
peers2SendTo = append (peers2SendTo , netMember )
200
206
}
@@ -285,7 +291,7 @@ func (d *gossipDiscoveryImpl) handleMsgFromComm(m *proto.GossipMessage) {
285
291
286
292
for _ , dm := range memResp .Dead {
287
293
if ! d .crypt .ValidateAliveMsg (m ) {
288
- d .logger .Warningf ("Alive message isn't authentic, someone spoofed %s's identity" , dm .GetAliveMsg ().Membership . Endpoint )
294
+ d .logger .Warningf ("Alive message isn't authentic, someone spoofed %s's identity" , dm .GetAliveMsg ().Membership )
289
295
continue
290
296
}
291
297
@@ -308,9 +314,10 @@ func (d *gossipDiscoveryImpl) sendMemResponse(member *proto.Member, known [][]by
308
314
defer d .logger .Debug ("Exiting, replying with" , memResp )
309
315
310
316
d .comm .SendToPeer (& NetworkMember {
311
- Endpoint : member .Endpoint ,
312
- Metadata : member .Metadata ,
313
- PKIid : member .PkiID ,
317
+ Endpoint : member .Endpoint ,
318
+ Metadata : member .Metadata ,
319
+ PKIid : member .PkiID ,
320
+ InternalEndpoint : member .InternalEndpoint ,
314
321
}, & proto.GossipMessage {
315
322
Tag : proto .GossipMessage_EMPTY ,
316
323
Nonce : uint64 (0 ),
@@ -353,12 +360,12 @@ func (d *gossipDiscoveryImpl) handleAliveMessage(m *proto.GossipMessage) {
353
360
defer d .logger .Debug ("Exiting" )
354
361
355
362
if ! d .crypt .ValidateAliveMsg (m ) {
356
- d .logger .Warningf ("Alive message isn't authentic, someone must be spoofing %s's identity" , m .GetAliveMsg (). Membership . Endpoint )
363
+ d .logger .Warningf ("Alive message isn't authentic, someone must be spoofing %s's identity" , m .GetAliveMsg ())
357
364
return
358
365
}
359
366
360
367
pkiID := m .GetAliveMsg ().Membership .PkiID
361
- if equalPKIid (pkiID , d .pkiID ) {
368
+ if equalPKIid (pkiID , d .self . PKIid ) {
362
369
d .logger .Debug ("Got alive message about ourselves," , m )
363
370
return
364
371
}
@@ -385,7 +392,7 @@ func (d *gossipDiscoveryImpl) handleAliveMessage(m *proto.GossipMessage) {
385
392
}
386
393
387
394
if isAlive && isDead {
388
- d .logger .Panicf ("Member %s is both alive and dead at the same time" , m .GetAliveMsg ().Membership . Endpoint )
395
+ d .logger .Panicf ("Member %s is both alive and dead at the same time" , m .GetAliveMsg ().Membership )
389
396
return
390
397
}
391
398
@@ -394,7 +401,7 @@ func (d *gossipDiscoveryImpl) handleAliveMessage(m *proto.GossipMessage) {
394
401
// resurrect peer
395
402
d .resurrectMember (m , * ts )
396
403
} else if ! same (lastDeadTS , ts ) {
397
- d .logger .Debug (m .GetAliveMsg ().Membership . Endpoint , "lastDeadTS:" , lastDeadTS , "but got ts:" , ts )
404
+ d .logger .Debug (m .GetAliveMsg ().Membership , "lastDeadTS:" , lastDeadTS , "but got ts:" , ts )
398
405
}
399
406
return
400
407
}
@@ -407,7 +414,7 @@ func (d *gossipDiscoveryImpl) handleAliveMessage(m *proto.GossipMessage) {
407
414
if before (lastAliveTS , ts ) {
408
415
d .learnExistingMembers ([]* proto.GossipMessage {m })
409
416
} else if ! same (lastAliveTS , ts ) {
410
- d .logger .Debug (m .GetAliveMsg ().Membership . Endpoint , "lastAliveTS:" , lastAliveTS , "but got ts:" , ts )
417
+ d .logger .Debug (m .GetAliveMsg ().Membership , "lastAliveTS:" , lastAliveTS , "but got ts:" , ts )
411
418
}
412
419
413
420
}
@@ -429,9 +436,10 @@ func (d *gossipDiscoveryImpl) resurrectMember(am *proto.GossipMessage, t proto.P
429
436
}
430
437
431
438
d .id2Member [string (pkiID )] = & NetworkMember {
432
- Endpoint : member .Endpoint ,
433
- Metadata : member .Metadata ,
434
- PKIid : member .PkiID ,
439
+ Endpoint : member .Endpoint ,
440
+ Metadata : member .Metadata ,
441
+ PKIid : member .PkiID ,
442
+ InternalEndpoint : member .InternalEndpoint ,
435
443
}
436
444
delete (d .deadLastTS , string (pkiID ))
437
445
@@ -570,7 +578,7 @@ func (d *gossipDiscoveryImpl) expireDeadMembers(dead []common.PKIidType) {
570
578
d .lock .Unlock ()
571
579
572
580
for _ , member2Expire := range deadMembers2Expire {
573
- d .logger .Warning ("Closing connection to" , member2Expire . Endpoint )
581
+ d .logger .Warning ("Closing connection to" , member2Expire )
574
582
d .comm .CloseConn (member2Expire )
575
583
}
576
584
}
@@ -605,9 +613,10 @@ func (d *gossipDiscoveryImpl) createAliveMessage() *proto.GossipMessage {
605
613
d .seqNum ++
606
614
seqNum := d .seqNum
607
615
608
- endpoint := d .endpoint
609
- meta := d .metadata
610
- pkiID := d .pkiID
616
+ endpoint := d .self .Endpoint
617
+ meta := d .self .Metadata
618
+ pkiID := d .self .PKIid
619
+ internalEndpoint := d .self .InternalEndpoint
611
620
612
621
d .lock .Unlock ()
613
622
@@ -616,9 +625,10 @@ func (d *gossipDiscoveryImpl) createAliveMessage() *proto.GossipMessage {
616
625
Content : & proto.GossipMessage_AliveMsg {
617
626
AliveMsg : & proto.AliveMessage {
618
627
Membership : & proto.Member {
619
- Endpoint : endpoint ,
620
- Metadata : meta ,
621
- PkiID : pkiID ,
628
+ Endpoint : endpoint ,
629
+ Metadata : meta ,
630
+ PkiID : pkiID ,
631
+ InternalEndpoint : internalEndpoint ,
622
632
},
623
633
Timestamp : & proto.PeerTime {
624
634
IncNumber : uint64 (d .incTime ),
@@ -649,14 +659,15 @@ func (d *gossipDiscoveryImpl) learnExistingMembers(aliveArr []*proto.GossipMessa
649
659
member := d .id2Member [string (am .Membership .PkiID )]
650
660
member .Endpoint = am .Membership .Endpoint
651
661
member .Metadata = am .Membership .Metadata
662
+ member .InternalEndpoint = am .Membership .InternalEndpoint
652
663
653
664
if _ , isKnownAsDead := d .deadLastTS [string (am .Membership .PkiID )]; isKnownAsDead {
654
- d .logger .Warning (am .Membership . Endpoint , "has already expired" )
665
+ d .logger .Warning (am .Membership , "has already expired" )
655
666
continue
656
667
}
657
668
658
669
if _ , isKnownAsAlive := d .aliveLastTS [string (am .Membership .PkiID )]; ! isKnownAsAlive {
659
- d .logger .Warning (am .Membership . Endpoint , "has already expired" )
670
+ d .logger .Warning (am .Membership , "has already expired" )
660
671
continue
661
672
} else {
662
673
d .logger .Debug ("Updating aliveness data:" , am )
@@ -686,7 +697,7 @@ func (d *gossipDiscoveryImpl) learnNewMembers(aliveMembers []*proto.GossipMessag
686
697
defer d .lock .Unlock ()
687
698
688
699
for _ , am := range aliveMembers {
689
- if equalPKIid (am .GetAliveMsg ().Membership .PkiID , d .pkiID ) {
700
+ if equalPKIid (am .GetAliveMsg ().Membership .PkiID , d .self . PKIid ) {
690
701
continue
691
702
}
692
703
d .aliveLastTS [string (am .GetAliveMsg ().Membership .PkiID )] = & timestamp {
@@ -700,7 +711,7 @@ func (d *gossipDiscoveryImpl) learnNewMembers(aliveMembers []*proto.GossipMessag
700
711
}
701
712
702
713
for _ , dm := range deadMembers {
703
- if equalPKIid (dm .GetAliveMsg ().Membership .PkiID , d .pkiID ) {
714
+ if equalPKIid (dm .GetAliveMsg ().Membership .PkiID , d .self . PKIid ) {
704
715
continue
705
716
}
706
717
d .deadLastTS [string (dm .GetAliveMsg ().Membership .PkiID )] = & timestamp {
@@ -722,9 +733,10 @@ func (d *gossipDiscoveryImpl) learnNewMembers(aliveMembers []*proto.GossipMessag
722
733
return
723
734
}
724
735
d .id2Member [string (member .Membership .PkiID )] = & NetworkMember {
725
- Endpoint : member .Membership .Endpoint ,
726
- Metadata : member .Membership .Metadata ,
727
- PKIid : member .Membership .PkiID ,
736
+ Endpoint : member .Membership .Endpoint ,
737
+ Metadata : member .Membership .Metadata ,
738
+ PKIid : member .Membership .PkiID ,
739
+ InternalEndpoint : member .Membership .InternalEndpoint ,
728
740
}
729
741
}
730
742
}
@@ -741,9 +753,10 @@ func (d *gossipDiscoveryImpl) GetMembership() []NetworkMember {
741
753
for _ , m := range d .cachedMembership .Alive {
742
754
member := m .GetAliveMsg ()
743
755
response = append (response , NetworkMember {
744
- PKIid : member .Membership .PkiID ,
745
- Endpoint : member .Membership .Endpoint ,
746
- Metadata : member .Membership .Metadata ,
756
+ PKIid : member .Membership .PkiID ,
757
+ Endpoint : member .Membership .Endpoint ,
758
+ Metadata : member .Membership .Metadata ,
759
+ InternalEndpoint : member .Membership .InternalEndpoint ,
747
760
})
748
761
}
749
762
return response
@@ -757,18 +770,23 @@ func tsToTime(ts uint64) time.Time {
757
770
func (d * gossipDiscoveryImpl ) UpdateMetadata (md []byte ) {
758
771
d .lock .Lock ()
759
772
defer d .lock .Unlock ()
760
- d .metadata = md
773
+ d .self . Metadata = md
761
774
}
762
775
763
776
func (d * gossipDiscoveryImpl ) UpdateEndpoint (endpoint string ) {
764
777
d .lock .Lock ()
765
778
defer d .lock .Unlock ()
766
779
767
- d .endpoint = endpoint
780
+ d .self . Endpoint = endpoint
768
781
}
769
782
770
783
func (d * gossipDiscoveryImpl ) Self () NetworkMember {
771
- return NetworkMember {Endpoint : d .endpoint , Metadata : d .metadata , PKIid : d .pkiID }
784
+ return NetworkMember {
785
+ Endpoint : d .self .Endpoint ,
786
+ Metadata : d .self .Metadata ,
787
+ PKIid : d .self .PKIid ,
788
+ InternalEndpoint : d .self .InternalEndpoint ,
789
+ }
772
790
}
773
791
774
792
func (d * gossipDiscoveryImpl ) toDie () bool {
@@ -788,7 +806,7 @@ func equalPKIid(a, b common.PKIidType) bool {
788
806
}
789
807
790
808
func same (a * timestamp , b * proto.PeerTime ) bool {
791
- return ( uint64 (a .incTime .UnixNano ()) == b .IncNumber && a .seqNum == b .SeqNum )
809
+ return uint64 (a .incTime .UnixNano ()) == b .IncNumber && a .seqNum == b .SeqNum
792
810
}
793
811
794
812
func before (a * timestamp , b * proto.PeerTime ) bool {
0 commit comments