Browse Source

Force close when dropping a client with a reset using SO_LINGER and give a warning on close failure

master
Con Kolivas 10 years ago
parent
commit
7d878bd223
  1. 4
      src/connector.c
  2. 3
      src/libckpool.c

4
src/connector.c

@ -155,6 +155,10 @@ static int drop_client(conn_instance_t *ci, client_instance_t *client)
ck_wlock(&ci->lock); ck_wlock(&ci->lock);
fd = client->fd; fd = client->fd;
if (fd != -1) { if (fd != -1) {
const struct linger so_linger = { 1, 0 };
if (unlikely(setsockopt(client->fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger))))
LOGWARNING("setsockopt failed with errno %d:%s", errno, strerror(errno));
Close(client->fd); Close(client->fd);
HASH_DEL(clients, client); HASH_DEL(clients, client);
HASH_DELETE(fdhh, fdclients, client); HASH_DELETE(fdhh, fdclients, client);

3
src/libckpool.c

@ -437,7 +437,8 @@ void _Close(int *fd)
if (*fd < 0) if (*fd < 0)
return; return;
LOGDEBUG("Closing file handle %d", *fd); LOGDEBUG("Closing file handle %d", *fd);
close(*fd); if (unlikely(close(*fd)))
LOGWARNING("Close of fd %d failed with errno %d:%s", *fd, errno, strerror(errno));
*fd = -1; *fd = -1;
} }

Loading…
Cancel
Save