@@ -107,7 +107,7 @@ static int gateway;
107
107
static bool send_heartbeat ;
108
108
static timestamp_t last_sent_heartbeat ;
109
109
static TimeoutId heartbeat_timer ;
110
- static int busy_socket ;
110
+ static nodemask_t busy_mask ;
111
111
112
112
static void MtmTransSender (Datum arg );
113
113
static void MtmTransReceiver (Datum arg );
@@ -243,23 +243,19 @@ static int MtmWaitSocket(int sd, bool forWrite, time_t timeoutMsec)
243
243
static bool MtmWriteSocket (int sd , void const * buf , int size )
244
244
{
245
245
char * src = (char * )buf ;
246
- busy_socket = sd ;
247
246
while (size != 0 ) {
248
247
int rc = MtmWaitSocket (sd , true, MtmHeartbeatSendTimeout );
249
248
if (rc == 1 ) {
250
249
while ((rc = send (sd , src , size , 0 )) < 0 && errno == EINTR );
251
250
if (rc < 0 ) {
252
- busy_socket = -1 ;
253
251
return false;
254
252
}
255
253
size -= rc ;
256
254
src += rc ;
257
255
} else if (rc < 0 ) {
258
- busy_socket = -1 ;
259
256
return false;
260
257
}
261
258
}
262
- busy_socket = -1 ;
263
259
return true;
264
260
}
265
261
@@ -271,8 +267,6 @@ static int MtmReadSocket(int sd, void* buf, int buf_size)
271
267
rc = MtmWaitSocket (sd , false, MtmHeartbeatSendTimeout );
272
268
if (rc == 1 ) {
273
269
while ((rc = recv (sd , buf , buf_size , 0 )) < 0 && errno == EINTR );
274
- } else {
275
- return 0 ;
276
270
}
277
271
}
278
272
return rc ;
@@ -365,7 +359,7 @@ static void MtmSendHeartbeat()
365
359
366
360
for (i = 0 ; i < Mtm -> nAllNodes ; i ++ )
367
361
{
368
- if (i + 1 != MtmNodeId && sockets [ i ] != busy_socket
362
+ if (i + 1 != MtmNodeId && ! BIT_CHECK ( busy_mask , i )
369
363
&& (Mtm -> status != MTM_ONLINE
370
364
|| (sockets [i ] >= 0 && !BIT_CHECK (Mtm -> disabledNodeMask , i ) && !BIT_CHECK (Mtm -> reconnectMask , i ))))
371
365
{
@@ -399,6 +393,7 @@ static int MtmConnectSocket(int node, int port, int timeout)
399
393
int sd ;
400
394
timestamp_t start = MtmGetSystemTime ();
401
395
char const * host = Mtm -> nodes [node ].con .hostName ;
396
+ nodemask_t save_mask = busy_mask ;
402
397
403
398
sock_inet .sin_family = AF_INET ;
404
399
sock_inet .sin_port = htons (port );
@@ -407,22 +402,24 @@ static int MtmConnectSocket(int node, int port, int timeout)
407
402
elog (LOG , "Arbiter failed to resolve host '%s' by name" , host );
408
403
return -1 ;
409
404
}
410
-
405
+ BIT_SET (busy_mask , node );
406
+
411
407
Retry :
412
408
while (1 ) {
413
409
int rc = -1 ;
414
410
415
411
sd = socket (AF_INET , SOCK_STREAM , 0 );
416
412
if (sd < 0 ) {
417
413
elog (LOG , "Arbiter failed to create socket: %d" , errno );
414
+ busy_mask = save_mask ;
418
415
return -1 ;
419
416
}
420
417
rc = fcntl (sd , F_SETFL , O_NONBLOCK );
421
418
if (rc < 0 ) {
422
419
elog (LOG , "Arbiter failed to switch socket to non-blocking mode: %d" , errno );
420
+ busy_mask = save_mask ;
423
421
return -1 ;
424
422
}
425
- busy_socket = sd ;
426
423
for (i = 0 ; i < n_addrs ; ++ i ) {
427
424
memcpy (& sock_inet .sin_addr , & addrs [i ], sizeof sock_inet .sin_addr );
428
425
do {
@@ -438,17 +435,17 @@ static int MtmConnectSocket(int node, int port, int timeout)
438
435
}
439
436
if (errno != EINPROGRESS || start + MSEC_TO_USEC (timeout ) < MtmGetSystemTime ()) {
440
437
elog (WARNING , "Arbiter failed to connect to %s:%d: error=%d" , host , port , errno );
441
- busy_socket = -1 ;
442
438
close (sd );
439
+ busy_mask = save_mask ;
443
440
return -1 ;
444
441
} else {
445
442
rc = MtmWaitSocket (sd , true, MtmHeartbeatSendTimeout );
446
443
if (rc == 1 ) {
447
444
socklen_t optlen = sizeof (int );
448
445
if (getsockopt (sd , SOL_SOCKET , SO_ERROR , (void * )& rc , & optlen ) < 0 ) {
449
446
elog (WARNING , "Arbiter failed to getsockopt for %s:%d: error=%d" , host , port , errno );
450
- busy_socket = -1 ;
451
447
close (sd );
448
+ busy_mask = save_mask ;
452
449
return -1 ;
453
450
}
454
451
if (rc == 0 ) {
@@ -491,6 +488,8 @@ static int MtmConnectSocket(int node, int port, int timeout)
491
488
MtmCheckResponse (& resp );
492
489
MtmUnlock ();
493
490
491
+ busy_mask = save_mask ;
492
+
494
493
return sd ;
495
494
}
496
495
@@ -533,6 +532,9 @@ static void MtmOpenConnections()
533
532
534
533
static bool MtmSendToNode (int node , void const * buf , int size )
535
534
{
535
+ bool result = true;
536
+ nodemask_t save_mask = busy_mask ;
537
+ BIT_SET (busy_mask , node );
536
538
while (true) {
537
539
if (sockets [node ] >= 0 && BIT_CHECK (Mtm -> reconnectMask , node )) {
538
540
elog (WARNING , "Arbiter is forced to reconnect to node %d" , node + 1 );
@@ -553,13 +555,17 @@ static bool MtmSendToNode(int node, void const* buf, int size)
553
555
sockets [node ] = MtmConnectSocket (node , MtmArbiterPort + node + 1 , MtmReconnectTimeout );
554
556
if (sockets [node ] < 0 ) {
555
557
MtmOnNodeDisconnect (node + 1 );
556
- return false;
558
+ result = false;
559
+ break ;
557
560
}
558
561
MTM_LOG3 ("Arbiter restablished connection with node %d" , node + 1 );
559
562
} else {
560
- return true;
563
+ result = true;
564
+ break ;
561
565
}
562
566
}
567
+ busy_mask = save_mask ;
568
+ return result ;
563
569
}
564
570
565
571
static int MtmReadFromNode (int node , void * buf , int buf_size )
0 commit comments