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  }