73
73
74
74
#include "multimaster.h"
75
75
76
- #define MAX_ROUTES 16
77
- #define BUFFER_SIZE 1024
78
- #define HANDSHAKE_MAGIC 0xCAFEDEED
76
+ #define MAX_ROUTES 16
77
+ #define INIT_BUFFER_SIZE 1024
78
+ #define HANDSHAKE_MAGIC 0xCAFEDEED
79
79
80
80
typedef struct
81
81
{
@@ -97,7 +97,8 @@ typedef struct
97
97
typedef struct
98
98
{
99
99
int used ;
100
- MtmArbiterMessage data [BUFFER_SIZE ];
100
+ int size ;
101
+ MtmArbiterMessage * data ;
101
102
} MtmBuffer ;
102
103
103
104
static int * sockets ;
@@ -448,11 +449,14 @@ static int MtmConnectSocket(char const* host, int port, int max_attempts)
448
449
}
449
450
450
451
/* Some node considered that I am dead, so switch to recovery mode */
452
+ MtmLock (LW_EXCLUSIVE );
451
453
if (BIT_CHECK (resp .disabledNodeMask , MtmNodeId - 1 )) {
452
454
elog (WARNING , "Node %d thinks that I was dead" , resp .node );
453
455
BIT_SET (Mtm -> disabledNodeMask , MtmNodeId - 1 );
454
456
MtmSwitchClusterMode (MTM_RECOVERY );
455
457
}
458
+ MtmUnlock ();
459
+
456
460
return sd ;
457
461
}
458
462
@@ -489,7 +493,9 @@ static bool MtmSendToNode(int node, void const* buf, int size)
489
493
while (true) {
490
494
if (sockets [node ] >= 0 && BIT_CHECK (Mtm -> reconnectMask , node )) {
491
495
elog (WARNING , "Arbiter is forced to reconnect to node %d" , node + 1 );
496
+ MtmLock (LW_EXCLUSIVE );
492
497
BIT_CLEAR (Mtm -> reconnectMask , node );
498
+ MtmUnlock ();
493
499
close (sockets [node ]);
494
500
sockets [node ] = -1 ;
495
501
}
@@ -504,7 +510,9 @@ static bool MtmSendToNode(int node, void const* buf, int size)
504
510
MtmOnNodeDisconnect (node + 1 );
505
511
return false;
506
512
}
513
+ MtmLock (LW_EXCLUSIVE );
507
514
BIT_CLEAR (Mtm -> reconnectMask , node );
515
+ MtmUnlock ();
508
516
MTM_LOG3 ("Arbiter restablished connection with node %d" , node + 1 );
509
517
} else {
510
518
return true;
@@ -550,7 +558,6 @@ static void MtmAcceptOneConnection()
550
558
close (fd );
551
559
} else {
552
560
MTM_LOG1 ("Arbiter established connection with node %d" , req .hdr .node );
553
- BIT_CLEAR (Mtm -> connectivityMask , req .hdr .node - 1 );
554
561
MtmRegisterSocket (fd , req .hdr .node - 1 );
555
562
sockets [req .hdr .node - 1 ] = fd ;
556
563
MtmOnNodeConnect (req .hdr .node );
@@ -596,12 +603,9 @@ static void MtmAcceptIncomingConnections()
596
603
static void MtmAppendBuffer (MtmBuffer * txBuffer , TransactionId xid , int node , MtmTransState * ts )
597
604
{
598
605
MtmBuffer * buf = & txBuffer [node ];
599
- if (buf -> used == BUFFER_SIZE ) {
600
- if (!MtmSendToNode (node , buf -> data , buf -> used * sizeof (MtmArbiterMessage ))) {
601
- buf -> used = 0 ;
602
- return ;
603
- }
604
- buf -> used = 0 ;
606
+ if (buf -> used == buf -> size ) {
607
+ buf -> size = buf -> size ? buf -> size * 2 : INIT_BUFFER_SIZE ;
608
+ buf -> data = repalloc (buf -> data , buf -> size * sizeof (MtmArbiterMessage ));
605
609
}
606
610
buf -> data [buf -> used ].dxid = xid ;
607
611
@@ -638,7 +642,7 @@ static void MtmTransSender(Datum arg)
638
642
int nNodes = MtmMaxNodes ;
639
643
int i ;
640
644
641
- MtmBuffer * txBuffer = (MtmBuffer * )palloc (sizeof (MtmBuffer )* nNodes );
645
+ MtmBuffer * txBuffer = (MtmBuffer * )palloc0 (sizeof (MtmBuffer )* nNodes );
642
646
643
647
InitializeTimeouts ();
644
648
@@ -653,10 +657,6 @@ static void MtmTransSender(Datum arg)
653
657
654
658
MtmOpenConnections ();
655
659
656
- for (i = 0 ; i < nNodes ; i ++ ) {
657
- txBuffer [i ].used = 0 ;
658
- }
659
-
660
660
while (!stop ) {
661
661
MtmTransState * ts ;
662
662
PGSemaphoreLock (& Mtm -> votingSemaphore );
@@ -721,7 +721,7 @@ static void MtmTransReceiver(Datum arg)
721
721
int nNodes = MtmMaxNodes ;
722
722
int nResponses ;
723
723
int i , j , n , rc ;
724
- MtmBuffer * rxBuffer = (MtmBuffer * )palloc (sizeof (MtmBuffer )* nNodes );
724
+ MtmBuffer * rxBuffer = (MtmBuffer * )palloc0 (sizeof (MtmBuffer )* nNodes );
725
725
timestamp_t lastHeartbeatCheck = MtmGetSystemTime ();
726
726
timestamp_t now ;
727
727
@@ -742,7 +742,8 @@ static void MtmTransReceiver(Datum arg)
742
742
MtmAcceptIncomingConnections ();
743
743
744
744
for (i = 0 ; i < nNodes ; i ++ ) {
745
- rxBuffer [i ].used = 0 ;
745
+ rxBuffer [i ].size = INIT_BUFFER_SIZE ;
746
+ rxBuffer [i ].data = palloc (INIT_BUFFER_SIZE * sizeof (MtmArbiterMessage ));
746
747
}
747
748
748
749
while (!stop ) {
@@ -786,7 +787,7 @@ static void MtmTransReceiver(Datum arg)
786
787
continue ;
787
788
}
788
789
789
- rc = MtmReadFromNode (i , (char * )rxBuffer [i ].data + rxBuffer [i ].used , BUFFER_SIZE - rxBuffer [i ].used );
790
+ rc = MtmReadFromNode (i , (char * )rxBuffer [i ].data + rxBuffer [i ].used , rxBuffer [ i ]. size - rxBuffer [i ].used );
790
791
if (rc <= 0 ) {
791
792
continue ;
792
793
}
0 commit comments