github.com/myafeier/fabric@v1.0.1-0.20170722181825-3a4b1f2bce86/gossip/filter/filter.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package filter 8 9 import ( 10 "github.com/hyperledger/fabric/gossip/comm" 11 "github.com/hyperledger/fabric/gossip/discovery" 12 "github.com/hyperledger/fabric/gossip/util" 13 ) 14 15 // RoutingFilter defines a predicate on a NetworkMember 16 // It is used to assert whether a given NetworkMember should be 17 // selected for be given a message 18 type RoutingFilter func(discovery.NetworkMember) bool 19 20 // SelectNonePolicy selects an empty set of members 21 var SelectNonePolicy = func(discovery.NetworkMember) bool { 22 return false 23 } 24 25 // SelectAllPolicy selects all members given 26 var SelectAllPolicy = func(discovery.NetworkMember) bool { 27 return true 28 } 29 30 // CombineRoutingFilters returns the logical AND of given routing filters 31 func CombineRoutingFilters(filters ...RoutingFilter) RoutingFilter { 32 return func(member discovery.NetworkMember) bool { 33 for _, filter := range filters { 34 if !filter(member) { 35 return false 36 } 37 } 38 return true 39 } 40 } 41 42 // SelectPeers returns a slice of peers that match the routing filter 43 func SelectPeers(k int, peerPool []discovery.NetworkMember, filter RoutingFilter) []*comm.RemotePeer { 44 var filteredPeers []*comm.RemotePeer 45 for _, peer := range peerPool { 46 if filter(peer) { 47 filteredPeers = append(filteredPeers, &comm.RemotePeer{PKIID: peer.PKIid, Endpoint: peer.PreferredEndpoint()}) 48 } 49 } 50 51 var indices []int 52 if len(filteredPeers) <= k { 53 indices = make([]int, len(filteredPeers)) 54 for i := 0; i < len(filteredPeers); i++ { 55 indices[i] = i 56 } 57 } else { 58 indices = util.GetRandomIndices(k, len(filteredPeers)-1) 59 } 60 61 var remotePeers []*comm.RemotePeer 62 for _, index := range indices { 63 remotePeers = append(remotePeers, filteredPeers[index]) 64 } 65 66 return remotePeers 67 }