Repository: lens Updated Branches: refs/heads/master b805ee989 -> bee5cfd8d
LENS-909 : Remove sending result as part of email incase of inmemory results Project: http://git-wip-us.apache.org/repos/asf/lens/repo Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/bee5cfd8 Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/bee5cfd8 Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/bee5cfd8 Branch: refs/heads/master Commit: bee5cfd8d6f216a0af042a4ae6772aa4dabfe320 Parents: b805ee9 Author: Puneet Gupta <puneet.k.gu...@gmail.com> Authored: Sun Feb 7 15:11:34 2016 +0530 Committer: Amareshwari Sriramadasu <amareshw...@apache.org> Committed: Sun Feb 7 15:11:34 2016 +0530 ---------------------------------------------------------------------- .../lens/server/query/QueryEndNotifier.java | 26 +++++++++++++++++++- .../server/query/TestQueryEndEmailNotifier.java | 19 +++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lens/blob/bee5cfd8/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java ---------------------------------------------------------------------- diff --git a/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java b/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java index ca00b4d..63c38d9 100644 --- a/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java +++ b/lens-server/src/main/java/org/apache/lens/server/query/QueryEndNotifier.java @@ -34,6 +34,8 @@ import javax.mail.internet.MimeMultipart; import org.apache.lens.api.query.QueryStatus; import org.apache.lens.server.LensServices; +import org.apache.lens.server.api.driver.InMemoryResultSet; +import org.apache.lens.server.api.driver.LensResultSet; import org.apache.lens.server.api.error.LensException; import org.apache.lens.server.api.events.AsyncEventListener; import org.apache.lens.server.api.metrics.MetricsService; @@ -44,6 +46,9 @@ import org.apache.lens.server.model.LogSegregationContext; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hive.conf.HiveConf; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + import lombok.Data; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -60,6 +65,18 @@ public class QueryEndNotifier extends AsyncEventListener<QueryEnded> { /** The Constant EMAIL_ERROR_COUNTER. */ public static final String EMAIL_ERROR_COUNTER = "email-send-errors"; + /** The time in seconds for which in memory result is available */ + private final int inMemoryResultsetTTLSecs; + + /** Time formatter for email message corresponding to InMemoryResultset + * Example : 2016-01-25 07:05:46 PM, IST + */ + static final DateTimeFormatter MESSAGE_DATE_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:SS aaa, z"); + + /** Mail message corresponding to InMemoryResultset*/ + static final String RESULT_AVAILABLE_UNTIL_MSG = + "Query result is temporarily cached in the server and will be available until "; + /** The from. */ private final String from; @@ -97,6 +114,7 @@ public class QueryEndNotifier extends AsyncEventListener<QueryEnded> { mailSmtpConnectionTimeout = Integer.parseInt(conf.get(MAIL_SMTP_CONNECTIONTIMEOUT, MAIL_DEFAULT_SMTP_CONNECTIONTIMEOUT)); this.logSegregationContext = logSegregationContext; + this.inMemoryResultsetTTLSecs =conf.getInt(INMEMORY_RESULT_SET_TTL_SECS, DEFAULT_INMEMORY_RESULT_SET_TTL_SECS); } /* @@ -172,7 +190,13 @@ public class QueryEndNotifier extends AsyncEventListener<QueryEnded> { private String getResultMessage(QueryContext queryContext) { try { - return queryService.getResultset(queryContext.getQueryHandle()).toQueryResult().toPrettyString(); + LensResultSet result = queryService.getResultset(queryContext.getQueryHandle()); + if (result instanceof InMemoryResultSet) { // Do not include the result rows for InMemory results. + long availableUntilTime = ((InMemoryResultSet)result).getCreationTime() + inMemoryResultsetTTLSecs; + return RESULT_AVAILABLE_UNTIL_MSG + MESSAGE_DATE_FORMATTER.print(availableUntilTime); + } else { + return result.toQueryResult().toPrettyString(); + } } catch (LensException e) { log.error("Error retrieving result of query handle {} for sending e-mail", queryContext.getQueryHandle(), e); return "Error retrieving result."; http://git-wip-us.apache.org/repos/asf/lens/blob/bee5cfd8/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java ---------------------------------------------------------------------- diff --git a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java index e97a5a3..5196c9b 100644 --- a/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java +++ b/lens-server/src/test/java/org/apache/lens/server/query/TestQueryEndEmailNotifier.java @@ -36,15 +36,18 @@ import javax.ws.rs.core.Response; import org.apache.lens.api.LensConf; import org.apache.lens.api.LensSessionHandle; -import org.apache.lens.api.query.InMemoryQueryResult; import org.apache.lens.api.query.QueryHandle; import org.apache.lens.api.query.QueryResult; import org.apache.lens.api.query.QueryStatus.Status; import org.apache.lens.api.result.LensAPIResult; import org.apache.lens.server.LensJerseyTest; +import org.apache.lens.server.LensServerConf; import org.apache.lens.server.LensServerTestUtil; import org.apache.lens.server.LensServices; import org.apache.lens.server.api.LensConfConstants; +import org.apache.lens.server.api.driver.InMemoryResultSet; +import org.apache.lens.server.api.error.LensException; +import org.apache.lens.server.api.query.QueryContext; import org.apache.lens.server.api.query.QueryExecutionService; import org.apache.lens.server.common.TestResourceFile; @@ -242,18 +245,26 @@ public class TestQueryEndEmailNotifier extends LensJerseyTest { @Test(dataProvider = "success-tests") public void testSuccessfulQuery(Boolean lensPersistence, Boolean driverPersistence, MediaType mt) - throws InterruptedException { + throws InterruptedException, LensException { // successful query LensConf conf = getLensConf( LensConfConstants.QUERY_PERSISTENT_RESULT_SET, lensPersistence, LensConfConstants.QUERY_PERSISTENT_RESULT_INDRIVER, driverPersistence); - QueryHandle handle = launchAndWaitForQuery(conf, "select ID, IDSTR from " + TEST_TABLE, Status.SUCCESSFUL, mt); String expectedKeywords; + QueryHandle handle = launchAndWaitForQuery(conf, "select ID, IDSTR from " + TEST_TABLE, Status.SUCCESSFUL, mt); if (lensPersistence || driverPersistence) { QueryResult result = getLensQueryResult(target(), lensSessionId, handle, mt); expectedKeywords = result.toPrettyString(); } else { - expectedKeywords = InMemoryQueryResult.DECLARATION; + QueryContext context = queryService.getQueryContext(handle); + long creationTime = ((InMemoryResultSet) (context.getSelectedDriver().fetchResultSet(context))).getCreationTime(); + long inMemoryResultsetTTLSecs = + LensServerConf.getHiveConf().getInt(LensConfConstants.INMEMORY_RESULT_SET_TTL_SECS, + LensConfConstants.DEFAULT_INMEMORY_RESULT_SET_TTL_SECS); + expectedKeywords = + QueryEndNotifier.RESULT_AVAILABLE_UNTIL_MSG + + QueryEndNotifier.MESSAGE_DATE_FORMATTER.print(creationTime + inMemoryResultsetTTLSecs); + getLensQueryResultAsString(target(), lensSessionId, handle, mt); //Reading it so that query can be purged } WiserMessage message = getMessage(); assertKeywordsContains(message, handle, "Query SUCCESSFUL", expectedKeywords);