SLIDER-1214 Update container log links to log-server URL only for a completed application
diff --git a/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java b/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
index d6d8789..295f7cd 100644
--- a/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
+++ b/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
@@ -75,7 +75,7 @@
    * If normalization is set to false, then if the resource (memory and/or
    * vcore) requested by a role is higher than YARN limits, then the resource
    * request is not normalized. If this causes failures at the YARN level then
-   * applications are expecting that to happen. Default value is false.
+   * applications are expecting that to happen. Default value is true.
    */
   String YARN_RESOURCE_NORMALIZATION_ENABLED = "yarn.resource.normalization.enabled";
 
diff --git a/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java b/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java
index 3b5b590..dcd6853 100644
--- a/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java
+++ b/slider-core/src/main/java/org/apache/slider/api/types/ContainerInformation.java
@@ -22,6 +22,7 @@
 import java.util.Comparator;
 
 import org.apache.hadoop.registry.client.binding.JsonSerDeser;
+import org.codehaus.jackson.annotate.JsonIgnore;
 import org.codehaus.jackson.annotate.JsonIgnoreProperties;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
@@ -52,6 +53,8 @@
    */
   public String[] output;
   public String logLink;
+  @JsonIgnore
+  public String logServerLogLink;
 
   public String getContainerId() {
     return containerId;
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index bc0339a..f076e87 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -1998,6 +1998,8 @@
     } finally {
       List<AbstractRMOperation> operations = appState
           .releaseAllContainers(releaseMessage);
+      // need to call final log link update after we release all containers
+      appState.updateAllContainerLogLinks();
       providerRMOperationHandler.execute(operations);
       // now apply the operations
       execute(operations);
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
index 187c292..56b1b2a 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
@@ -2395,6 +2395,18 @@
     return operations;
   }
 
+  public synchronized void updateAllContainerLogLinks() {
+    if (getApplicationDiagnostics().getContainers().isEmpty()) {
+      return;
+    }
+    for (ContainerInformation ci : getApplicationDiagnostics()
+        .getContainers()) {
+      if (ci.logServerLogLink != null) {
+        ci.logLink = ci.logServerLogLink;
+      }
+    }
+  }
+
   /**
    * Event handler for allocated containers: builds up the lists
    * of assignment actions (what to run where), and possibly
@@ -2606,7 +2618,7 @@
       }
       containerInfo.state = state;
       if (logLink != null) {
-        containerInfo.logLink = logLink;
+        containerInfo.logServerLogLink = logLink;
       }
       containerInfo.completionTime = completionTime;
     }