github.com/adnan-c/fabric_e2e_couchdb@v0.6.1-preview.0.20170228180935-21ce6b23cf91/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 // 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 a list of routing filters 43 func SelectPeers(k int, peerPool []discovery.NetworkMember, filters ...RoutingFilter) []*comm.RemotePeer { 44 var filteredPeers []*comm.RemotePeer 45 for _, peer := range peerPool { 46 if CombineRoutingFilters(filters...)(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 }