2323#include " exceptions/ExitRequestedException.h"
2424#include " exceptions/NetworkProtocolException.h"
2525#include " exceptions/ParsingException.h"
26+ #include " exceptions/ZMQTransportException.h"
2627#include " headers/Header.h"
28+ #include " network/ZMQErrorClassifier.h"
2729#include " node/Node.h"
2830#include " utils/Time.h"
2931#include " ZMQHeaderPayloadFrame.h"
@@ -38,6 +40,17 @@ void maybeSimulateDelay( Schain& _sChain ) {
3840 usleep ( simulatedDelay * 1000 );
3941 }
4042}
43+
44+ [[noreturn]] void throwZMQCommunicationException ( const string& _message ) {
45+ auto zmqErrno = zmq_errno ();
46+ auto errorMessage = _message + " :" + string ( zmq_strerror ( zmqErrno ) );
47+
48+ if ( isZMQTransportErrorForTcpFallback ( zmqErrno ) ) {
49+ BOOST_THROW_EXCEPTION ( ZMQTransportException ( errorMessage, zmqErrno, __CLASS_NAME__ ) );
50+ }
51+
52+ BOOST_THROW_EXCEPTION ( NetworkProtocolException ( errorMessage, __CLASS_NAME__ ) );
53+ }
4154}
4255
4356ptr< vector< uint8_t > > ZMQHeaderPayloadFrame::packMessage (
@@ -110,8 +123,7 @@ void ZMQHeaderPayloadFrame::sendFrame( Schain& _sChain, void* _socket, const ptr
110123
111124 auto rc = zmq_send ( _socket, _frame->data (), _frame->size (), 0 );
112125 if ( rc < 0 ) {
113- BOOST_THROW_EXCEPTION ( NetworkProtocolException (
114- " ZMQ send failed:" + string ( zmq_strerror ( errno ) ), __CLASS_NAME__ ) );
126+ throwZMQCommunicationException ( " ZMQ send failed" );
115127 }
116128}
117129
@@ -134,8 +146,7 @@ void ZMQHeaderPayloadFrame::sendFrameToRoutingId( Schain& _sChain, void* _socket
134146 rc = zmq_msg_send ( &msg, _socket, 0 );
135147 if ( rc < 0 ) {
136148 zmq_msg_close ( &msg );
137- BOOST_THROW_EXCEPTION ( NetworkProtocolException (
138- " ZMQ send failed:" + string ( zmq_strerror ( errno ) ), __CLASS_NAME__ ) );
149+ throwZMQCommunicationException ( " ZMQ send failed" );
139150 }
140151
141152 rc = zmq_msg_close ( &msg );
@@ -154,8 +165,9 @@ ptr< vector< uint8_t > > ZMQHeaderPayloadFrame::receiveFrame(
154165
155166 rc = zmq_msg_recv ( &msg, _socket, 0 );
156167 if ( rc < 0 ) {
168+ auto zmqErrno = zmq_errno ();
157169 zmq_msg_close ( &msg );
158- if ( errno == EAGAIN ) {
170+ if ( zmqErrno == EAGAIN ) {
159171 // check if timeout happened during exit
160172 _sChain.getNode ()->exitCheck ();
161173
@@ -164,8 +176,12 @@ ptr< vector< uint8_t > > ZMQHeaderPayloadFrame::receiveFrame(
164176 return nullptr ;
165177 }
166178 }
167- BOOST_THROW_EXCEPTION ( NetworkProtocolException (
168- string ( _errorString ) + " :" + zmq_strerror ( errno ), __CLASS_NAME__ ) );
179+ auto errorMessage = string ( _errorString ) + " :" + string ( zmq_strerror ( zmqErrno ) );
180+ if ( isZMQTransportErrorForTcpFallback ( zmqErrno ) ) {
181+ BOOST_THROW_EXCEPTION (
182+ ZMQTransportException ( errorMessage, zmqErrno, __CLASS_NAME__ ) );
183+ }
184+ BOOST_THROW_EXCEPTION ( NetworkProtocolException ( errorMessage, __CLASS_NAME__ ) );
169185 }
170186
171187 auto frame = make_shared< vector< uint8_t > >( rc );
0 commit comments