97 lines
4.5 KiB
Go
97 lines
4.5 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
package service
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/hyperledger/fabric/gossip/election"
|
|
"github.com/hyperledger/fabric/gossip/util"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
const (
|
|
btlPullMarginDefault = 10
|
|
transientBlockRetentionDefault = 1000
|
|
)
|
|
|
|
// ServiceConfig is the config struct for gossip services
|
|
type ServiceConfig struct {
|
|
// PeerTLSEnabled enables/disables Peer TLS.
|
|
PeerTLSEnabled bool
|
|
// Endpoint which overrides the endpoint the peer publishes to peers in its organization.
|
|
Endpoint string
|
|
NonBlockingCommitMode bool
|
|
// UseLeaderElection defines whenever peer will initialize dynamic algorithm for "leader" selection.
|
|
UseLeaderElection bool
|
|
// OrgLeader statically defines peer to be an organization "leader".
|
|
OrgLeader bool
|
|
// ElectionStartupGracePeriod is the longest time peer waits for stable membership during leader
|
|
// election startup (unit: second).
|
|
ElectionStartupGracePeriod time.Duration
|
|
// ElectionMembershipSampleInterval is the time interval for gossip membership samples to check its stability (unit: second).
|
|
ElectionMembershipSampleInterval time.Duration
|
|
// ElectionLeaderAliveThreshold is the time passes since last declaration message before peer decides to
|
|
// perform leader election (unit: second).
|
|
ElectionLeaderAliveThreshold time.Duration
|
|
// ElectionLeaderElectionDuration is the time passes since last declaration message before peer decides to perform
|
|
// leader election (unit: second).
|
|
ElectionLeaderElectionDuration time.Duration
|
|
// PvtDataPullRetryThreshold determines the maximum duration of time private data corresponding for
|
|
// a given block.
|
|
PvtDataPullRetryThreshold time.Duration
|
|
// PvtDataPushAckTimeout is the maximum time to wait for the acknoledgement from each peer at private
|
|
// data push at endorsement time.
|
|
PvtDataPushAckTimeout time.Duration
|
|
// BtlPullMargin is the block to live pulling margin, used as a buffer to prevent peer from trying to pull private data
|
|
// from peers that is soon to be purged in next N blocks.
|
|
BtlPullMargin uint64
|
|
// TransientstoreMaxBlockRetention defines the maximum difference between the current ledger's height upon commit,
|
|
// and the private data residing inside the transient store that is guaranteed not to be purged.
|
|
TransientstoreMaxBlockRetention uint64
|
|
// SkipPullingInvalidTransactionsDuringCommit is a flag that indicates whether pulling of invalid
|
|
// transaction's private data from other peers need to be skipped during the commit time and pulled
|
|
// only through reconciler.
|
|
SkipPullingInvalidTransactionsDuringCommit bool
|
|
}
|
|
|
|
func GlobalConfig() *ServiceConfig {
|
|
c := &ServiceConfig{}
|
|
c.loadGossipConfig()
|
|
return c
|
|
}
|
|
|
|
func (c *ServiceConfig) loadGossipConfig() {
|
|
c.PeerTLSEnabled = viper.GetBool("peer.tls.enabled")
|
|
c.Endpoint = viper.GetString("peer.gossip.endpoint")
|
|
c.NonBlockingCommitMode = viper.GetBool("peer.gossip.nonBlockingCommitMode")
|
|
c.UseLeaderElection = viper.GetBool("peer.gossip.useLeaderElection")
|
|
c.OrgLeader = viper.GetBool("peer.gossip.orgLeader")
|
|
|
|
c.ElectionStartupGracePeriod = util.GetDurationOrDefault("peer.gossip.election.startupGracePeriod", election.DefStartupGracePeriod)
|
|
c.ElectionMembershipSampleInterval = util.GetDurationOrDefault("peer.gossip.election.membershipSampleInterval", election.DefMembershipSampleInterval)
|
|
c.ElectionLeaderAliveThreshold = util.GetDurationOrDefault("peer.gossip.election.leaderAliveThreshold", election.DefLeaderAliveThreshold)
|
|
c.ElectionLeaderElectionDuration = util.GetDurationOrDefault("peer.gossip.election.leaderElectionDuration", election.DefLeaderElectionDuration)
|
|
|
|
c.PvtDataPushAckTimeout = viper.GetDuration("peer.gossip.pvtData.pushAckTimeout")
|
|
c.PvtDataPullRetryThreshold = viper.GetDuration("peer.gossip.pvtData.pullRetryThreshold")
|
|
c.SkipPullingInvalidTransactionsDuringCommit = viper.GetBool("peer.gossip.pvtData.skipPullingInvalidTransactionsDuringCommit")
|
|
|
|
c.BtlPullMargin = btlPullMarginDefault
|
|
if viper.IsSet("peer.gossip.pvtData.btlPullMargin") {
|
|
btlMarginVal := viper.GetInt("peer.gossip.pvtData.btlPullMargin")
|
|
if btlMarginVal >= 0 {
|
|
c.BtlPullMargin = uint64(btlMarginVal)
|
|
}
|
|
}
|
|
|
|
c.TransientstoreMaxBlockRetention = uint64(viper.GetInt("peer.gossip.pvtData.transientstoreMaxBlockRetention"))
|
|
if c.TransientstoreMaxBlockRetention == 0 {
|
|
logger.Warning("Configuration key peer.gossip.pvtData.transientstoreMaxBlockRetention isn't set, defaulting to", transientBlockRetentionDefault)
|
|
c.TransientstoreMaxBlockRetention = transientBlockRetentionDefault
|
|
}
|
|
}
|