Repository: asterixdb
Updated Branches:
  refs/heads/master 9782f8a29 -> 799046dfa


[ASTERIXDB-2137][ING][API] Prevent REST API hang on stopped feeds

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
1. Due to the ActiveEventListener change, current implementation will
try to issue stats request to stopped feed and never get back. This is
fixed.
2. Now we only request stats for active feeds.
3. When feed stopped, the cached stats will be reinitialized. This is to
prevent users see the previous active stats after immediate start after
stop.

Change-Id: Ifd35ba0e61ac73086c6ba276e1f25a0cd094cf8c
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2085
Sonar-Qube: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Contrib: Jenkins <[email protected]>
Reviewed-by: abdullah alamoudi <[email protected]>
Integration-Tests: Jenkins <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/799046df
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/799046df
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/799046df

Branch: refs/heads/master
Commit: 799046dfaaa97e30758ab77e3974d00c1a1ed017
Parents: 9782f8a
Author: Xikui Wang <[email protected]>
Authored: Fri Oct 20 12:11:53 2017 -0700
Committer: Xikui Wang <[email protected]>
Committed: Sat Oct 21 09:07:38 2017 -0700

----------------------------------------------------------------------
 .../api/http/server/ActiveStatsApiServlet.java        |  6 ++++--
 .../app/active/ActiveEntityEventsListener.java        | 14 ++++++++++----
 2 files changed, 14 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/799046df/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
index 7e6d54b..a4889ce 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
@@ -76,8 +76,10 @@ public class ActiveStatsApiServlet extends AbstractServlet {
             }
             long currentTime = System.currentTimeMillis();
             for (int iter1 = 0; iter1 < listeners.length; iter1++) {
-                resNode.putPOJO(listeners[iter1].getDisplayName(),
-                        constructNode(OBJECT_MAPPER, listeners[iter1], 
currentTime, expireTime));
+                if (listeners[iter1].isActive()) {
+                    resNode.putPOJO(listeners[iter1].getDisplayName(),
+                            constructNode(OBJECT_MAPPER, listeners[iter1], 
currentTime, expireTime));
+                }
             }
             // Construct Response
             
responseWriter.write(OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(resNode));

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/799046df/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
index 73d0840..e3c1fed 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
@@ -65,6 +65,7 @@ public abstract class ActiveEntityEventsListener implements 
IActiveEntityControl
     private static final ActiveEvent STATE_CHANGED = new ActiveEvent(null, 
Kind.STATE_CHANGED, null, null);
     private static final EnumSet<ActivityState> TRANSITION_STATES = 
EnumSet.of(ActivityState.RESUMING,
             ActivityState.STARTING, ActivityState.STOPPING, 
ActivityState.RECOVERING);
+    private static final String DEFAULT_ACTIVE_STATS = "{\"Stats\":\"N/A\"}";
     // finals
     protected final IClusterStateManager clusterStateManager;
     protected final ActiveNotificationHandler handler;
@@ -113,7 +114,7 @@ public abstract class ActiveEntityEventsListener implements 
IActiveEntityControl
         this.statsTimestamp = -1;
         this.isFetchingStats = false;
         this.statsUpdatedEvent = new ActiveEvent(null, Kind.STATS_UPDATED, 
entityId, null);
-        this.stats = "{\"Stats\":\"N/A\"}";
+        this.stats = DEFAULT_ACTIVE_STATS;
         this.runtimeName = runtimeName;
         this.locations = locations;
         this.numRegistered = 0;
@@ -275,9 +276,12 @@ public abstract class ActiveEntityEventsListener 
implements IActiveEntityControl
     public void refreshStats(long timeout) throws HyracksDataException {
         LOGGER.log(level, "refreshStats called");
         synchronized (this) {
-            if (state != ActivityState.RUNNING || isFetchingStats) {
-                LOGGER.log(level,
-                        "returning immediately since state = " + state + " and 
fetchingStats = " + isFetchingStats);
+            if (state != ActivityState.RUNNING) {
+                LOGGER.log(level, "returning immediately since state = " + 
state);
+                notifySubscribers(statsUpdatedEvent);
+                return;
+            } else if (isFetchingStats) {
+                LOGGER.log(level, "returning immediately since fetchingStats = 
" + isFetchingStats);
                 return;
             } else {
                 isFetchingStats = true;
@@ -426,6 +430,8 @@ public abstract class ActiveEntityEventsListener implements 
IActiveEntityControl
         } else {
             throw new 
RuntimeDataException(ErrorCode.ACTIVE_ENTITY_CANNOT_BE_STOPPED, entityId, 
state);
         }
+        this.stats = DEFAULT_ACTIVE_STATS;
+        notifySubscribers(statsUpdatedEvent);
     }
 
     public RecoveryTask getRecoveryTask() {

Reply via email to