56
56
#include "replication/slot.h"
57
57
#include "port/atomics.h"
58
58
#include "tcop/utility.h"
59
+ #include "libpq/ip.h"
59
60
60
61
#ifndef USE_EPOLL
61
62
#ifdef __linux__
@@ -139,31 +140,6 @@ void MtmArbiterInitialize(void)
139
140
RegisterBackgroundWorker (& MtmMonitorWorker );
140
141
}
141
142
142
- static int
143
- MtmResolveHostByName (const char * hostname , unsigned * addrs , unsigned * n_addrs )
144
- {
145
- struct sockaddr_in sin ;
146
- struct hostent * hp ;
147
- unsigned i ;
148
-
149
- sin .sin_addr .s_addr = inet_addr (hostname );
150
- if (sin .sin_addr .s_addr != INADDR_NONE ) {
151
- memcpy (& addrs [0 ], & sin .sin_addr .s_addr , sizeof (sin .sin_addr .s_addr ));
152
- * n_addrs = 1 ;
153
- return 1 ;
154
- }
155
-
156
- hp = gethostbyname (hostname );
157
- if (hp == NULL || hp -> h_addrtype != AF_INET ) {
158
- return 0 ;
159
- }
160
- for (i = 0 ; hp -> h_addr_list [i ] != NULL && i < * n_addrs ; i ++ ) {
161
- memcpy (& addrs [i ], hp -> h_addr_list [i ], sizeof (addrs [i ]));
162
- }
163
- * n_addrs = i ;
164
- return 1 ;
165
- }
166
-
167
143
static int stop = 0 ;
168
144
static void SetStop (int sig )
169
145
{
@@ -352,7 +328,6 @@ static void MtmCheckResponse(MtmArbiterMessage* resp)
352
328
353
329
static void MtmScheduleHeartbeat ()
354
330
{
355
- // Assert(!last_sent_heartbeat || last_sent_heartbeat + MSEC_TO_USEC(MtmHeartbeatRecvTimeout) >= MtmGetSystemTime());
356
331
if (!stop ) {
357
332
enable_timeout_after (heartbeat_timer , MtmHeartbeatSendTimeout );
358
333
send_heartbeat = true;
@@ -399,7 +374,6 @@ static void MtmSendHeartbeat()
399
374
close (sockets [i ]);
400
375
sockets [i ] = -1 ;
401
376
MtmReconnectNode (i + 1 ); /* set reconnect mask to force node reconnent */
402
- //MtmOnNodeConnect(i+1);
403
377
}
404
378
MTM_LOG4 ("Send heartbeat to node %d with timestamp %lld" , i + 1 , now );
405
379
}
@@ -426,23 +400,31 @@ void MtmCheckHeartbeat()
426
400
427
401
static int MtmConnectSocket (int node , int port , time_t timeout )
428
402
{
429
- struct sockaddr_in sock_inet ;
430
- unsigned addrs [MAX_ROUTES ];
431
- unsigned i , n_addrs = sizeof (addrs ) / sizeof (addrs [0 ]);
403
+ struct addrinfo * addrs = NULL ;
404
+ struct addrinfo * addr ;
405
+ struct addrinfo hint ;
406
+ char portstr [MAXPGPATH ];
432
407
MtmHandshakeMessage req ;
433
408
MtmArbiterMessage resp ;
434
409
int sd ;
410
+ int ret ;
435
411
timestamp_t start = MtmGetSystemTime ();
436
412
char const * host = Mtm -> nodes [node ].con .hostName ;
437
413
nodemask_t save_mask = busy_mask ;
438
414
timestamp_t afterWait ;
439
415
timestamp_t beforeWait ;
440
416
441
- sock_inet .sin_family = AF_INET ;
442
- sock_inet .sin_port = htons (port );
417
+ /* Initialize hint structure */
418
+ MemSet (& hint , 0 , sizeof (hint ));
419
+ hint .ai_socktype = SOCK_STREAM ;
420
+ hint .ai_family = AF_UNSPEC ;
421
+
422
+ snprintf (portstr , sizeof (portstr ), "%d" , port );
443
423
444
- if (!MtmResolveHostByName (host , addrs , & n_addrs )) {
445
- MTM_ELOG (LOG , "Arbiter failed to resolve host '%s' by name" , host );
424
+ ret = pg_getaddrinfo_all (host , portstr , & hint , & addrs );
425
+ if (ret != 0 )
426
+ {
427
+ MTM_ELOG (LOG , "Arbiter failed to resolve host '%s' by name: %s" , host , gai_strerror (ret ));
446
428
return -1 ;
447
429
}
448
430
BIT_SET (busy_mask , node );
@@ -459,13 +441,14 @@ static int MtmConnectSocket(int node, int port, time_t timeout)
459
441
rc = fcntl (sd , F_SETFL , O_NONBLOCK );
460
442
if (rc < 0 ) {
461
443
MTM_ELOG (LOG , "Arbiter failed to switch socket to non-blocking mode: %d" , errno );
444
+ close (sd );
462
445
busy_mask = save_mask ;
463
446
return -1 ;
464
447
}
465
- for (i = 0 ; i < n_addrs ; ++ i ) {
466
- memcpy ( & sock_inet . sin_addr , & addrs [ i ], sizeof sock_inet . sin_addr );
448
+ for (addr = addrs ; addr != NULL ; addr = addr -> ai_next )
449
+ {
467
450
do {
468
- rc = connect (sd , ( struct sockaddr * ) & sock_inet , sizeof ( sock_inet ) );
451
+ rc = connect (sd , addr -> ai_addr , addr -> ai_addrlen );
469
452
} while (rc < 0 && errno == EINTR );
470
453
471
454
if (rc >= 0 || errno == EINPROGRESS ) {
@@ -638,6 +621,7 @@ static void MtmAcceptOneConnection()
638
621
rc = MtmReadSocket (fd , & req , sizeof req );
639
622
if (rc < sizeof (req )) {
640
623
MTM_ELOG (WARNING , "Arbiter failed to handshake socket: %d, errno=%d" , rc , errno );
624
+ close (fd );
641
625
} else if (req .hdr .code != MSG_HANDSHAKE && req .hdr .dxid != HANDSHAKE_MAGIC ) {
642
626
MTM_ELOG (WARNING , "Arbiter get unexpected handshake message %d" , req .hdr .code );
643
627
close (fd );
@@ -693,7 +677,9 @@ static void MtmAcceptIncomingConnections()
693
677
if (gateway < 0 ) {
694
678
MTM_ELOG (ERROR , "Arbiter failed to create socket: %d" , errno );
695
679
}
696
- setsockopt (gateway , SOL_SOCKET , SO_REUSEADDR , (char * )& on , sizeof on );
680
+ if (setsockopt (gateway , SOL_SOCKET , SO_REUSEADDR , (char * )& on , sizeof on ) < 0 ) {
681
+ MTM_ELOG (ERROR , "Arbiter failed to set options for socket: %d" , errno );
682
+ }
697
683
698
684
if (bind (gateway , (struct sockaddr * )& sock_inet , sizeof (sock_inet )) < 0 ) {
699
685
MTM_ELOG (ERROR , "Arbiter failed to bind socket: %d" , errno );
@@ -726,7 +712,6 @@ static void MtmAppendBuffer(MtmBuffer* txBuffer, MtmArbiterMessage* msg)
726
712
727
713
static void MtmSender (Datum arg )
728
714
{
729
- sigset_t sset ;
730
715
int nNodes = MtmMaxNodes ;
731
716
int i ;
732
717
@@ -737,8 +722,6 @@ static void MtmSender(Datum arg)
737
722
signal (SIGINT , SetStop );
738
723
signal (SIGQUIT , SetStop );
739
724
signal (SIGTERM , SetStop );
740
- sigfillset (& sset );
741
- sigprocmask (SIG_UNBLOCK , & sset , NULL );
742
725
743
726
/* We're now ready to receive signals */
744
727
BackgroundWorkerUnblockSignals ();
@@ -815,13 +798,9 @@ static bool MtmRecovery()
815
798
816
799
static void MtmMonitor (Datum arg )
817
800
{
818
- sigset_t sset ;
819
-
820
801
signal (SIGINT , SetStop );
821
802
signal (SIGQUIT , SetStop );
822
803
signal (SIGTERM , SetStop );
823
- sigfillset (& sset );
824
- sigprocmask (SIG_UNBLOCK , & sset , NULL );
825
804
826
805
/* We're now ready to receive signals */
827
806
BackgroundWorkerUnblockSignals ();
@@ -840,7 +819,6 @@ static void MtmMonitor(Datum arg)
840
819
841
820
static void MtmReceiver (Datum arg )
842
821
{
843
- sigset_t sset ;
844
822
int nNodes = MtmMaxNodes ;
845
823
int nResponses ;
846
824
int i , j , n , rc ;
@@ -860,8 +838,6 @@ static void MtmReceiver(Datum arg)
860
838
signal (SIGINT , SetStop );
861
839
signal (SIGQUIT , SetStop );
862
840
signal (SIGTERM , SetStop );
863
- sigfillset (& sset );
864
- sigprocmask (SIG_UNBLOCK , & sset , NULL );
865
841
866
842
/* We're now ready to receive signals */
867
843
BackgroundWorkerUnblockSignals ();
@@ -1078,7 +1054,6 @@ static void MtmReceiver(Datum arg)
1078
1054
} else if (MtmUseDtm ) {
1079
1055
ts -> votedMask = 0 ;
1080
1056
MTM_TXTRACE (ts , "MtmTransReceiver send MSG_PRECOMMIT" );
1081
- //MtmSend2PCMessage(ts, MSG_PRECOMMIT);
1082
1057
Assert (replorigin_session_origin == InvalidRepOriginId );
1083
1058
MTM_LOG2 ("SetPreparedTransactionState for %s" , ts -> gid );
1084
1059
MtmUnlock ();
@@ -1130,7 +1105,7 @@ static void MtmReceiver(Datum arg)
1130
1105
} else {
1131
1106
Assert (ts -> status == TRANSACTION_STATUS_ABORTED );
1132
1107
MTM_ELOG (WARNING , "Receive PRECOMMITTED response for aborted transaction %s (%llu) from node %d" ,
1133
- ts -> gid , (long64 )ts -> xid , node ); // How it can happen? Should we use assert here?
1108
+ ts -> gid , (long64 )ts -> xid , node );
1134
1109
if ((ts -> participantsMask & ~Mtm -> disabledNodeMask & ~ts -> votedMask ) == 0 ) {
1135
1110
MtmWakeUpBackend (ts );
1136
1111
}
@@ -1140,23 +1115,7 @@ static void MtmReceiver(Datum arg)
1140
1115
Assert (false);
1141
1116
}
1142
1117
} else {
1143
- switch (msg -> code ) {
1144
- case MSG_PRECOMMIT :
1145
- Assert (false); // Now sent through pglogical
1146
- if (ts -> status == TRANSACTION_STATUS_IN_PROGRESS ) {
1147
- ts -> status = TRANSACTION_STATUS_UNKNOWN ;
1148
- ts -> csn = MtmAssignCSN ();
1149
- MtmAdjustSubtransactions (ts );
1150
- MtmSend2PCMessage (ts , MSG_PRECOMMITTED );
1151
- } else if (ts -> status == TRANSACTION_STATUS_ABORTED ) {
1152
- MtmSend2PCMessage (ts , MSG_ABORTED );
1153
- } else {
1154
- MTM_ELOG (WARNING , "Transaction %s is already %s" , ts -> gid , MtmTxnStatusMnem [ts -> status ]);
1155
- }
1156
- break ;
1157
- default :
1158
- Assert (false);
1159
- }
1118
+ Assert (false); /* All broadcasts are now sent through pglogical */
1160
1119
}
1161
1120
}
1162
1121
MtmUnlock ();
0 commit comments