[#4170] Shutdown socket before close fd when using epoll transport

Motivation:

We should call shutdown(...) on the socket before closing the filedescriptor to ensure it is closed gracefully.

Modifications:

Call shutdown(...) before close.

Result:

Sockets are gracefully shutdown when using native transport.
This commit is contained in:
Norman Maurer 2015-09-22 17:00:16 +02:00
parent f746f0c57a
commit 50086ca902
2 changed files with 20 additions and 3 deletions

View File

@ -102,17 +102,29 @@ abstract class AbstractEpollChannel extends AbstractChannel implements UnixChann
@Override @Override
protected void doClose() throws Exception { protected void doClose() throws Exception {
active = false; boolean active = this.active;
this.active = false;
FileDescriptor fd = fileDescriptor;
try { try {
// deregister from epoll now // deregister from epoll now and shutdown the socket.
doDeregister(); doDeregister();
if (active) {
shutdown(fd.intValue());
}
} finally { } finally {
// Ensure the file descriptor is closed in all cases. // Ensure the file descriptor is closed in all cases.
FileDescriptor fd = fileDescriptor;
fd.close(); fd.close();
} }
} }
/**
* Called on {@link #doClose()} before the actual {@link FileDescriptor} is closed.
* This implementation does nothing.
*/
protected void shutdown(int fd) throws IOException {
// NOOP
}
@Override @Override
protected void doDisconnect() throws Exception { protected void doDisconnect() throws Exception {
doClose(); doClose();

View File

@ -93,6 +93,11 @@ public abstract class AbstractEpollStreamChannel extends AbstractEpollChannel {
flags |= Native.EPOLLRDHUP; flags |= Native.EPOLLRDHUP;
} }
@Override
protected void shutdown(int fd) throws IOException {
Native.shutdown(fd, true, true);
}
@Override @Override
protected AbstractEpollUnsafe newUnsafe() { protected AbstractEpollUnsafe newUnsafe() {
return new EpollStreamUnsafe(); return new EpollStreamUnsafe();