github.com/lzy4123/fabric@v2.1.1+incompatible/gossip/privdata/config.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package privdata
     8  
     9  import (
    10  	"fmt"
    11  	"time"
    12  
    13  	"github.com/spf13/viper"
    14  )
    15  
    16  const (
    17  	reconcileSleepIntervalDefault         = time.Minute
    18  	reconcileBatchSizeDefault             = 10
    19  	implicitCollectionMaxPeerCountDefault = 1
    20  )
    21  
    22  // PrivdataConfig is the struct that defines the Gossip Privdata configurations.
    23  type PrivdataConfig struct {
    24  	// ReconcileSleepInterval determines the time reconciler sleeps from end of an interation until the beginning of the next
    25  	// reconciliation iteration.
    26  	ReconcileSleepInterval time.Duration
    27  	// ReconcileBatchSize determines the maximum batch size of missing private data that will be reconciled in a single iteration.
    28  	ReconcileBatchSize int
    29  	// ReconciliationEnabled is a flag that indicates whether private data reconciliation is enabled or not.
    30  	ReconciliationEnabled bool
    31  	// ImplicitCollectionDisseminationPolicy specifies the dissemination  policy for the peer's own implicit collection.
    32  	ImplicitCollDisseminationPolicy ImplicitCollectionDisseminationPolicy
    33  }
    34  
    35  // ImplicitCollectionDisseminationPolicy specifies the dissemination  policy for the peer's own implicit collection.
    36  // It is not applicable to private data for other organizations' implicit collections.
    37  type ImplicitCollectionDisseminationPolicy struct {
    38  	// RequiredPeerCount defines the minimum number of eligible peers to which each endorsing peer must successfully
    39  	// disseminate private data for its own implicit collection. Default is 0.
    40  	RequiredPeerCount int
    41  	// MaxPeerCount defines the maximum number of eligible peers to which each endorsing peer will attempt to
    42  	// disseminate private data for its own implicit collection. Default is 1.
    43  	MaxPeerCount int
    44  }
    45  
    46  // GlobalConfig obtains a set of configuration from viper, build and returns the config struct.
    47  func GlobalConfig() *PrivdataConfig {
    48  	c := &PrivdataConfig{}
    49  	c.loadPrivDataConfig()
    50  	return c
    51  }
    52  
    53  func (c *PrivdataConfig) loadPrivDataConfig() {
    54  	c.ReconcileSleepInterval = viper.GetDuration("peer.gossip.pvtData.reconcileSleepInterval")
    55  	if c.ReconcileSleepInterval == 0 {
    56  		logger.Warning("Configuration key peer.gossip.pvtData.reconcileSleepInterval isn't set, defaulting to", reconcileSleepIntervalDefault)
    57  		c.ReconcileSleepInterval = reconcileSleepIntervalDefault
    58  	}
    59  
    60  	c.ReconcileBatchSize = viper.GetInt("peer.gossip.pvtData.reconcileBatchSize")
    61  	if c.ReconcileBatchSize == 0 {
    62  		logger.Warning("Configuration key peer.gossip.pvtData.reconcileBatchSize isn't set, defaulting to", reconcileBatchSizeDefault)
    63  		c.ReconcileBatchSize = reconcileBatchSizeDefault
    64  	}
    65  
    66  	c.ReconciliationEnabled = viper.GetBool("peer.gossip.pvtData.reconciliationEnabled")
    67  
    68  	requiredPeerCount := viper.GetInt("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.requiredPeerCount")
    69  
    70  	maxPeerCount := implicitCollectionMaxPeerCountDefault
    71  	if viper.Get("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount") != nil {
    72  		// allow override maxPeerCount to 0 that will effectively disable dissemination on the peer
    73  		maxPeerCount = viper.GetInt("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount")
    74  	}
    75  
    76  	if requiredPeerCount < 0 {
    77  		panic(fmt.Sprintf("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.requiredPeerCount (%d) cannot be less than zero",
    78  			requiredPeerCount))
    79  	}
    80  	if maxPeerCount < requiredPeerCount {
    81  		panic(fmt.Sprintf("peer.gossip.pvtData.implicitCollectionDisseminationPolicy.maxPeerCount (%d) cannot be less than requiredPeerCount (%d)",
    82  			maxPeerCount, requiredPeerCount))
    83  
    84  	}
    85  
    86  	c.ImplicitCollDisseminationPolicy.RequiredPeerCount = requiredPeerCount
    87  	c.ImplicitCollDisseminationPolicy.MaxPeerCount = maxPeerCount
    88  }