github.com/kchristidis/fabric@v1.0.4-0.20171028114726-837acd08cde1/gossip/filter/filter.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package filter 18 19 import ( 20 "github.com/hyperledger/fabric/gossip/comm" 21 "github.com/hyperledger/fabric/gossip/discovery" 22 "github.com/hyperledger/fabric/gossip/util" 23 ) 24 25 // RoutingFilter defines a predicate on a NetworkMember 26 // It is used to assert whether a given NetworkMember should be 27 // selected for be given a message 28 type RoutingFilter func(discovery.NetworkMember) bool 29 30 // SelectNonePolicy selects an empty set of members 31 var SelectNonePolicy = func(discovery.NetworkMember) bool { 32 return false 33 } 34 35 // SelectAllPolicy selects all members given 36 var SelectAllPolicy = func(discovery.NetworkMember) bool { 37 return true 38 } 39 40 // CombineRoutingFilters returns the logical AND of given routing filters 41 func CombineRoutingFilters(filters ...RoutingFilter) RoutingFilter { 42 return func(member discovery.NetworkMember) bool { 43 for _, filter := range filters { 44 if !filter(member) { 45 return false 46 } 47 } 48 return true 49 } 50 } 51 52 // SelectPeers returns a slice of peers that match the routing filter 53 func SelectPeers(k int, peerPool []discovery.NetworkMember, filter RoutingFilter) []*comm.RemotePeer { 54 var filteredPeers []*comm.RemotePeer 55 for _, peer := range peerPool { 56 if filter(peer) { 57 filteredPeers = append(filteredPeers, &comm.RemotePeer{PKIID: peer.PKIid, Endpoint: peer.PreferredEndpoint()}) 58 } 59 } 60 61 var indices []int 62 if len(filteredPeers) <= k { 63 indices = make([]int, len(filteredPeers)) 64 for i := 0; i < len(filteredPeers); i++ { 65 indices[i] = i 66 } 67 } else { 68 indices = util.GetRandomIndices(k, len(filteredPeers)-1) 69 } 70 71 var remotePeers []*comm.RemotePeer 72 for _, index := range indices { 73 remotePeers = append(remotePeers, filteredPeers[index]) 74 } 75 76 return remotePeers 77 }