[#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:
parent
f746f0c57a
commit
50086ca902
@ -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();
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user