Skip to content

Commit b7908a3

Browse files
author
Jason Yellick
committed
[FAB-798] Factor common gRPC components from solo
As the latest step in consolidating the common logic between orderers, this changeset removes the gRPC components from solo, and distills solo to its most simple core of a 'solo consenter'. The solo consenter performs batch cutting and ordering, while the broadcast filtering and deliver logic was removed in previous changesets. Change-Id: I5f9dfe6239356279a9625a2c89d327c5da275bbc Signed-off-by: Jason Yellick <[email protected]>
1 parent 1b5d378 commit b7908a3

File tree

5 files changed

+45
-47
lines changed

5 files changed

+45
-47
lines changed

orderer/main.go

+14-7
Original file line numberDiff line numberDiff line change
@@ -199,19 +199,26 @@ func launchSolo(conf *config.TopLevel) {
199199
}
200200

201201
configManager := bootstrapConfigManager(lastConfigTx)
202+
filters := createBroadcastRuleset(configManager)
202203

203-
// XXX actually use the config manager in the future
204-
_ = configManager
205-
206-
solo.New(int(conf.General.QueueSize),
204+
soloConsenter := solo.NewConsenter(
207205
int(conf.General.BatchSize),
208-
int(conf.General.MaxWindowSize),
209206
conf.General.BatchTimeout,
210207
rawledger,
211-
grpcServer,
212-
createBroadcastRuleset(configManager),
208+
filters,
209+
configManager,
210+
)
211+
212+
server := NewServer(
213+
soloConsenter,
214+
rawledger,
215+
int(conf.General.QueueSize),
216+
int(conf.General.MaxWindowSize),
217+
filters,
213218
configManager,
214219
)
220+
221+
ab.RegisterAtomicBroadcastServer(grpcServer, server)
215222
grpcServer.Serve(lis)
216223
}
217224

orderer/rawledger/rawledger.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type Iterator interface {
3131

3232
// Reader allows the caller to inspect the raw ledger
3333
type Reader interface {
34-
// Iterator retrieves an Iterator, as specified by an cb.SeekInfo message, returning an iterator, and it's starting block number
34+
// Iterator retrieves an Iterator, as specified by an cb.SeekInfo message, returning an iterator, and its starting block number
3535
Iterator(startType ab.SeekInfo_StartType, specified uint64) (Iterator, uint64)
3636
// Height returns the highest block number in the chain, plus one
3737
Height() uint64

orderer/solo/solo.go orderer/server.go

+10-26
Original file line numberDiff line numberDiff line change
@@ -14,57 +14,41 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package solo
17+
package main
1818

1919
import (
20-
"time"
21-
2220
"github.com/hyperledger/fabric/orderer/common/broadcast"
2321
"github.com/hyperledger/fabric/orderer/common/broadcastfilter"
2422
"github.com/hyperledger/fabric/orderer/common/configtx"
2523
"github.com/hyperledger/fabric/orderer/common/deliver"
2624
"github.com/hyperledger/fabric/orderer/rawledger"
2725
ab "github.com/hyperledger/fabric/protos/orderer"
28-
29-
"github.com/op/go-logging"
30-
"google.golang.org/grpc"
3126
)
3227

33-
var logger = logging.MustGetLogger("orderer/solo")
34-
35-
func init() {
36-
logging.SetLevel(logging.DEBUG, "")
37-
}
38-
3928
type server struct {
4029
bh broadcast.Handler
41-
bs *broadcastServer
42-
ds deliver.Handler
30+
dh deliver.Handler
4331
}
4432

45-
// New creates a ab.AtomicBroadcastServer based on the solo orderer implementation
46-
func New(queueSize, batchSize, maxWindowSize int, batchTimeout time.Duration, rl rawledger.ReadWriter, grpcServer *grpc.Server, filters *broadcastfilter.RuleSet, configManager configtx.Manager) ab.AtomicBroadcastServer {
47-
logger.Infof("Starting solo with queueSize=%d, batchSize=%d batchTimeout=%v and ledger=%T", queueSize, batchSize, batchTimeout, rl)
48-
bs := newBroadcastServer(batchSize, batchTimeout, rl, filters, configManager)
49-
ds := deliver.NewHandlerImpl(rl, maxWindowSize)
50-
bh := broadcast.NewHandlerImpl(queueSize, bs, filters, configManager)
33+
// NewServer creates a ab.AtomicBroadcastServer based on the broadcast target and ledger Reader
34+
func NewServer(consenter broadcast.Target, rl rawledger.Reader, queueSize, maxWindowSize int, filters *broadcastfilter.RuleSet, configManager configtx.Manager) ab.AtomicBroadcastServer {
35+
logger.Infof("Starting orderer with consenter=%T, and ledger=%T", consenter, rl)
5136

5237
s := &server{
53-
bs: bs,
54-
ds: ds,
55-
bh: bh,
38+
dh: deliver.NewHandlerImpl(rl, maxWindowSize),
39+
bh: broadcast.NewHandlerImpl(queueSize, consenter, filters, configManager),
5640
}
57-
ab.RegisterAtomicBroadcastServer(grpcServer, s)
5841
return s
5942
}
6043

6144
// Broadcast receives a stream of messages from a client for ordering
6245
func (s *server) Broadcast(srv ab.AtomicBroadcast_BroadcastServer) error {
46+
logger.Debugf("Starting new Broadcast handler")
6347
return s.bh.Handle(srv)
6448
}
6549

6650
// Deliver sends a stream of blocks to a client after ordering
6751
func (s *server) Deliver(srv ab.AtomicBroadcast_DeliverServer) error {
68-
logger.Debugf("Starting new Deliver loop")
69-
return s.ds.Handle(srv)
52+
logger.Debugf("Starting new Deliver handler")
53+
return s.dh.Handle(srv)
7054
}

orderer/solo/broadcast.go orderer/solo/consensus.go

+15-8
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,16 @@ import (
2525
cb "github.com/hyperledger/fabric/protos/common"
2626

2727
"github.com/golang/protobuf/proto"
28+
"github.com/op/go-logging"
2829
)
2930

30-
type broadcastServer struct {
31+
var logger = logging.MustGetLogger("orderer/solo")
32+
33+
func init() {
34+
logging.SetLevel(logging.DEBUG, "")
35+
}
36+
37+
type consenter struct {
3138
batchSize int
3239
batchTimeout time.Duration
3340
rl rawledger.Writer
@@ -37,14 +44,14 @@ type broadcastServer struct {
3744
exitChan chan struct{}
3845
}
3946

40-
func newBroadcastServer(batchSize int, batchTimeout time.Duration, rl rawledger.Writer, filters *broadcastfilter.RuleSet, configManager configtx.Manager) *broadcastServer {
41-
bs := newPlainBroadcastServer(batchSize, batchTimeout, rl, filters, configManager)
47+
func NewConsenter(batchSize int, batchTimeout time.Duration, rl rawledger.Writer, filters *broadcastfilter.RuleSet, configManager configtx.Manager) *consenter {
48+
bs := newPlainConsenter(batchSize, batchTimeout, rl, filters, configManager)
4249
go bs.main()
4350
return bs
4451
}
4552

46-
func newPlainBroadcastServer(batchSize int, batchTimeout time.Duration, rl rawledger.Writer, filters *broadcastfilter.RuleSet, configManager configtx.Manager) *broadcastServer {
47-
bs := &broadcastServer{
53+
func newPlainConsenter(batchSize int, batchTimeout time.Duration, rl rawledger.Writer, filters *broadcastfilter.RuleSet, configManager configtx.Manager) *consenter {
54+
bs := &consenter{
4855
batchSize: batchSize,
4956
batchTimeout: batchTimeout,
5057
rl: rl,
@@ -56,12 +63,12 @@ func newPlainBroadcastServer(batchSize int, batchTimeout time.Duration, rl rawle
5663
return bs
5764
}
5865

59-
func (bs *broadcastServer) halt() {
66+
func (bs *consenter) halt() {
6067
close(bs.exitChan)
6168
}
6269

6370
// Enqueue accepts a message and returns true on acceptance, or false on shutdown
64-
func (bs *broadcastServer) Enqueue(env *cb.Envelope) bool {
71+
func (bs *consenter) Enqueue(env *cb.Envelope) bool {
6572
select {
6673
case bs.sendChan <- env:
6774
return true
@@ -70,7 +77,7 @@ func (bs *broadcastServer) Enqueue(env *cb.Envelope) bool {
7077
}
7178
}
7279

73-
func (bs *broadcastServer) main() {
80+
func (bs *consenter) main() {
7481
var curBatch []*cb.Envelope
7582
var timer <-chan time.Time
7683

orderer/solo/broadcast_test.go orderer/solo/consensus_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func (m *mockB) Recv() (*cb.Envelope, error) {
123123

124124
func TestEmptyBatch(t *testing.T) {
125125
filters, cm := getFiltersAndConfig()
126-
bs := newPlainBroadcastServer(1, time.Millisecond, ramledger.New(10, genesisBlock), filters, cm)
126+
bs := newPlainConsenter(1, time.Millisecond, ramledger.New(10, genesisBlock), filters, cm)
127127
if bs.rl.(rawledger.Reader).Height() != 1 {
128128
t.Fatalf("Expected no new blocks created")
129129
}
@@ -133,7 +133,7 @@ func TestBatchTimer(t *testing.T) {
133133
filters, cm := getFiltersAndConfig()
134134
batchSize := 2
135135
rl := ramledger.New(10, genesisBlock)
136-
bs := newBroadcastServer(batchSize, time.Millisecond, rl, filters, cm)
136+
bs := NewConsenter(batchSize, time.Millisecond, rl, filters, cm)
137137
defer bs.halt()
138138
it, _ := rl.Iterator(ab.SeekInfo_SPECIFIED, 1)
139139

@@ -150,7 +150,7 @@ func TestFilledBatch(t *testing.T) {
150150
filters, cm := getFiltersAndConfig()
151151
batchSize := 2
152152
messages := 10
153-
bs := newPlainBroadcastServer(batchSize, time.Hour, ramledger.New(10, genesisBlock), filters, cm)
153+
bs := newPlainConsenter(batchSize, time.Hour, ramledger.New(10, genesisBlock), filters, cm)
154154
done := make(chan struct{})
155155
go func() {
156156
bs.main()
@@ -170,7 +170,7 @@ func TestFilledBatch(t *testing.T) {
170170
func TestReconfigureGoodPath(t *testing.T) {
171171
filters, cm := getFiltersAndConfig()
172172
batchSize := 2
173-
bs := newPlainBroadcastServer(batchSize, time.Hour, ramledger.New(10, genesisBlock), filters, cm)
173+
bs := newPlainConsenter(batchSize, time.Hour, ramledger.New(10, genesisBlock), filters, cm)
174174
done := make(chan struct{})
175175
go func() {
176176
bs.main()
@@ -202,7 +202,7 @@ func TestReconfigureFailToApply(t *testing.T) {
202202
filters, cm := getFiltersAndConfig()
203203
cm.applyErr = fmt.Errorf("Fail to apply")
204204
batchSize := 2
205-
bs := newPlainBroadcastServer(batchSize, time.Hour, ramledger.New(10, genesisBlock), filters, cm)
205+
bs := newPlainConsenter(batchSize, time.Hour, ramledger.New(10, genesisBlock), filters, cm)
206206
done := make(chan struct{})
207207
go func() {
208208
bs.main()

0 commit comments

Comments
 (0)