mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-02-02 10:40:38 +01:00
Set SO_KEEPALIVE for Classic server
This commit is contained in:
parent
ff1825af5d
commit
547c4a5517
@ -576,6 +576,7 @@ static int send_partial(rem_port*, PACKET *);
|
||||
static int xdrinet_create(XDR*, rem_port*, UCHAR *, USHORT, enum xdr_op);
|
||||
static bool setNoNagleOption(rem_port*);
|
||||
static bool setFastLoopbackOption(rem_port*, SOCKET s = INVALID_SOCKET);
|
||||
static bool setKeepAlive(SOCKET);
|
||||
static FPTR_INT tryStopMainThread = 0;
|
||||
|
||||
|
||||
@ -1031,12 +1032,8 @@ rem_port* INET_connect(const TEXT* name,
|
||||
return listener_socket(port, flag, pai);
|
||||
|
||||
// client
|
||||
int optval = 1;
|
||||
n = setsockopt(port->port_handle, SOL_SOCKET, SO_KEEPALIVE, (SCHAR*) &optval, sizeof(optval));
|
||||
if (n == -1)
|
||||
{
|
||||
if (!setKeepAlive(port->port_handle))
|
||||
gds__log("setsockopt: error setting SO_KEEPALIVE");
|
||||
}
|
||||
|
||||
if (!setNoNagleOption(port))
|
||||
gds__log("setsockopt: error setting TCP_NODELAY");
|
||||
@ -1131,6 +1128,13 @@ static rem_port* listener_socket(rem_port* port, USHORT flag, const addrinfo* pa
|
||||
inet_error(true, port, "setsockopt LINGER", isc_net_connect_listen_err, INET_ERRNO);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! setKeepAlive(port->port_handle))
|
||||
{
|
||||
inet_error(true, port, "setsockopt SO_KEEPALIVE", isc_net_connect_listen_err, INET_ERRNO);
|
||||
}
|
||||
}
|
||||
|
||||
// RS: In linux sockets inherit this option from listener. Previously CLASSIC had no its own listen socket
|
||||
// Now it's necessary to respect the option via listen socket.
|
||||
@ -1255,9 +1259,7 @@ rem_port* INET_reconnect(SOCKET handle)
|
||||
port->port_flags |= PORT_server;
|
||||
port->port_server_flags |= SRVR_server;
|
||||
|
||||
int n = 0, optval = TRUE;
|
||||
n = setsockopt(port->port_handle, SOL_SOCKET, SO_KEEPALIVE, (SCHAR*) &optval, sizeof(optval));
|
||||
if (n == -1) {
|
||||
if (! setKeepAlive(port->port_handle)) {
|
||||
gds__log("inet server err: setting KEEPALIVE socket option \n");
|
||||
}
|
||||
|
||||
@ -1287,9 +1289,7 @@ rem_port* INET_server(SOCKET sock)
|
||||
port->port_server_flags |= SRVR_server;
|
||||
port->port_handle = sock;
|
||||
|
||||
int optval = 1;
|
||||
n = setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (SCHAR*) &optval, sizeof(optval));
|
||||
if (n == -1) {
|
||||
if (! setKeepAlive(port->port_handle)) {
|
||||
gds__log("inet server err: setting KEEPALIVE socket option \n");
|
||||
}
|
||||
|
||||
@ -1583,8 +1583,7 @@ static rem_port* aux_connect(rem_port* port, PACKET* packet)
|
||||
inet_error(false, port, "socket", isc_net_event_connect_err, savedError);
|
||||
}
|
||||
|
||||
int optval = 1;
|
||||
setsockopt(n, SOL_SOCKET, SO_KEEPALIVE, (SCHAR*) &optval, sizeof(optval));
|
||||
setKeepAlive(n);
|
||||
setFastLoopbackOption(new_port, n);
|
||||
|
||||
status = address.connect(n);
|
||||
@ -2182,8 +2181,7 @@ static rem_port* select_accept( rem_port* main_port)
|
||||
inet_error(true, port, "accept", isc_net_connect_err, INET_ERRNO);
|
||||
}
|
||||
|
||||
int optval = 1;
|
||||
setsockopt(port->port_handle, SOL_SOCKET, SO_KEEPALIVE, (SCHAR*) &optval, sizeof(optval));
|
||||
setKeepAlive(port->port_handle);
|
||||
|
||||
port->port_flags |= PORT_server;
|
||||
|
||||
@ -3380,6 +3378,25 @@ bool setFastLoopbackOption(rem_port* port, SOCKET s)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool setKeepAlive(SOCKET s)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
* s e t K e e p A l i v e
|
||||
*
|
||||
**************************************
|
||||
*
|
||||
* Functional description
|
||||
* Set SO_KEEPALIVE, return false
|
||||
* in case of unexpected error
|
||||
*
|
||||
**************************************/
|
||||
int optval = 1;
|
||||
int n = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE,
|
||||
(SCHAR*) &optval, sizeof(optval));
|
||||
return n != -1;
|
||||
}
|
||||
|
||||
void setStopMainThread(FPTR_INT func)
|
||||
{
|
||||
/**************************************
|
||||
|
Loading…
Reference in New Issue
Block a user