@@ -230,6 +230,51 @@ static int MtmReadSocket(int sd, void* buf, int buf_size)
230230
231231
232232
233+ static void MtmSetSocketOptions (int sd )
234+ {
235+ #ifdef TCP_NODELAY
236+ int optval = 1 ;
237+ if (setsockopt (sd ,IPPROTO_TCP ,TCP_NODELAY , (char const * )& optval ,sizeof (optval ))< 0 ) {
238+ elog (WARNING ,"Failed to set TCP_NODELAY: %m" );
239+ }
240+ #endif
241+ if (tcp_keepalives_idle ) {
242+ #ifdef TCP_KEEPIDLE
243+ if (setsockopt (sd ,IPPROTO_TCP ,TCP_KEEPIDLE ,
244+ (char * )& tcp_keepalives_idle ,sizeof (tcp_keepalives_idle ))< 0 )
245+ {
246+ elog (WARNING ,"Failed to set TCP_KEEPIDLE: %m" );
247+ }
248+ #else
249+ #ifdef TCP_KEEPALIVE
250+ if (setsockopt (sd ,IPPROTO_TCP ,TCP_KEEPALIVE ,
251+ (char * )& tcp_keepalives_idle ,sizeof (tcp_keepalives_idle ))< 0 )
252+ {
253+ elog (WARNING ,"Failed to set TCP_KEEPALIVE: %m" );
254+ }
255+ #endif
256+ #endif
257+ }
258+ #ifdef TCP_KEEPINTVL
259+ if (tcp_keepalives_interval ) {
260+ if (setsockopt (sd ,IPPROTO_TCP ,TCP_KEEPINTVL ,
261+ (char * )& tcp_keepalives_interval ,sizeof (tcp_keepalives_interval ))< 0 )
262+ {
263+ elog (WARNING ,"Failed to set TCP_KEEPINTVL: %m" );
264+ }
265+ }
266+ #endif
267+ #ifdef TCP_KEEPCNT
268+ if (tcp_keepalives_count ) {
269+ if (setsockopt (sd ,IPPROTO_TCP ,TCP_KEEPCNT ,
270+ (char * )& tcp_keepalives_count ,sizeof (tcp_keepalives_count ))< 0 )
271+ {
272+ elog (WARNING ,"Failed to set TCP_KEEPCNT: %m" );
273+ }
274+ }
275+ #endif
276+ }
277+
233278static int MtmConnectSocket (char const * host ,int port ,int max_attempts )
234279{
235280struct sockaddr_in sock_inet ;
@@ -274,12 +319,9 @@ static int MtmConnectSocket(char const* host, int port, int max_attempts)
274319}
275320continue ;
276321}else {
277- int optval = 1 ;
278322MtmHandshakeMessage req ;
279323MtmArbiterMessage resp ;
280- setsockopt (sd ,IPPROTO_TCP ,TCP_NODELAY , (char const * )& optval ,sizeof (optval ));
281- setsockopt (sd ,SOL_SOCKET ,SO_KEEPALIVE , (char const * )& optval ,sizeof (optval ));
282-
324+ MtmSetSocketOptions (sd );
283325req .hdr .code = MSG_HANDSHAKE ;
284326req .hdr .node = MtmNodeId ;
285327req .hdr .dxid = HANDSHAKE_MAGIC ;