Skip to content

Commit 9e05f49

Browse files
committed
Add new test to check state communication
Gossip accepts predicate to indentify condition of new messages, this commit externalize predicate for gossip anti entripy messages and adds test to ensure messages delivered correctly between peers. Change-Id: I8da7e7cafada33bf8a7087cbdd1d1b87973cb5ab Signed-off-by: Artem Barger <[email protected]>
1 parent afd3884 commit 9e05f49

File tree

2 files changed

+74
-5
lines changed

2 files changed

+74
-5
lines changed

gossip/state/state.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ var logFormat = logging.MustStringFormatter(
5151
`%{color}%{level} %{longfunc}():%{color:reset}(%{module})%{message}`,
5252
)
5353

54+
var remoteStateMsgFilter = func(message interface{}) bool {
55+
return message.(comm.ReceivedMessage).GetGossipMessage().IsRemoteStateMessage()
56+
}
57+
58+
5459
const (
5560
defPollingPeriod = 200 * time.Millisecond
5661
defAntiEntropyInterval = 10 * time.Second
@@ -89,7 +94,6 @@ type GossipStateProviderImpl struct {
8994
// NewGossipStateProvider creates initialized instance of gossip state provider
9095
func NewGossipStateProvider(chainID string, g gossip.Gossip, committer committer.Committer) GossipStateProvider {
9196
logger, _ := logging.GetLogger("GossipStateProvider")
92-
logging.SetLevel(logging.DEBUG, logger.Module)
9397

9498
gossipChan, _ := g.Accept(func(message interface{}) bool {
9599
// Get only data messages
@@ -98,9 +102,7 @@ func NewGossipStateProvider(chainID string, g gossip.Gossip, committer committer
98102
}, false)
99103

100104
// Filter message which are only relevant for state transfer
101-
_, commChan := g.Accept(func(message interface{}) bool {
102-
return message.(comm.ReceivedMessage).GetGossipMessage().IsRemoteStateMessage()
103-
}, true)
105+
_, commChan := g.Accept(remoteStateMsgFilter, true)
104106

105107
height, err := committer.LedgerHeight()
106108

@@ -139,7 +141,7 @@ func NewGossipStateProvider(chainID string, g gossip.Gossip, committer committer
139141
s.logger.Infof("Updating node metadata information, current ledger sequence is at = %d, next expected block is = %d", state.LedgerHeight, s.payloads.Next())
140142
bytes, err := state.Bytes()
141143
if err == nil {
142-
s.logger.Debug("[VVV]: Updating gossip metadate state", state)
144+
s.logger.Debug("Updating gossip metadate state", state)
143145
g.UpdateChannelMetadata(bytes, common2.ChainID(s.chainID))
144146
} else {
145147
s.logger.Errorf("Unable to serialize node meta state, error = %s", err)

gossip/state/state_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"bytes"
2121
"fmt"
2222
"strconv"
23+
"sync"
2324
"testing"
2425
"time"
2526

@@ -28,12 +29,14 @@ import (
2829
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
2930
"github.com/hyperledger/fabric/core/util"
3031
"github.com/hyperledger/fabric/gossip/api"
32+
"github.com/hyperledger/fabric/gossip/comm"
3133
"github.com/hyperledger/fabric/gossip/common"
3234
"github.com/hyperledger/fabric/gossip/gossip"
3335
"github.com/hyperledger/fabric/gossip/proto"
3436
pcomm "github.com/hyperledger/fabric/protos/common"
3537
"github.com/op/go-logging"
3638
"github.com/spf13/viper"
39+
"github.com/stretchr/testify/assert"
3740
)
3841

3942
var (
@@ -332,6 +335,70 @@ func TestNewGossipStateProvider_SendingManyMessages(t *testing.T) {
332335
}, 60*time.Second)
333336
}
334337

338+
func TestGossipStateProvider_TestStateMessages(t *testing.T) {
339+
viper.Set("peer.fileSystemPath", "/tmp/tests/ledger/node")
340+
ledgermgmt.InitializeTestEnv()
341+
defer ledgermgmt.CleanupTestEnv()
342+
343+
bootPeer := newPeerNode(newGossipConfig(0, 100), newCommitter(0))
344+
defer bootPeer.shutdown()
345+
346+
peer := newPeerNode(newGossipConfig(1, 100, 0), newCommitter(1))
347+
defer peer.shutdown()
348+
349+
_, bootCh := bootPeer.g.Accept(remoteStateMsgFilter, true)
350+
_, peerCh := peer.g.Accept(remoteStateMsgFilter, true)
351+
352+
wg := sync.WaitGroup{}
353+
wg.Add(2)
354+
355+
go func() {
356+
msg := <-bootCh
357+
logger.Info("Bootstrap node got message, ", msg)
358+
assert.True(t, msg.GetGossipMessage().GetStateRequest() != nil)
359+
msg.Respond(&proto.GossipMessage{
360+
Content: &proto.GossipMessage_StateResponse{&proto.RemoteStateResponse{nil}},
361+
})
362+
wg.Done()
363+
}()
364+
365+
go func() {
366+
msg := <-peerCh
367+
logger.Info("Peer node got an answer, ", msg)
368+
assert.True(t, msg.GetGossipMessage().GetStateResponse() != nil)
369+
wg.Done()
370+
371+
}()
372+
373+
readyCh := make(chan struct{})
374+
go func() {
375+
wg.Wait()
376+
readyCh <- struct{}{}
377+
}()
378+
379+
time.Sleep(time.Duration(5) * time.Second)
380+
logger.Info("Sending gossip message with remote state request")
381+
382+
chainID := common.ChainID(util.GetTestChainID())
383+
384+
peer.g.Send(&proto.GossipMessage{
385+
Content: &proto.GossipMessage_StateRequest{&proto.RemoteStateRequest{nil}},
386+
}, &comm.RemotePeer{peer.g.PeersOfChannel(chainID)[0].Endpoint, peer.g.PeersOfChannel(chainID)[0].PKIid})
387+
logger.Info("Waiting until peers exchange messages")
388+
389+
select {
390+
case <-readyCh:
391+
{
392+
logger.Info("[XXX]: Done!!!")
393+
394+
}
395+
case <-time.After(time.Duration(10) * time.Second):
396+
{
397+
t.Fail()
398+
}
399+
}
400+
}
401+
335402
func waitUntilTrueOrTimeout(t *testing.T, predicate func() bool, timeout time.Duration) {
336403
ch := make(chan struct{})
337404
go func() {

0 commit comments

Comments
 (0)