48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
|
package libp2p
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/libp2p/go-libp2p-core/peer"
|
||
|
"github.com/pkg/errors"
|
||
|
|
||
|
"github.com/libp2p/test-plans/dht/utils"
|
||
|
"github.com/testground/sdk-go/sync"
|
||
|
)
|
||
|
|
||
|
func ShareAddresses(ctx context.Context, ri *utils.RunInfo, nodeInfo *NodeInfo) (map[peer.ID]*NodeInfo, error) {
|
||
|
otherNodes := make(map[peer.ID]*NodeInfo)
|
||
|
|
||
|
subCtx, cancel := context.WithCancel(ctx)
|
||
|
defer cancel()
|
||
|
attribCh := make(chan *NodeInfo)
|
||
|
if _, _, err := ri.Client.PublishSubscribe(subCtx, PeerAttribTopic, nodeInfo, attribCh); err != nil {
|
||
|
return nil, errors.Wrap(err, "peer attrib publish/subscribe failure")
|
||
|
}
|
||
|
|
||
|
for i := 0; i < ri.RunEnv.TestInstanceCount; i++ {
|
||
|
select {
|
||
|
case info := <-attribCh:
|
||
|
if info.Seq == nodeInfo.Seq {
|
||
|
continue
|
||
|
}
|
||
|
otherNodes[info.Addrs.ID] = info
|
||
|
case <-ctx.Done():
|
||
|
return nil, ctx.Err()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return otherNodes, nil
|
||
|
}
|
||
|
|
||
|
type NodeInfo struct {
|
||
|
Seq int // sequence number within the test
|
||
|
GroupSeq int // sequence number within the test group
|
||
|
Group string
|
||
|
Addrs *peer.AddrInfo
|
||
|
}
|
||
|
|
||
|
// PeerAttribTopic represents a subtree under the test run's sync tree where peers
|
||
|
// participating in this distributed test advertise their attributes.
|
||
|
var PeerAttribTopic = sync.NewTopic("attribs", &NodeInfo{})
|