Skip to content

Commit

Permalink
Allow the peer delivery client to select between the Deliverer or BFT…
Browse files Browse the repository at this point in the history
…Delivere

Signed-off-by: Emil Elizarov <emil.elizarov@ibm.com>
  • Loading branch information
Emil Elizarov committed May 22, 2024
1 parent 810b465 commit cfc4846
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 2 deletions.
19 changes: 19 additions & 0 deletions core/deliverservice/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package deliverservice
import (
"encoding/pem"
"os"
"slices"
"time"

"github.com/hyperledger/fabric/common/deliverclient/orderers"
Expand All @@ -25,6 +26,7 @@ const (
DefaultConnectionTimeout = time.Second * 3
DefaultBlockCensorshipTimeoutKey = time.Second * 30
DefaultMinimalReconnectInterval = time.Millisecond * 100
DefaultPolicy = "cluster"
)

// DeliverServiceConfig is the struct that defines the deliverservice configuration.
Expand Down Expand Up @@ -52,6 +54,7 @@ type DeliverServiceConfig struct {
// OrdererEndpointOverrides is a map of orderer addresses which should be
// re-mapped to a different orderer endpoint.
OrdererEndpointOverrides map[string]*orderers.Endpoint
Policy string
}

type AddressOverride struct {
Expand Down Expand Up @@ -207,4 +210,20 @@ func (c *DeliverServiceConfig) loadDeliverServiceConfig() {
}

c.OrdererEndpointOverrides = overridesMap

policyKey := "peer.deliveryclient.policy"
policyMissing := !viper.IsSet(policyKey)
policy := DefaultPolicy
if policyMissing {
logger.Infof("%s is not set, defaulting to %s.", policyKey, policy)
} else {
policy = viper.GetString(policyKey)
validPolicies := []string{"simple", "cluster"}
if !slices.Contains(validPolicies, policy) {
logger.Warnf("%s is set to \"%s\" which is not valid policy, defaulting to \"%s\"", policyKey, policy, DefaultPolicy)
policy = DefaultPolicy
}
}

c.Policy = policy
}
4 changes: 4 additions & 0 deletions core/deliverservice/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ func TestGlobalConfig(t *testing.T) {
viper.Set("peer.keepalive.deliveryClient.timeout", "2s")
viper.Set("peer.deliveryclient.blockCensorshipTimeoutKey", "40s")
viper.Set("peer.deliveryclient.minimalReconnectInterval", "110ms")
viper.Set("peer.deliveryclient.policy", "simple")

coreConfig := deliverservice.GlobalConfig()

Expand All @@ -110,6 +111,7 @@ func TestGlobalConfig(t *testing.T) {
SecOpts: comm.SecureOptions{
UseTLS: true,
},
Policy: "simple",
}

require.Equal(t, expectedConfig, coreConfig)
Expand All @@ -130,6 +132,7 @@ func TestGlobalConfigDefault(t *testing.T) {
KeepaliveOptions: comm.DefaultKeepaliveOptions,
BlockCensorshipTimeoutKey: deliverservice.DefaultBlockCensorshipTimeoutKey,
MinimalReconnectInterval: deliverservice.DefaultMinimalReconnectInterval,
Policy: deliverservice.DefaultPolicy,
}

require.Equal(t, expectedConfig, coreConfig)
Expand Down Expand Up @@ -265,6 +268,7 @@ func TestGlobalConfigCheckDefaultIsSet(t *testing.T) {
KeepaliveOptions: comm.DefaultKeepaliveOptions,
BlockCensorshipTimeoutKey: deliverservice.DefaultBlockCensorshipTimeoutKey,
MinimalReconnectInterval: deliverservice.DefaultMinimalReconnectInterval,
Policy: deliverservice.DefaultPolicy,
}

require.Equal(t, coreConfig, expectedConfig)
Expand Down
15 changes: 13 additions & 2 deletions core/deliverservice/deliveryclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,14 +128,25 @@ func (d *deliverServiceImpl) StartDeliverForChannel(chainID string, ledgerInfo b
return errors.Errorf("failed to create block deliverer for channel `%s`, missing OrdererConfig", chainID)
}

createCftDeliverer := false
switch ct := oc.ConsensusType(); ct {
case "etcdraft":
d.blockDeliverer, err = d.createBlockDelivererCFT(chainID, ledgerInfo)
createCftDeliverer = true
case "BFT":
d.blockDeliverer, err = d.createBlockDelivererBFT(chainID, ledgerInfo)
switch d.conf.DeliverServiceConfig.Policy {
case "cluster", "":
d.blockDeliverer, err = d.createBlockDelivererBFT(chainID, ledgerInfo)
case "simple":
createCftDeliverer = true
default:
err = errors.Errorf("unexpected delivey service policy: `%s`", d.conf.DeliverServiceConfig.Policy)
}
default:
err = errors.Errorf("unexpected consensus type: `%s`", ct)
}
if createCftDeliverer {
d.blockDeliverer, err = d.createBlockDelivererCFT(chainID, ledgerInfo)
}

if err != nil {
return err
Expand Down
6 changes: 6 additions & 0 deletions sampleconfig/core.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,12 @@ peer:
# to:
# caCertsFile:

# Determines which delivery client will be used when consensus type is "BFT"
# (when consensus type is "etcdraft" this key is ignored).
# "simple" - use CFT deliverer
# "cluster" - use BFT deliverer
policy: cluster

# Type for the local MSP - by default it's of type bccsp
localMspType: bccsp

Expand Down

0 comments on commit cfc4846

Please sign in to comment.