KNOX-2915 - Descriptors are reloaded before topology redeployment at startup (#760)

diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java b/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
index d7e3042..c5830bd 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/GatewayMessages.java
@@ -73,6 +73,9 @@
   @Message( level = MessageLevel.INFO, text = "Loading topologies from directory: {0}" )
   void loadingTopologiesFromDirectory( String topologiesDir );
 
+  @Message( level = MessageLevel.INFO, text = "Loading descriptors from directory: {0}" )
+  void loadingDescriptorsFromDirectory(String descriptorsDir);
+
   @Message( level = MessageLevel.DEBUG, text = "Loading topology file: {0}" )
   void loadingTopologyFile( String fileName );
 
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/GatewayServer.java b/gateway-server/src/main/java/org/apache/knox/gateway/GatewayServer.java
index dc5969b..65fefd5 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/GatewayServer.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/GatewayServer.java
@@ -623,9 +623,15 @@
     // Load the current topologies.
     // Redeploy autodeploy topologies.
     File topologiesDir = calculateAbsoluteTopologiesDir();
-    log.loadingTopologiesFromDirectory(topologiesDir.getAbsolutePath());
     monitor = services.getService(ServiceType.TOPOLOGY_SERVICE);
+
+    // Descriptors should be reloaded before topology reloading at startup, so that any changes to descriptors
+    // will be realized before Knox deploys "old" topologies that would have re-deployed anyway in a matter of seconds
+    // by the descriptor monitor
+    monitor.reloadDescriptors();
+
     monitor.addTopologyChangeListener(listener);
+    log.loadingTopologiesFromDirectory(topologiesDir.getAbsolutePath());
     monitor.reloadTopologies();
     List<String> autoDeploys = config.getAutoDeployTopologyNames();
     if (autoDeploys != null) {
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java
index 0ab8a70..fba249e 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/services/topology/impl/DefaultTopologyService.java
@@ -549,12 +549,12 @@
         log.remoteConfigurationMonitorStartFailure(remoteMonitor.getClass().getTypeName(), e.getLocalizedMessage());
       }
     }
-
-    // Trigger descriptor discovery (KNOX-2301)
-    triggerDescriptorDiscovery();
   }
 
-  private void triggerDescriptorDiscovery() {
+  // Trigger descriptor discovery (KNOX-2301)
+  @Override
+  public void reloadDescriptors() {
+    log.loadingDescriptorsFromDirectory(descriptorsDirectory.getAbsolutePath());
     for (File descriptor : getDescriptors()) {
       descriptorsMonitor.onFileChange(descriptor);
     }
diff --git a/gateway-spi/src/main/java/org/apache/knox/gateway/services/topology/TopologyService.java b/gateway-spi/src/main/java/org/apache/knox/gateway/services/topology/TopologyService.java
index 6fb11fc..8fa65e4 100644
--- a/gateway-spi/src/main/java/org/apache/knox/gateway/services/topology/TopologyService.java
+++ b/gateway-spi/src/main/java/org/apache/knox/gateway/services/topology/TopologyService.java
@@ -56,6 +56,8 @@
 
   Collection<File> getDescriptors();
 
+  void reloadDescriptors();
+
   void deleteTopology(Topology t);
 
   boolean deleteDescriptor(String name);