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  }