[2/4] lens git commit: LENS-743: Query retry framework for retrying upon transient failures

2016-10-16 Thread prongs
http://git-wip-us.apache.org/repos/asf/lens/blob/38ab6c60/lens-server-api/src/main/java/org/apache/lens/server/api/query/events/StatusChange.java
--
diff --git 
a/lens-server-api/src/main/java/org/apache/lens/server/api/query/events/StatusChange.java
 
b/lens-server-api/src/main/java/org/apache/lens/server/api/query/events/StatusChange.java
new file mode 100644
index 000..6169744
--- /dev/null
+++ 
b/lens-server-api/src/main/java/org/apache/lens/server/api/query/events/StatusChange.java
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.lens.server.api.query.events;
+
+import org.apache.lens.api.query.QueryHandle;
+import org.apache.lens.api.query.QueryStatus;
+
+/**
+ * The Class StatusChange.
+ */
+public abstract class StatusChange extends QueryEvent {
+
+  /**
+   * Instantiates a new status change.
+   *
+   * @param eventTime the event time
+   * @param prev  the prev
+   * @param current   the current
+   * @param handlethe handle
+   */
+  public StatusChange(long eventTime, QueryStatus.Status prev, 
QueryStatus.Status current, QueryHandle handle) {
+super(eventTime, prev, current, handle);
+  }
+
+  /**
+   * Check current state.
+   *
+   * @param status the status
+   */
+  protected void checkCurrentState(QueryStatus.Status status) {
+if (currentValue != status) {
+  throw new IllegalStateException("Invalid query state: " + currentValue + 
" query:" + queryHandle.toString());
+}
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lens/blob/38ab6c60/lens-server-api/src/main/java/org/apache/lens/server/api/retry/BackOffRetryHandler.java
--
diff --git 
a/lens-server-api/src/main/java/org/apache/lens/server/api/retry/BackOffRetryHandler.java
 
b/lens-server-api/src/main/java/org/apache/lens/server/api/retry/BackOffRetryHandler.java
new file mode 100644
index 000..5ea5710
--- /dev/null
+++ 
b/lens-server-api/src/main/java/org/apache/lens/server/api/retry/BackOffRetryHandler.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.lens.server.api.retry;
+
+import java.io.Serializable;
+
+/**
+ * A backoff retry handler.
+ *
+ * This allows a backoff on any call, so provides methods whether we can try 
the operation now,
+ * whats next time when operation can be performed and whether operation has 
exhausted all retries.
+ * Callers of this can do the following :
+ *
+ *  if (handler.canTryOpNow(FailureContext)) {
+ *try {
+ *  tryCallerOperation();
+ *  FailureContext.clear();
+ *} catch (any Transient Exception) {
+ *  FailureContext.updateFailure();
+ *  if (!handler.hasExhaustedRetries(FailureContext)) {
+ *// will be tried later again
+ *  }
+ *  throw exception;
+ *}
+ *  }
+ *
+ *  Note that this is only one of the possible use cases, other complex use 
cases are in retry framework.
+ */
+public interface BackOffRetryHandler extends 
Serializable {
+
+  /**
+   * To know whether operation can be done now.
+   *
+   * @param failContext FailureContext holding failures till now.
+   *
+   * @return true if operation can be done now, false otherwise.
+   */
+  boolean canTryOpNow(FC failContext);
+
+  /**
+   * Get the time when the operation can be done next.
+   *
+   * @param failContext FC 

[1/4] lens git commit: LENS-743: Query retry framework for retrying upon transient failures

2016-10-16 Thread prongs
Repository: lens
Updated Branches:
  refs/heads/master 182f6dcac -> 38ab6c608


http://git-wip-us.apache.org/repos/asf/lens/blob/38ab6c60/lens-server/src/main/java/org/apache/lens/server/scheduler/SchedulerServiceImpl.java
--
diff --git 
a/lens-server/src/main/java/org/apache/lens/server/scheduler/SchedulerServiceImpl.java
 
b/lens-server/src/main/java/org/apache/lens/server/scheduler/SchedulerServiceImpl.java
index c683a2c..00130d0 100644
--- 
a/lens-server/src/main/java/org/apache/lens/server/scheduler/SchedulerServiceImpl.java
+++ 
b/lens-server/src/main/java/org/apache/lens/server/scheduler/SchedulerServiceImpl.java
@@ -41,8 +41,8 @@ import org.apache.lens.server.api.LensErrorInfo;
 import org.apache.lens.server.api.error.LensException;
 import org.apache.lens.server.api.events.SchedulerAlarmEvent;
 import org.apache.lens.server.api.health.HealthStatus;
-import org.apache.lens.server.api.query.QueryEnded;
 import org.apache.lens.server.api.query.QueryExecutionService;
+import org.apache.lens.server.api.query.events.QueryEnded;
 import org.apache.lens.server.api.scheduler.SchedulerService;
 import org.apache.lens.server.error.LensSchedulerErrorCode;
 import org.apache.lens.server.session.LensSessionImpl;

http://git-wip-us.apache.org/repos/asf/lens/blob/38ab6c60/lens-server/src/test/java/org/apache/lens/server/query/QueryContextComparatorTest.java
--
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/query/QueryContextComparatorTest.java
 
b/lens-server/src/test/java/org/apache/lens/server/query/QueryContextComparatorTest.java
index 46adb7b..20243f4 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/query/QueryContextComparatorTest.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/query/QueryContextComparatorTest.java
@@ -27,16 +27,26 @@ import java.util.Comparator;
 
 import org.apache.lens.api.Priority;
 import org.apache.lens.server.api.query.QueryContext;
+import org.apache.lens.server.api.query.comparators.ChainedComparator;
+import org.apache.lens.server.api.query.comparators.FIFOQueryComparator;
+import org.apache.lens.server.api.query.comparators.QueryCostComparator;
+import org.apache.lens.server.api.query.comparators.QueryPriorityComparator;
 import org.apache.lens.server.api.query.cost.QueryCost;
 
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.Lists;
+
 public class QueryContextComparatorTest {
 
   private final Comparator priorityComparator = new 
QueryPriorityComparator();
   private final Comparator costComparator = new 
QueryCostComparator();
-
+  private final Comparator fifoComparator = new 
FIFOQueryComparator();
+  private final Comparator priorityAndFifoComparator
+= new ChainedComparator<>(Lists.newArrayList(priorityComparator, 
fifoComparator));
+  private final Comparator costAndFifoComparator
+= new ChainedComparator<>(Lists.newArrayList(costComparator, 
fifoComparator));
 
 
   @DataProvider
@@ -61,7 +71,7 @@ public class QueryContextComparatorTest {
 when(query2.getSelectedDriverQueryCost()).thenReturn(qcO2);
 
 when(qcO1.compareTo(qcO2)).thenReturn(resultOfQueryCostCompare);
-assertEquals(costComparator.compare(query1, query2), expectedResult);
+assertEquals(costAndFifoComparator.compare(query1, query2), 
expectedResult);
   }
 
   @Test
@@ -73,7 +83,7 @@ public class QueryContextComparatorTest {
 QueryContext query2 = mock(QueryContext.class);
 when(query2.getPriority()).thenReturn(Priority.LOW); // Ordinal = 3
 
-assertEquals(priorityComparator.compare(query1, query2), -2);
+assertEquals(priorityAndFifoComparator.compare(query1, query2), -2);
   }
 
 
@@ -114,8 +124,8 @@ public class QueryContextComparatorTest {
 
 // Cost and Priority both are same, hence the comparison should happen
 // on query submission time
-assertEquals(priorityComparator.compare(query1, query2), expectedResult);
-assertEquals(costComparator.compare(query1, query2), expectedResult);
+assertEquals(priorityAndFifoComparator.compare(query1, query2), 
expectedResult);
+assertEquals(costAndFifoComparator.compare(query1, query2), 
expectedResult);
 
   }
 }

http://git-wip-us.apache.org/repos/asf/lens/blob/38ab6c60/lens-server/src/test/java/org/apache/lens/server/query/TestEventService.java
--
diff --git 
a/lens-server/src/test/java/org/apache/lens/server/query/TestEventService.java 
b/lens-server/src/test/java/org/apache/lens/server/query/TestEventService.java
index 526accc..b906776 100644
--- 
a/lens-server/src/test/java/org/apache/lens/server/query/TestEventService.java
+++ 
b/lens-server/src/test/java/org/apache/lens/server/query/TestEventService.java
@@ -39,7 +39,7 @@ import org.apache.lens.server.api.events.AsyncEventListener;
 

[3/4] lens git commit: LENS-743: Query retry framework for retrying upon transient failures

2016-10-16 Thread prongs
http://git-wip-us.apache.org/repos/asf/lens/blob/38ab6c60/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
--
diff --git 
a/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
 
b/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
index d0662f4..63d3539 100644
--- 
a/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
+++ 
b/lens-server-api/src/main/java/org/apache/lens/server/api/query/QueryContext.java
@@ -27,16 +27,17 @@ import java.util.*;
 import java.util.concurrent.Future;
 
 import org.apache.lens.api.LensConf;
+import org.apache.lens.api.query.FailedAttempt;
 import org.apache.lens.api.query.LensQuery;
 import org.apache.lens.api.query.QueryHandle;
 import org.apache.lens.api.query.QueryStatus;
 import org.apache.lens.api.query.QueryStatus.Status;
 import org.apache.lens.server.api.LensConfConstants;
-import org.apache.lens.server.api.common.BackOffRetryHandler;
-import org.apache.lens.server.api.common.FailureContext;
 import org.apache.lens.server.api.driver.*;
 import org.apache.lens.server.api.error.LensException;
 import org.apache.lens.server.api.query.constraint.QueryLaunchingConstraint;
+import org.apache.lens.server.api.retry.BackOffRetryHandler;
+import org.apache.lens.server.api.retry.FailureContext;
 import org.apache.lens.server.api.util.LensUtil;
 
 import org.apache.hadoop.conf.Configuration;
@@ -53,7 +54,7 @@ import lombok.extern.slf4j.Slf4j;
  * The Class QueryContext.
  */
 @Slf4j
-public class QueryContext extends AbstractQueryContext {
+public class QueryContext extends AbstractQueryContext implements 
FailureContext {
 
   /**
* The Constant serialVersionUID.
@@ -191,7 +192,7 @@ public class QueryContext extends AbstractQueryContext {
   @Setter
   private byte[] queryConfHash;
 
-  transient FailureContext statusUpdateFailures = new FailureContext();
+  transient StatusUpdateFailureContext statusUpdateFailures = new 
StatusUpdateFailureContext();
 
   @Getter
   @Setter
@@ -200,7 +201,18 @@ public class QueryContext extends AbstractQueryContext {
   @Getter
   @Setter
   private transient Future queryLauncher;
+
   private final List 
driverStatusUpdateListeners = Lists.newArrayList();
+  @Getter
+  @Setter
+  List failedAttempts = Lists.newArrayList();
+
+  @Getter
+  @Setter
+  private BackOffRetryHandler driverRetryPolicy;
+  @Getter
+  @Setter
+  private BackOffRetryHandler serverRetryPolicy;
 
   /**
* Creates context from query
@@ -224,7 +236,7 @@ public class QueryContext extends AbstractQueryContext {
*/
   public QueryContext(PreparedQueryContext prepared, String user, LensConf 
qconf, Configuration conf) {
 this(prepared.getUserQuery(), user, qconf, mergeConf(prepared.getConf(), 
conf), prepared.getDriverContext()
-.getDriverQueryContextMap().keySet(), 
prepared.getDriverContext().getSelectedDriver(), true);
+  .getDriverQueryContextMap().keySet(), 
prepared.getDriverContext().getSelectedDriver(), true);
 setDriverContext(prepared.getDriverContext());
 setSelectedDriverQuery(prepared.getSelectedDriverQuery());
 setSelectedDriverQueryCost(prepared.getSelectedDriverQueryCost());
@@ -241,7 +253,7 @@ public class QueryContext extends AbstractQueryContext {
* @param selectedDriver SelectedDriver
*/
   QueryContext(String userQuery, String user, LensConf qconf, Configuration 
conf, Collection drivers,
-  LensDriver selectedDriver, boolean mergeDriverConf) {
+LensDriver selectedDriver, boolean mergeDriverConf) {
 this(userQuery, user, qconf, conf, drivers, selectedDriver, 
System.currentTimeMillis(), mergeDriverConf);
   }
 
@@ -257,7 +269,7 @@ public class QueryContext extends AbstractQueryContext {
* @param submissionTime the submission time
*/
   QueryContext(String userQuery, String user, LensConf qconf, Configuration 
conf, Collection drivers,
-  LensDriver selectedDriver, long submissionTime, boolean mergeDriverConf) 
{
+LensDriver selectedDriver, long submissionTime, boolean mergeDriverConf) {
 super(userQuery, user, qconf, conf, drivers, mergeDriverConf);
 this.submissionTime = submissionTime;
 this.queryHandle = new QueryHandle(UUID.randomUUID());
@@ -265,9 +277,9 @@ public class QueryContext extends AbstractQueryContext {
 this.lensConf = qconf;
 this.conf = conf;
 this.isPersistent = 
conf.getBoolean(LensConfConstants.QUERY_PERSISTENT_RESULT_SET,
-LensConfConstants.DEFAULT_PERSISTENT_RESULT_SET);
+  LensConfConstants.DEFAULT_PERSISTENT_RESULT_SET);
 this.isDriverPersistent = 
conf.getBoolean(LensConfConstants.QUERY_PERSISTENT_RESULT_INDRIVER,
-LensConfConstants.DEFAULT_DRIVER_PERSISTENT_RESULT_SET);
+  LensConfConstants.DEFAULT_DRIVER_PERSISTENT_RESULT_SET);
 this.userQuery = userQuery;
 if (selectedDriver != null) {