You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by pa...@apache.org on 2016/06/19 00:03:46 UTC

[6/6] drill git commit: DRILL-2593: 500 error when crc for a query profile is out of sync

DRILL-2593: 500 error when crc for a query profile is out of sync


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/2862beaf
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/2862beaf
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/2862beaf

Branch: refs/heads/master
Commit: 2862beaf5c72ccaafc6c52b9956f2d0414948b67
Parents: 1c451a3
Author: Arina Ielchiieva <ar...@gmail.com>
Authored: Sun Jun 12 13:48:54 2016 +0000
Committer: Parth Chandra <pa...@apache.org>
Committed: Sat Jun 18 17:03:00 2016 -0700

----------------------------------------------------------------------
 .../server/rest/profile/ProfileResources.java   | 55 +++++++++++++-------
 .../src/main/resources/rest/profile/list.ftl    |  9 ++++
 2 files changed, 46 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/2862beaf/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileResources.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileResources.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileResources.java
index 05441c0..d2e953d 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileResources.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/profile/ProfileResources.java
@@ -18,9 +18,9 @@
 package org.apache.drill.exec.server.rest.profile;
 
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -84,7 +84,7 @@ public class ProfileResources {
       this.time = new Date(time);
       this.foreman = foreman;
       this.location = "http://localhost:8047/profile/" + queryId + ".json";
-      this.query = query = query.substring(0,  Math.min(query.length(), 150));
+      this.query = query.substring(0,  Math.min(query.length(), 150));
       this.state = state;
       this.user = user;
     }
@@ -137,10 +137,12 @@ public class ProfileResources {
   public class QProfiles {
     private List<ProfileInfo> runningQueries;
     private List<ProfileInfo> finishedQueries;
+    private List<String> errors;
 
-    public QProfiles(List<ProfileInfo> runningQueries, List<ProfileInfo> finishedQueries) {
+    public QProfiles(List<ProfileInfo> runningQueries, List<ProfileInfo> finishedQueries, List<String> erorrs) {
       this.runningQueries = runningQueries;
       this.finishedQueries = finishedQueries;
+      this.errors = erorrs;
     }
 
     public List<ProfileInfo> getRunningQueries() {
@@ -150,6 +152,8 @@ public class ProfileResources {
     public List<ProfileInfo> getFinishedQueries() {
       return finishedQueries;
     }
+
+    public List<String> getErrors() { return errors; }
   }
 
   @GET
@@ -160,33 +164,48 @@ public class ProfileResources {
       final PersistentStore<QueryProfile> completed = getProvider().getOrCreateStore(QueryManager.QUERY_PROFILE);
       final TransientStore<QueryInfo> running = getCoordinator().getOrCreateTransientStore(QueryManager.RUNNING_QUERY_INFO);
 
+      final List<String> errors = Lists.newArrayList();
+
       final List<ProfileInfo> runningQueries = Lists.newArrayList();
 
-      for (final Map.Entry<String, QueryInfo> entry: Lists.newArrayList(running.entries())) {
-        final QueryInfo profile = entry.getValue();
-        if (principal.canManageProfileOf(profile.getUser())) {
-          runningQueries.add(new ProfileInfo(entry.getKey(), profile.getStart(), profile.getForeman().getAddress(),
-              profile.getQuery(), profile.getState().name(), profile.getUser()));
+      final Iterator<Map.Entry<String, QueryInfo>> runningEntries = running.entries();
+      while (runningEntries.hasNext()) {
+        try {
+          final Map.Entry<String, QueryInfo> runningEntry = runningEntries.next();
+          final QueryInfo profile = runningEntry.getValue();
+          if (principal.canManageProfileOf(profile.getUser())) {
+            runningQueries.add(new ProfileInfo(runningEntry.getKey(), profile.getStart(), profile.getForeman().getAddress(), profile.getQuery(), profile.getState().name(), profile.getUser()));
+          }
+        } catch (Exception e) {
+          errors.add(e.getMessage());
+          logger.error("Error getting running query info.", e);
         }
       }
 
       Collections.sort(runningQueries, Collections.reverseOrder());
 
-      List<ProfileInfo> finishedQueries = Lists.newArrayList();
-      for (Map.Entry<String, QueryProfile> entry : Lists.newArrayList(completed.getRange(0, MAX_PROFILES))) {
-        QueryProfile profile = entry.getValue();
-        if (principal.canManageProfileOf(profile.getUser())) {
-          finishedQueries.add(new ProfileInfo(entry.getKey(), profile.getStart(), profile.getForeman().getAddress(),
-              profile.getQuery(), profile.getState().name(), profile.getUser()));
+      final List<ProfileInfo> finishedQueries = Lists.newArrayList();
+
+      final Iterator<Map.Entry<String, QueryProfile>> range = completed.getRange(0, MAX_PROFILES);
+      while (range.hasNext()) {
+        try {
+          final Map.Entry<String, QueryProfile> profileEntry = range.next();
+          final QueryProfile profile = profileEntry.getValue();
+          if (principal.canManageProfileOf(profile.getUser())) {
+            finishedQueries.add(new ProfileInfo(profileEntry.getKey(), profile.getStart(), profile.getForeman().getAddress(), profile.getQuery(), profile.getState().name(), profile.getUser()));
+          }
+        } catch (Exception e) {
+          errors.add(e.getMessage());
+          logger.error("Error getting finished query profile.", e);
         }
       }
 
-      return new QProfiles(runningQueries, finishedQueries);
+      return new QProfiles(runningQueries, finishedQueries, errors);
     } catch (Exception e) {
-      logger.debug("Failed to get profiles from persistent or ephemeral store.");
-      return new QProfiles(new ArrayList<ProfileInfo>(), new ArrayList<ProfileInfo>());
+      throw UserException.resourceError(e)
+          .message("Failed to get profiles from persistent or ephemeral store.")
+          .build(logger);
     }
-
   }
 
   @GET

http://git-wip-us.apache.org/repos/asf/drill/blob/2862beaf/exec/java-exec/src/main/resources/rest/profile/list.ftl
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/resources/rest/profile/list.ftl b/exec/java-exec/src/main/resources/rest/profile/list.ftl
index cf92ede..88d1407 100644
--- a/exec/java-exec/src/main/resources/rest/profile/list.ftl
+++ b/exec/java-exec/src/main/resources/rest/profile/list.ftl
@@ -17,6 +17,15 @@
   <a href="/queries">back</a><br/>
   <div class="page-header">
   </div>
+  <#if (model.getErrors()?size > 0) >
+    <div id="message" class="alert alert-danger alert-dismissable">
+        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
+        <strong>Failed to get profiles:</strong><br>
+        <#list model.getErrors() as error>
+          ${error}<br>
+        </#list>
+    </div>
+  </#if>
   <#if (model.getRunningQueries()?size > 0) >
     <h3>Running Queries</h3>
     <div class="table-responsive">