diff --git a/modules/dcache-xrootd/src/main/java/org/dcache/xrootd/pool/XrootdTransferService.java b/modules/dcache-xrootd/src/main/java/org/dcache/xrootd/pool/XrootdTransferService.java index 8cee1649ad2..8c269bd6ea5 100644 --- a/modules/dcache-xrootd/src/main/java/org/dcache/xrootd/pool/XrootdTransferService.java +++ b/modules/dcache-xrootd/src/main/java/org/dcache/xrootd/pool/XrootdTransferService.java @@ -354,15 +354,10 @@ protected void initChannel(Channel ch) throws Exception pipeline.addLast("transfer", handler); } - @PreDestroy @Override - public synchronized void shutdown() { - super.shutdown(); - thirdPartyClientGroup.shutdownGracefully(1, 3, TimeUnit.SECONDS); - try { - thirdPartyClientGroup.terminationFuture().sync(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } + protected void initialiseShutdown() + { + super.initialiseShutdown(); + shutdownGracefully(thirdPartyClientGroup); } } diff --git a/modules/dcache/src/main/java/org/dcache/pool/movers/NettyTransferService.java b/modules/dcache/src/main/java/org/dcache/pool/movers/NettyTransferService.java index a84af214b21..f6490774b71 100644 --- a/modules/dcache/src/main/java/org/dcache/pool/movers/NettyTransferService.java +++ b/modules/dcache/src/main/java/org/dcache/pool/movers/NettyTransferService.java @@ -43,6 +43,8 @@ import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.Executors; @@ -137,6 +139,8 @@ public abstract class NettyTransferService

private CellAddressCore address; + private final List> shutdownFutures = new ArrayList<>(); + public NettyTransferService(String name) { this.name = name; @@ -296,17 +300,35 @@ public synchronized void init() @PreDestroy public synchronized void shutdown() + { + LOGGER.debug("NettyTransferService#shutdown started"); + initialiseShutdown(); + awaitShutdownCompletion(); + LOGGER.debug("NettyTransferService#shutdown completed"); + } + + protected void initialiseShutdown() { stopServer(); timeoutScheduler.shutdown(); - acceptGroup.shutdownGracefully(1, 3, TimeUnit.SECONDS); - socketGroup.shutdownGracefully(1, 3, TimeUnit.SECONDS); + shutdownGracefully(acceptGroup); + shutdownGracefully(socketGroup); + } + + protected void shutdownGracefully(NioEventLoopGroup group) + { + io.netty.util.concurrent.Future terminationFuture = group.shutdownGracefully(1, 3, TimeUnit.SECONDS); + shutdownFutures.add(terminationFuture); + } + private void awaitShutdownCompletion() + { try { if (timeoutScheduler.awaitTermination(3, TimeUnit.SECONDS)) { - acceptGroup.terminationFuture().sync(); - socketGroup.terminationFuture().sync(); + for (io.netty.util.concurrent.Future f : shutdownFutures) { + f.sync(); + } } } catch (InterruptedException e) { Thread.currentThread().interrupt();