@@ -222,18 +222,18 @@ static void MtmDisconnect(int node)
222
222
MtmOnNodeDisconnect (node + 1 );
223
223
}
224
224
225
- static int MtmWaitWriteSocket (int sd , time_t timeoutMsec )
225
+ static int MtmWaitSocket (int sd , bool forWrite , time_t timeoutMsec )
226
226
{
227
227
struct timeval tv ;
228
- fd_set out_set ;
228
+ fd_set set ;
229
229
int rc ;
230
230
tv .tv_sec = timeoutMsec /1000 ;
231
231
tv .tv_usec = timeoutMsec %1000 * 1000 ;
232
- FD_ZERO (& out_set );
233
- FD_SET (sd , & out_set );
232
+ FD_ZERO (& set );
233
+ FD_SET (sd , & set );
234
234
do {
235
235
MtmCheckHeartbeat ();
236
- } while ((rc = select (sd + 1 , NULL , & out_set , NULL , & tv )) < 0 && errno == EINTR );
236
+ } while ((rc = select (sd + 1 , forWrite ? NULL : & set , forWrite ? & set : NULL , NULL , & tv )) < 0 && errno == EINTR );
237
237
return rc ;
238
238
}
239
239
@@ -242,7 +242,7 @@ static bool MtmWriteSocket(int sd, void const* buf, int size)
242
242
char * src = (char * )buf ;
243
243
busy_socket = sd ;
244
244
while (size != 0 ) {
245
- int rc = MtmWaitWriteSocket (sd , MtmHeartbeatSendTimeout );
245
+ int rc = MtmWaitSocket (sd , true , MtmHeartbeatSendTimeout );
246
246
if (rc == 1 ) {
247
247
int n = send (sd , src , size , 0 );
248
248
if (n < 0 ) {
@@ -401,7 +401,7 @@ static int MtmConnectSocket(char const* host, int port, int max_attempts)
401
401
busy_socket = -1 ;
402
402
return -1 ;
403
403
} else {
404
- rc = MtmWaitWriteSocket (sd , MtmConnectTimeout );
404
+ rc = MtmWaitSocket (sd , true , MtmConnectTimeout );
405
405
if (rc == 1 ) {
406
406
socklen_t optlen = sizeof (int );
407
407
if (getsockopt (sd , SOL_SOCKET , SO_ERROR , (void * )& rc , & optlen ) < 0 ) {
@@ -434,7 +434,7 @@ static int MtmConnectSocket(char const* host, int port, int max_attempts)
434
434
close (sd );
435
435
goto Retry ;
436
436
}
437
- if (MtmReadSocket (sd , & resp , sizeof resp ) != sizeof (resp )) {
437
+ if (MtmWaitSocket ( sd , false, MtmHeartbeatSendTimeout ) != 1 || MtmReadSocket (sd , & resp , sizeof resp ) != sizeof (resp )) {
438
438
elog (WARNING , "Arbiter failed to receive response for handshake message from %s:%d: errno=%d" , host , port , errno );
439
439
close (sd );
440
440
goto Retry ;
0 commit comments