Skip to content

Commit 88cb6cc

Browse files
author
Jason Yellick
committed
[FAB-2691] Improve Bcst/Dlvr log serviceability
https://jira.hyperledger.org/browse/FAB-2691 The orderer replies with HTTP status codes with no error text. Although in some cases this is sufficient, especially in development scenarios, the log does not provide enough information for the rejection in order to diagnose the root cause of the bad status. This CR enhances the logging of both Deliver and Broadcast to always log a verbose error if logging is enabled at debug for why a client request is being rejected. Change-Id: I4150a5c43a101d0a3d727cee1bde1aeeb8b8ada2 Signed-off-by: Jason Yellick <[email protected]>
1 parent f27a039 commit 88cb6cc

File tree

2 files changed

+66
-25
lines changed

2 files changed

+66
-25
lines changed

orderer/common/broadcast/broadcast.go

+28-11
Original file line numberDiff line numberDiff line change
@@ -85,66 +85,83 @@ func (bh *handlerImpl) Handle(srv ab.AtomicBroadcast_BroadcastServer) error {
8585

8686
payload := &cb.Payload{}
8787
err = proto.Unmarshal(msg.Payload, payload)
88-
if payload.Header == nil /* || payload.Header.ChannelHeader == nil */ {
89-
logger.Debugf("Received malformed message, dropping connection")
88+
if err != nil {
89+
if logger.IsEnabledFor(logging.WARNING) {
90+
logger.Warningf("Received malformed message, dropping connection: %s", err)
91+
}
92+
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_BAD_REQUEST})
93+
}
94+
95+
if payload.Header == nil {
96+
logger.Warningf("Received malformed message, with missing header, dropping connection")
9097
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_BAD_REQUEST})
9198
}
9299

93100
chdr, err := utils.UnmarshalChannelHeader(payload.Header.ChannelHeader)
94101
if err != nil {
95-
logger.Debugf("Received malformed message (bad channel header), dropping connection")
102+
if logger.IsEnabledFor(logging.WARNING) {
103+
logger.Warningf("Received malformed message (bad channel header), dropping connection: %s", err)
104+
}
96105
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_BAD_REQUEST})
97106
}
98107

99108
if chdr.Type == int32(cb.HeaderType_CONFIG_UPDATE) {
100109
logger.Debugf("Preprocessing CONFIG_UPDATE")
101110
msg, err = bh.sm.Process(msg)
102111
if err != nil {
112+
if logger.IsEnabledFor(logging.WARNING) {
113+
logger.Warningf("Rejecting CONFIG_UPDATE because: %s", err)
114+
}
103115
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_BAD_REQUEST})
104116
}
105117

106118
err = proto.Unmarshal(msg.Payload, payload)
107-
if payload.Header == nil {
119+
if err != nil || payload.Header == nil {
108120
logger.Criticalf("Generated bad transaction after CONFIG_UPDATE processing")
109121
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_INTERNAL_SERVER_ERROR})
110122
}
111123

112124
chdr, err = utils.UnmarshalChannelHeader(payload.Header.ChannelHeader)
113125
if err != nil {
114-
logger.Debugf("Generated bad transaction after CONFIG_UPDATE processing (bad channel header)")
115-
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_BAD_REQUEST})
126+
logger.Criticalf("Generated bad transaction after CONFIG_UPDATE processing (bad channel header): %s", err)
127+
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_INTERNAL_SERVER_ERROR})
116128
}
117129

118130
if chdr.ChannelId == "" {
119-
logger.Criticalf("Generated bad transaction after CONFIG_UPDATE processing")
131+
logger.Criticalf("Generated bad transaction after CONFIG_UPDATE processing (empty channel ID)")
120132
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_INTERNAL_SERVER_ERROR})
121133
}
122134
}
123135

124136
support, ok := bh.sm.GetChain(chdr.ChannelId)
125137
if !ok {
138+
if logger.IsEnabledFor(logging.WARNING) {
139+
logger.Warningf("Rejecting broadcast because channel %s was not found", chdr.ChannelId)
140+
}
126141
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_NOT_FOUND})
127142
}
128143

129144
if logger.IsEnabledFor(logging.DEBUG) {
130-
logger.Debugf("Broadcast is filtering message for channel %s", chdr.ChannelId)
145+
logger.Debugf("Broadcast is filtering message of type %d for channel %s", chdr.Type, chdr.ChannelId)
131146
}
132147

133148
// Normal transaction for existing chain
134149
_, filterErr := support.Filters().Apply(msg)
135150

136151
if filterErr != nil {
137-
logger.Debugf("Rejecting broadcast message")
152+
if logger.IsEnabledFor(logging.WARNING) {
153+
logger.Warningf("Rejecting broadcast message because of filter error: %s", err)
154+
}
138155
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_BAD_REQUEST})
139156
}
140157

141158
if !support.Enqueue(msg) {
142-
logger.Debugf("Consenter instructed us to shut down")
159+
logger.Infof("Consenter instructed us to shut down")
143160
return srv.Send(&ab.BroadcastResponse{Status: cb.Status_SERVICE_UNAVAILABLE})
144161
}
145162

146163
if logger.IsEnabledFor(logging.DEBUG) {
147-
logger.Debugf("Broadcast is successfully enqueued message for chain %s", chdr.ChannelId)
164+
logger.Debugf("Broadcast has successfully enqueued message of type %d for chain %s", chdr.Type, chdr.ChannelId)
148165
}
149166

150167
err = srv.Send(&ab.BroadcastResponse{Status: cb.Status_SUCCESS})

orderer/common/deliver/deliver.go

+38-14
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ limitations under the License.
1717
package deliver
1818

1919
import (
20-
"fmt"
21-
2220
"github.com/hyperledger/fabric/common/policies"
2321
"github.com/hyperledger/fabric/orderer/common/filter"
2422
"github.com/hyperledger/fabric/orderer/common/sigfilter"
@@ -69,19 +67,24 @@ func (ds *deliverServer) Handle(srv ab.AtomicBroadcast_DeliverServer) error {
6967
logger.Debugf("Attempting to read seek info message")
7068
envelope, err := srv.Recv()
7169
if err != nil {
72-
logger.Errorf("Error reading from stream: %s", err)
70+
if logger.IsEnabledFor(logging.WARNING) {
71+
logger.Warningf("Error reading from stream: %s", err)
72+
}
7373
return err
7474
}
7575
payload := &cb.Payload{}
7676
if err = proto.Unmarshal(envelope.Payload, payload); err != nil {
77-
logger.Errorf("Received an envelope with no payload: %s", err)
78-
return err
77+
if logger.IsEnabledFor(logging.WARNING) {
78+
logger.Warningf("Received an envelope with no payload: %s", err)
79+
}
80+
return sendStatusReply(srv, cb.Status_BAD_REQUEST)
7981
}
8082

81-
if payload.Header == nil /* || payload.Header.ChannelHeader == nil */ {
82-
err = fmt.Errorf("Malformed envelope received with bad header")
83-
logger.Error(err)
84-
return err
83+
if payload.Header == nil {
84+
if logger.IsEnabledFor(logging.WARNING) {
85+
logger.Warningf("Malformed envelope received with bad header")
86+
}
87+
return sendStatusReply(srv, cb.Status_BAD_REQUEST)
8588
}
8689

8790
chdr, err := utils.UnmarshalChannelHeader(payload.Header.ChannelHeader)
@@ -92,23 +95,40 @@ func (ds *deliverServer) Handle(srv ab.AtomicBroadcast_DeliverServer) error {
9295

9396
chain, ok := ds.sm.GetChain(chdr.ChannelId)
9497
if !ok {
98+
// Note, we log this at DEBUG because SDKs will poll waiting for channels to be created
99+
// So we would expect our log to be somewhat flooded with these
100+
if logger.IsEnabledFor(logging.DEBUG) {
101+
logger.Debugf("Client request for channel %s not found", chdr.ChannelId)
102+
}
95103
return sendStatusReply(srv, cb.Status_NOT_FOUND)
96104
}
97105

98106
sf := sigfilter.New(policies.ChannelReaders, chain.PolicyManager())
99107
result, _ := sf.Apply(envelope)
100108
if result != filter.Forward {
109+
if logger.IsEnabledFor(logging.WARNING) {
110+
logger.Warningf("Received unauthorized deliver request for channel %s", chdr.ChannelId)
111+
}
101112
return sendStatusReply(srv, cb.Status_FORBIDDEN)
102113
}
103114

104115
seekInfo := &ab.SeekInfo{}
105116
if err = proto.Unmarshal(payload.Data, seekInfo); err != nil {
106-
logger.Errorf("Received a signed deliver request with malformed seekInfo payload: %s", err)
107-
return err
117+
if logger.IsEnabledFor(logging.WARNING) {
118+
logger.Warningf("Received a signed deliver request with malformed seekInfo payload: %s", err)
119+
}
120+
return sendStatusReply(srv, cb.Status_BAD_REQUEST)
121+
}
122+
123+
if seekInfo.Start == nil || seekInfo.Stop == nil {
124+
if logger.IsEnabledFor(logging.WARNING) {
125+
logger.Warningf("Received seekInfo message with missing start or stop %v, %v", seekInfo.Start, seekInfo.Stop)
126+
}
127+
return sendStatusReply(srv, cb.Status_BAD_REQUEST)
108128
}
109129

110130
if logger.IsEnabledFor(logging.DEBUG) {
111-
logger.Debugf("Received seekInfo %v for chain %s", seekInfo, chdr.ChannelId)
131+
logger.Debugf("Received seekInfo (%p) %v for chain %s", seekInfo, seekInfo, chdr.ChannelId)
112132
}
113133

114134
cursor, number := chain.Reader().Iterator(seekInfo.Start)
@@ -139,7 +159,9 @@ func (ds *deliverServer) Handle(srv ab.AtomicBroadcast_DeliverServer) error {
139159
return sendStatusReply(srv, status)
140160
}
141161

142-
logger.Debugf("Delivering block")
162+
if logger.IsEnabledFor(logging.DEBUG) {
163+
logger.Debugf("Delivering block for (%p) channel: %s", seekInfo, chdr.ChannelId)
164+
}
143165
if err := sendBlockReply(srv, block); err != nil {
144166
return err
145167
}
@@ -152,7 +174,9 @@ func (ds *deliverServer) Handle(srv ab.AtomicBroadcast_DeliverServer) error {
152174
if err := sendStatusReply(srv, cb.Status_SUCCESS); err != nil {
153175
return err
154176
}
155-
logger.Debugf("Done delivering, waiting for new SeekInfo")
177+
if logger.IsEnabledFor(logging.DEBUG) {
178+
logger.Debugf("Done delivering for (%p), waiting for new SeekInfo", seekInfo)
179+
}
156180
}
157181
}
158182

0 commit comments

Comments
 (0)