QPID-8230: [Broker-J] Clean-up virtual host and virtual host node resources on failure to restart or activate virtual host
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
index 0882ef1..b6b0bbd 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
@@ -2709,6 +2709,34 @@
@StateTransition( currentState = { State.STOPPED }, desiredState = State.ACTIVE )
private ListenableFuture<Void> onRestart()
{
+ final SettableFuture<Void> returnVal = SettableFuture.create();
+ try
+ {
+ addFutureCallback(doRestart(),new FutureCallback<Void>()
+ {
+ @Override
+ public void onSuccess(final Void result)
+ {
+ returnVal.set(null);
+ }
+
+ @Override
+ public void onFailure(final Throwable t)
+ {
+ doAfterAlways(onRestartFailure(), ()-> returnVal.setException(t));
+ }
+ }, getTaskExecutor()
+ );
+ }
+ catch (IllegalArgumentException | IllegalConfigurationException e)
+ {
+ doAfterAlways(onRestartFailure(), ()-> returnVal.setException(e));
+ }
+ return returnVal;
+ }
+
+ private ListenableFuture<Void> doRestart()
+ {
createHousekeepingExecutor();
final VirtualHostStoreUpgraderAndRecoverer virtualHostStoreUpgraderAndRecoverer =
@@ -2742,6 +2770,7 @@
{
LOGGER.error("Exception occurred while opening {} : {}",
child.getClass().getSimpleName(), child.getName(), t);
+ onRestartFailure();
}
}, getTaskExecutor());
@@ -2753,6 +2782,24 @@
return Futures.transformAsync(combinedFuture, input -> onActivate(), MoreExecutors.directExecutor());
}
+ private ChainedListenableFuture<Void> onRestartFailure()
+ {
+ final List<VirtualHostLogger> loggers = new ArrayList<>(getChildren(VirtualHostLogger.class));
+ return doAfter(closeChildren(), () -> {
+ shutdownHouseKeeping();
+ closeNetworkConnectionScheduler();
+ if (_linkRegistry != null)
+ {
+ _linkRegistry.close();
+ }
+ closeMessageStore();
+ stopPreferenceTaskExecutor();
+ closePreferenceStore();
+ setState(State.ERRORED);
+ stopLogging(loggers);
+ });
+ }
+
private class FileSystemSpaceChecker extends HouseKeepingTask
{
private boolean _fileSystemFull;
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
index be021d8..3f5300e 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
@@ -186,34 +186,31 @@
@Override
public void onFailure(final Throwable t)
{
- setState(State.ERRORED);
- if (_broker.isManagementMode())
- {
- LOGGER.warn("Failed to make " + this + " active.", t);
- returnVal.set(null);
- }
- else
- {
- returnVal.setException(t);
- }
+ onActivationFailure(returnVal, t);
}
}, getTaskExecutor()
);
}
catch(RuntimeException e)
{
- setState(State.ERRORED);
- returnVal.set(null);
+ onActivationFailure(returnVal, e);
+ }
+ return returnVal;
+ }
+
+ private void onActivationFailure(final SettableFuture<Void> returnVal, final Throwable e)
+ {
+ doAfterAlways(stopAndSetStateTo(State.ERRORED), () -> {
if (_broker.isManagementMode())
{
LOGGER.warn("Failed to make " + this + " active.", e);
+ returnVal.set(null);
}
else
{
- throw e;
+ returnVal.setException(e);
}
- }
- return returnVal;
+ });
}
@Override