github.com/myafeier/fabric@v1.0.1-0.20170722181825-3a4b1f2bce86/orderer/common/server/server.go (about) 1 /* 2 Copyright IBM Corp. 2017 All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package server 8 9 import ( 10 "github.com/hyperledger/fabric/common/crypto" 11 "github.com/hyperledger/fabric/orderer/common/broadcast" 12 "github.com/hyperledger/fabric/orderer/common/deliver" 13 "github.com/hyperledger/fabric/orderer/common/msgprocessor/configupdate" 14 "github.com/hyperledger/fabric/orderer/common/multichannel" 15 ab "github.com/hyperledger/fabric/protos/orderer" 16 17 "runtime/debug" 18 ) 19 20 type configUpdateSupport struct { 21 multichannel.Manager 22 } 23 24 func (cus configUpdateSupport) GetChain(chainID string) (configupdate.Support, bool) { 25 return cus.Manager.GetChain(chainID) 26 } 27 28 type broadcastSupport struct { 29 multichannel.Manager 30 broadcast.ConfigUpdateProcessor 31 } 32 33 func (bs broadcastSupport) GetChain(chainID string) (broadcast.Support, bool) { 34 return bs.Manager.GetChain(chainID) 35 } 36 37 type deliverSupport struct { 38 multichannel.Manager 39 } 40 41 func (bs deliverSupport) GetChain(chainID string) (deliver.Support, bool) { 42 return bs.Manager.GetChain(chainID) 43 } 44 45 type server struct { 46 bh broadcast.Handler 47 dh deliver.Handler 48 } 49 50 // NewServer creates an ab.AtomicBroadcastServer based on the broadcast target and ledger Reader 51 func NewServer(ml multichannel.Manager, signer crypto.LocalSigner) ab.AtomicBroadcastServer { 52 s := &server{ 53 dh: deliver.NewHandlerImpl(deliverSupport{Manager: ml}), 54 bh: broadcast.NewHandlerImpl(broadcastSupport{ 55 Manager: ml, 56 ConfigUpdateProcessor: configupdate.New(ml.SystemChannelID(), configUpdateSupport{Manager: ml}, signer), 57 }), 58 } 59 return s 60 } 61 62 // Broadcast receives a stream of messages from a client for ordering 63 func (s *server) Broadcast(srv ab.AtomicBroadcast_BroadcastServer) error { 64 logger.Debugf("Starting new Broadcast handler") 65 defer func() { 66 if r := recover(); r != nil { 67 logger.Criticalf("Broadcast client triggered panic: %s\n%s", r, debug.Stack()) 68 } 69 logger.Debugf("Closing Broadcast stream") 70 }() 71 return s.bh.Handle(srv) 72 } 73 74 // Deliver sends a stream of blocks to a client after ordering 75 func (s *server) Deliver(srv ab.AtomicBroadcast_DeliverServer) error { 76 logger.Debugf("Starting new Deliver handler") 77 defer func() { 78 if r := recover(); r != nil { 79 logger.Criticalf("Deliver client triggered panic: %s\n%s", r, debug.Stack()) 80 } 81 logger.Debugf("Closing Deliver stream") 82 }() 83 return s.dh.Handle(srv) 84 }