Skip to content

Commit e858f5e

Browse files
committed
[FAB-14328] de-vipererize gossip discovery
Inject configuration of discovery via struct, and not through viper getter invocations. Have the viper config at higher levels. Change-Id: I6d51256679d2ebf80eb50684dc903f3da91af76b Signed-off-by: Hagar Meir <hagar.meir@ibm.com>
1 parent 34ce4e8 commit e858f5e

File tree

9 files changed

+202
-232
lines changed

9 files changed

+202
-232
lines changed

gossip/discovery/discovery_impl.go

Lines changed: 17 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,14 @@ import (
2323
"github.com/pkg/errors"
2424
)
2525

26-
const defaultHelloInterval = time.Duration(5) * time.Second
26+
const DefAliveTimeInterval = 5 * time.Second
27+
const DefAliveExpirationTimeout = 5 * DefAliveTimeInterval
28+
const DefAliveExpirationCheckInterval = DefAliveExpirationTimeout / 10
29+
const DefReconnectInterval = DefAliveExpirationTimeout
2730
const msgExpirationFactor = 20
2831

29-
var aliveExpirationCheckInterval time.Duration
3032
var maxConnectionAttempts = 120
3133

32-
// SetAliveTimeInterval sets the alive time interval
33-
func SetAliveTimeInterval(interval time.Duration) {
34-
util.SetVal("peer.gossip.aliveTimeInterval", interval)
35-
}
36-
37-
// SetAliveExpirationTimeout sets the expiration timeout
38-
func SetAliveExpirationTimeout(timeout time.Duration) {
39-
util.SetVal("peer.gossip.aliveExpirationTimeout", timeout)
40-
aliveExpirationCheckInterval = time.Duration(timeout / 10)
41-
}
42-
43-
// SetAliveExpirationCheckInterval sets the expiration check interval
44-
func SetAliveExpirationCheckInterval(interval time.Duration) {
45-
aliveExpirationCheckInterval = interval
46-
}
47-
48-
// SetReconnectInterval sets the reconnect interval
49-
func SetReconnectInterval(interval time.Duration) {
50-
util.SetVal("peer.gossip.reconnectInterval", interval)
51-
}
52-
5334
// SetMaxConnAttempts sets the maximum number of connection
5435
// attempts the peer would perform when invoking Connect()
5536
func SetMaxConnAttempts(attempts int) {
@@ -96,8 +77,16 @@ type gossipDiscoveryImpl struct {
9677
reconnectInterval time.Duration
9778
}
9879

80+
type DiscoveryConfig struct {
81+
AliveTimeInterval time.Duration
82+
AliveExpirationTimeout time.Duration
83+
AliveExpirationCheckInterval time.Duration
84+
ReconnectInterval time.Duration
85+
}
86+
9987
// NewDiscoveryService returns a new discovery service with the comm module passed and the crypto service passed
100-
func NewDiscoveryService(self NetworkMember, comm CommService, crypt CryptoService, disPol DisclosurePolicy) Discovery {
88+
func NewDiscoveryService(self NetworkMember, comm CommService, crypt CryptoService, disPol DisclosurePolicy,
89+
config DiscoveryConfig) Discovery {
10190
d := &gossipDiscoveryImpl{
10291
self: self,
10392
incTime: uint64(time.Now().UnixNano()),
@@ -116,10 +105,10 @@ func NewDiscoveryService(self NetworkMember, comm CommService, crypt CryptoServi
116105
disclosurePolicy: disPol,
117106
pubsub: util.NewPubSub(),
118107

119-
aliveTimeInterval: getAliveTimeInterval(),
120-
aliveExpirationTimeout: getAliveExpirationTimeout(),
121-
aliveExpirationCheckInterval: getAliveExpirationCheckInterval(),
122-
reconnectInterval: getReconnectInterval(),
108+
aliveTimeInterval: config.AliveTimeInterval,
109+
aliveExpirationTimeout: config.AliveExpirationTimeout,
110+
aliveExpirationCheckInterval: config.AliveExpirationCheckInterval,
111+
reconnectInterval: config.ReconnectInterval,
123112
}
124113

125114
d.validateSelfConfig()
@@ -1017,26 +1006,6 @@ func before(a *timestamp, b *proto.PeerTime) bool {
10171006
uint64(a.incTime.UnixNano()) < b.IncNum
10181007
}
10191008

1020-
func getAliveTimeInterval() time.Duration {
1021-
return util.GetDurationOrDefault("peer.gossip.aliveTimeInterval", defaultHelloInterval)
1022-
}
1023-
1024-
func getAliveExpirationTimeout() time.Duration {
1025-
return util.GetDurationOrDefault("peer.gossip.aliveExpirationTimeout", 5*getAliveTimeInterval())
1026-
}
1027-
1028-
func getAliveExpirationCheckInterval() time.Duration {
1029-
if aliveExpirationCheckInterval != 0 {
1030-
return aliveExpirationCheckInterval
1031-
}
1032-
1033-
return time.Duration(getAliveExpirationTimeout() / 10)
1034-
}
1035-
1036-
func getReconnectInterval() time.Duration {
1037-
return util.GetDurationOrDefault("peer.gossip.reconnectInterval", getAliveExpirationTimeout())
1038-
}
1039-
10401009
type aliveMsgStore struct {
10411010
msgstore.MessageStore
10421011
}

gossip/discovery/discovery_test.go

Lines changed: 14 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,27 @@ import (
2222
"time"
2323

2424
protoG "github.com/golang/protobuf/proto"
25-
"github.com/hyperledger/fabric/core/config/configtest"
2625
"github.com/hyperledger/fabric/gossip/common"
2726
"github.com/hyperledger/fabric/gossip/gossip/msgstore"
2827
"github.com/hyperledger/fabric/gossip/util"
2928
proto "github.com/hyperledger/fabric/protos/gossip"
30-
"github.com/spf13/viper"
3129
"github.com/stretchr/testify/assert"
3230
"github.com/stretchr/testify/mock"
3331
"google.golang.org/grpc"
3432
)
3533

3634
var timeout = time.Second * time.Duration(15)
3735

36+
var aliveTimeInterval = time.Duration(time.Millisecond * 300)
37+
var config = DiscoveryConfig{
38+
AliveTimeInterval: aliveTimeInterval,
39+
AliveExpirationTimeout: 10 * aliveTimeInterval,
40+
AliveExpirationCheckInterval: aliveTimeInterval,
41+
ReconnectInterval: 10 * aliveTimeInterval,
42+
}
43+
3844
func init() {
3945
util.SetupTestLogging()
40-
aliveTimeInterval := time.Duration(time.Millisecond * 300)
41-
SetAliveTimeInterval(aliveTimeInterval)
42-
SetAliveExpirationTimeout(10 * aliveTimeInterval)
43-
SetAliveExpirationCheckInterval(aliveTimeInterval)
44-
SetReconnectInterval(10 * aliveTimeInterval)
4546
maxConnectionAttempts = 10000
4647
}
4748

@@ -383,7 +384,7 @@ func createDiscoveryInstanceThatGossipsWithInterceptors(port int, id string, boo
383384
}
384385
s := grpc.NewServer()
385386

386-
discSvc := NewDiscoveryService(self, comm, comm, pol)
387+
discSvc := NewDiscoveryService(self, comm, comm, pol, config)
387388
for _, bootPeer := range bootstrapPeers {
388389
bp := bootPeer
389390
discSvc.Connect(NetworkMember{Endpoint: bp, InternalEndpoint: bootPeer}, func() (*PeerIdentification, error) {
@@ -774,12 +775,12 @@ func TestInitiateSync(t *testing.T) {
774775
if atomic.LoadInt32(&toDie) == int32(1) {
775776
return
776777
}
777-
time.Sleep(getAliveExpirationTimeout() / 3)
778+
time.Sleep(config.AliveExpirationTimeout / 3)
778779
inst.InitiateSync(9)
779780
}
780781
}()
781782
}
782-
time.Sleep(getAliveExpirationTimeout() * 4)
783+
time.Sleep(config.AliveExpirationTimeout * 4)
783784
assertMembership(t, instances, nodeNum-1)
784785
atomic.StoreInt32(&toDie, int32(1))
785786
stopInstances(t, instances)
@@ -1040,7 +1041,7 @@ func createDisjointPeerGroupsWithNoGossip(bootPeerMap map[int]int) ([]*gossipIns
10401041
bootPeers := []string{bootPeer(bootPeerMap[port])}
10411042
pol := discPolForPeer(port)
10421043
inst := createDiscoveryInstanceWithNoGossipWithDisclosurePolicy(8610+group*5+i, id, bootPeers, pol)
1043-
inst.initiateSync(getAliveExpirationTimeout()/3, 10)
1044+
inst.initiateSync(config.AliveExpirationTimeout/3, 10)
10441045
if group == 0 {
10451046
instances1 = append(instances1, inst)
10461047
} else {
@@ -1083,44 +1084,6 @@ func discPolForPeer(selfPort int) DisclosurePolicy {
10831084
}
10841085
}
10851086

1086-
func TestConfigFromFile(t *testing.T) {
1087-
preAliveTimeInterval := getAliveTimeInterval()
1088-
preAliveExpirationTimeout := getAliveExpirationTimeout()
1089-
preAliveExpirationCheckInterval := getAliveExpirationCheckInterval()
1090-
preReconnectInterval := getReconnectInterval()
1091-
1092-
// Recover the config values in order to avoid impacting other tests
1093-
defer func() {
1094-
SetAliveTimeInterval(preAliveTimeInterval)
1095-
SetAliveExpirationTimeout(preAliveExpirationTimeout)
1096-
SetAliveExpirationCheckInterval(preAliveExpirationCheckInterval)
1097-
SetReconnectInterval(preReconnectInterval)
1098-
}()
1099-
1100-
// Verify if using default values when config is missing
1101-
viper.Reset()
1102-
aliveExpirationCheckInterval = 0 * time.Second
1103-
assert.Equal(t, time.Duration(5)*time.Second, getAliveTimeInterval())
1104-
assert.Equal(t, time.Duration(25)*time.Second, getAliveExpirationTimeout())
1105-
assert.Equal(t, time.Duration(25)*time.Second/10, getAliveExpirationCheckInterval())
1106-
assert.Equal(t, time.Duration(25)*time.Second, getReconnectInterval())
1107-
1108-
//Verify reading the values from config file
1109-
viper.Reset()
1110-
aliveExpirationCheckInterval = 0 * time.Second
1111-
viper.SetConfigName("core")
1112-
viper.SetEnvPrefix("CORE")
1113-
configtest.AddDevConfigPath(nil)
1114-
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
1115-
viper.AutomaticEnv()
1116-
err := viper.ReadInConfig()
1117-
assert.NoError(t, err)
1118-
assert.Equal(t, time.Duration(5)*time.Second, getAliveTimeInterval())
1119-
assert.Equal(t, time.Duration(25)*time.Second, getAliveExpirationTimeout())
1120-
assert.Equal(t, time.Duration(25)*time.Second/10, getAliveExpirationCheckInterval())
1121-
assert.Equal(t, time.Duration(25)*time.Second, getReconnectInterval())
1122-
}
1123-
11241087
func TestMsgStoreExpiration(t *testing.T) {
11251088
// Starts 4 instances, wait for membership to build, stop 2 instances
11261089
// Check that membership in 2 running instances become 2
@@ -1187,7 +1150,7 @@ func TestMsgStoreExpiration(t *testing.T) {
11871150
return true
11881151
}
11891152

1190-
waitUntilTimeoutOrFail(t, checkMessages, getAliveExpirationTimeout()*(msgExpirationFactor+5))
1153+
waitUntilTimeoutOrFail(t, checkMessages, config.AliveExpirationTimeout*(msgExpirationFactor+5))
11911154

11921155
assertMembership(t, instances[:len(instances)-2], nodeNum-3)
11931156

@@ -1339,7 +1302,7 @@ func TestMsgStoreExpirationWithMembershipMessages(t *testing.T) {
13391302
}
13401303

13411304
// Sleep until expire
1342-
time.Sleep(getAliveExpirationTimeout() * (msgExpirationFactor + 5))
1305+
time.Sleep(config.AliveExpirationTimeout * (msgExpirationFactor + 5))
13431306

13441307
// Checking Alive expired
13451308
for i := 0; i < peersNum; i++ {

gossip/gossip/gossip.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,10 @@ type Config struct {
145145
SendBuffSize int // Buffer size of sending messages
146146

147147
MsgExpirationTimeout time.Duration // Leadership message expiration timeout
148+
149+
AliveTimeInterval time.Duration // Alive check interval
150+
AliveExpirationTimeout time.Duration // Alive expiration timeout
151+
AliveExpirationCheckInterval time.Duration // Alive expiration check interval
152+
ReconnectInterval time.Duration // Reconnect interval
153+
148154
}

gossip/gossip/gossip_impl.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,15 @@ func NewGossipService(conf *Config, s *grpc.Server, sa api.SecurityAdvisor,
118118

119119
g.discAdapter = g.newDiscoveryAdapter()
120120
g.disSecAdap = g.newDiscoverySecurityAdapter()
121-
g.disc = discovery.NewDiscoveryService(g.selfNetworkMember(), g.discAdapter, g.disSecAdap, g.disclosurePolicy)
121+
122+
discoveryConfig := discovery.DiscoveryConfig{
123+
AliveTimeInterval: conf.AliveTimeInterval,
124+
AliveExpirationTimeout: conf.AliveExpirationTimeout,
125+
AliveExpirationCheckInterval: conf.AliveExpirationCheckInterval,
126+
ReconnectInterval: conf.ReconnectInterval,
127+
}
128+
g.disc = discovery.NewDiscoveryService(g.selfNetworkMember(), g.discAdapter, g.disSecAdap, g.disclosurePolicy,
129+
discoveryConfig)
122130
g.logger.Infof("Creating gossip service with self membership of %s", g.selfNetworkMember())
123131

124132
g.certPuller = g.createCertStorePuller()

0 commit comments

Comments
 (0)