Xikui Wang has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/2085

Change subject: [ASTERIXDB-2137][ING][API] Prevent REST API hang on stopped 
feeds
......................................................................

[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 previous active stats after immediate start after
stop.
4. To prevent possible hangs when waiting for stats and feeds is
stopped. StatsSubscriber should be notified by job finished as well.

Change-Id: Ifd35ba0e61ac73086c6ba276e1f25a0cd094cf8c
---
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
M 
asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
M 
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/watch/StatsSubscriber.java
3 files changed, 15 insertions(+), 7 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/85/2085/1

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 @@
             }
             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));
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..7c3733b 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 @@
     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 @@
         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 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,7 @@
         } else {
             throw new 
RuntimeDataException(ErrorCode.ACTIVE_ENTITY_CANNOT_BE_STOPPED, entityId, 
state);
         }
+        this.stats = DEFAULT_ACTIVE_STATS;
     }
 
     public RecoveryTask getRecoveryTask() {
diff --git 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/watch/StatsSubscriber.java
 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/watch/StatsSubscriber.java
index a571904..8d4d27f 100644
--- 
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/watch/StatsSubscriber.java
+++ 
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/watch/StatsSubscriber.java
@@ -31,7 +31,8 @@
 
     @Override
     public void notify(ActiveEvent event) throws HyracksDataException {
-        if (event.getEventKind() == ActiveEvent.Kind.STATS_UPDATED) {
+        if (event.getEventKind() == ActiveEvent.Kind.STATS_UPDATED
+                || event.getEventKind() == ActiveEvent.Kind.JOB_FINISHED) {
             try {
                 complete(null);
             } catch (Exception e) {

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/2085
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifd35ba0e61ac73086c6ba276e1f25a0cd094cf8c
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Xikui Wang <[email protected]>

Reply via email to