From afc758003cfdde9ddaf50e66f23a5ad91de0280b Mon Sep 17 00:00:00 2001 From: Arina Ielchiieva Date: Sun, 12 Jun 2016 13:48:54 +0000 Subject: [PATCH] DRILL-2593: 500 error when crc for a query profile is out of sync --- .../server/rest/profile/ProfileResources.java | 55 +++++++++++++------ .../src/main/resources/rest/profile/list.ftl | 9 +++ 2 files changed, 46 insertions(+), 18 deletions(-) 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 05441c00e2c..d2e953d783f 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 ProfileInfo(String queryId, long time, String foreman, String query, Stri 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 @@ protected ClusterCoordinator getCoordinator() { public class QProfiles { private List runningQueries; private List finishedQueries; + private List errors; - public QProfiles(List runningQueries, List finishedQueries) { + public QProfiles(List runningQueries, List finishedQueries, List erorrs) { this.runningQueries = runningQueries; this.finishedQueries = finishedQueries; + this.errors = erorrs; } public List getRunningQueries() { @@ -150,6 +152,8 @@ public List getRunningQueries() { public List getFinishedQueries() { return finishedQueries; } + + public List getErrors() { return errors; } } @GET @@ -160,33 +164,48 @@ public QProfiles getProfilesJSON() { final PersistentStore completed = getProvider().getOrCreateStore(QueryManager.QUERY_PROFILE); final TransientStore running = getCoordinator().getOrCreateTransientStore(QueryManager.RUNNING_QUERY_INFO); + final List errors = Lists.newArrayList(); + final List runningQueries = Lists.newArrayList(); - for (final Map.Entry 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> runningEntries = running.entries(); + while (runningEntries.hasNext()) { + try { + final Map.Entry 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 finishedQueries = Lists.newArrayList(); - for (Map.Entry 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 finishedQueries = Lists.newArrayList(); + + final Iterator> range = completed.getRange(0, MAX_PROFILES); + while (range.hasNext()) { + try { + final Map.Entry 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(), new ArrayList()); + throw UserException.resourceError(e) + .message("Failed to get profiles from persistent or ephemeral store.") + .build(logger); } - } @GET 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 cf92ede3e3c..88d14078b4a 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 @@ back
+ <#if (model.getErrors()?size > 0) > +
+ + Failed to get profiles:
+ <#list model.getErrors() as error> + ${error}
+ +
+ <#if (model.getRunningQueries()?size > 0) >

Running Queries