@@ -136,6 +136,9 @@ static int ServerLoop(void);
136136static int initMasks (fd_set * rmask );
137137void * GTMProxy_ThreadMain (void * argp );
138138static int GTMProxyAddConnection (Port * port );
139+ static GTMProxy_ConnectionInfo * GTMProxy_GetConnInfo (GTMProxy_ThreadInfo * thrinfo ,
140+ GTMProxy_ConnID con_id );
141+ static int GTMProxy_GetConnInfoIndex (GTMProxy_ThreadInfo * thrinfo , GTMProxy_ConnID con_id );
139142static int ReadCommand (GTMProxy_ConnectionInfo * conninfo , StringInfo inBuf );
140143static void GTMProxy_HandshakeConnection (GTMProxy_ConnectionInfo * conninfo );
141144static void GTMProxy_HandleDisconnect (GTMProxy_ConnectionInfo * conninfo , GTM_Conn * gtm_conn );
@@ -1554,6 +1557,27 @@ GTMProxyAddConnection(Port *port)
15541557 return STATUS_OK ;
15551558}
15561559
1560+ /* Convert a connection id to a index in GTMProxy_ThreadInfo::thr_all_conns */
1561+ static int
1562+ GTMProxy_GetConnInfoIndex (GTMProxy_ThreadInfo * thrinfo , GTMProxy_ConnID con_id )
1563+ {
1564+ if (con_id == InvalidGTMProxyConnID )
1565+ return -1 ;
1566+ return thrinfo -> thr_conid2idx [con_id ];
1567+ }
1568+
1569+ static GTMProxy_ConnectionInfo *
1570+ GTMProxy_GetConnInfo (GTMProxy_ThreadInfo * thrinfo , GTMProxy_ConnID con_id )
1571+ {
1572+ int con_idx ;
1573+
1574+ con_idx = GTMProxy_GetConnInfoIndex (thrinfo , con_id );
1575+ if (con_idx < 0 )
1576+ return NULL ;
1577+
1578+ return thrinfo -> thr_all_conns [con_idx ];
1579+ }
1580+
15571581void
15581582ProcessCommand (GTMProxy_ConnectionInfo * conninfo , GTM_Conn * gtm_conn ,
15591583 StringInfo input_message )
@@ -1684,7 +1708,9 @@ HandleGTMError(GTM_Conn *gtm_conn)
16841708static GTM_Conn *
16851709HandlePostCommand (GTMProxy_ConnectionInfo * conninfo , GTM_Conn * gtm_conn )
16861710{
1687- int connIdx = conninfo -> con_id ;
1711+ int connIdx ;
1712+
1713+ connIdx = GTMProxy_GetConnInfoIndex (GetMyThreadInfo , conninfo -> con_id );
16881714
16891715 Assert (conninfo && gtm_conn );
16901716 /*
@@ -1896,12 +1922,15 @@ ProcessResponse(GTMProxy_ThreadInfo *thrinfo, GTMProxy_CommandInfo *cmdinfo,
18961922 case MSG_SEQUENCE_CLOSE :
18971923 case MSG_SEQUENCE_RENAME :
18981924 case MSG_SEQUENCE_ALTER :
1899- if ((res -> gr_proxyhdr .ph_conid == InvalidGTMProxyConnID ) ||
1900- (res -> gr_proxyhdr .ph_conid >= GTM_PROXY_MAX_CONNECTIONS ) ||
1901- (thrinfo -> thr_all_conns [res -> gr_proxyhdr .ph_conid ] != cmdinfo -> ci_conn ))
19021925 {
1903- ReleaseCmdBackup (cmdinfo );
1904- elog (PANIC , "Invalid response or synchronization loss" );
1926+ GTMProxy_ConnID con_id = res -> gr_proxyhdr .ph_conid ;
1927+ if ((con_id == InvalidGTMProxyConnID ) ||
1928+ (con_id >= GTM_PROXY_MAX_CONNECTIONS ) ||
1929+ (GTMProxy_GetConnInfo (thrinfo , con_id ) != cmdinfo -> ci_conn ))
1930+ {
1931+ ReleaseCmdBackup (cmdinfo );
1932+ elog (PANIC , "Invalid response or synchronization loss" );
1933+ }
19051934 }
19061935
19071936 /*
@@ -1975,9 +2004,10 @@ static int
19752004ReadCommand (GTMProxy_ConnectionInfo * conninfo , StringInfo inBuf )
19762005{
19772006 int qtype ;
1978- int connIdx = conninfo -> con_id ;
2007+ int connIdx ;
19792008 int anyBackup ;
19802009
2010+ connIdx = GTMProxy_GetConnInfoIndex (GetMyThreadInfo , conninfo -> con_id );
19812011 anyBackup = (GetMyThreadInfo -> thr_any_backup [connIdx ] ? TRUE : FALSE);
19822012
19832013 /*
@@ -3327,7 +3357,9 @@ ConnectGTM(void)
33273357 */
33283358static void ReleaseCmdBackup (GTMProxy_CommandInfo * cmdinfo )
33293359{
3330- GTMProxy_ConnID connIdx = cmdinfo -> ci_conn -> con_id ;
3360+ GTMProxy_ConnID connIdx ;
3361+
3362+ connIdx = GTMProxy_GetConnInfoIndex (GetMyThreadInfo , cmdinfo -> ci_conn -> con_id );
33313363
33323364 GetMyThreadInfo -> thr_any_backup [connIdx ] = FALSE;
33333365 GetMyThreadInfo -> thr_qtype [connIdx ] = 0 ;
0 commit comments