You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ja...@apache.org on 2016/01/08 22:46:07 UTC
incubator-geode git commit: GEODE-245: QueryMonitor cancellation is
being ignored by query using CompactRangeIndex Fixed QueryMonitor test hook
to pause at the correct point in code
Repository: incubator-geode
Updated Branches:
refs/heads/develop d302af5ea -> 57d848606
GEODE-245: QueryMonitor cancellation is being ignored by query using CompactRangeIndex
Fixed QueryMonitor test hook to pause at the correct point in code
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/57d84860
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/57d84860
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/57d84860
Branch: refs/heads/develop
Commit: 57d8486061c827a349edd7f86aa1eac91d45b668
Parents: d302af5
Author: Jason Huynh <hu...@gmail.com>
Authored: Wed Jan 6 09:55:49 2016 -0800
Committer: Jason Huynh <hu...@gmail.com>
Committed: Fri Jan 8 13:29:33 2016 -0800
----------------------------------------------------------------------
.../cache/query/internal/DefaultQuery.java | 8 ++++--
.../cache/query/internal/QueryMonitor.java | 26 +++-----------------
.../query/internal/index/CompactRangeIndex.java | 2 ++
3 files changed, 12 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/57d84860/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/DefaultQuery.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/DefaultQuery.java b/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/DefaultQuery.java
index 9419d04..eb6948c 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/DefaultQuery.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/DefaultQuery.java
@@ -360,6 +360,7 @@ public class DefaultQuery implements Query {
if (DefaultQuery.testHook != null) {
DefaultQuery.testHook.doTestHook(1);
}
+
result = qe.executeQuery(this, parameters, null);
// For local queries returning pdx objects wrap the resultset with ResultsCollectionPdxDeserializerWrapper
// which deserializes these pdx objects.
@@ -382,6 +383,7 @@ public class DefaultQuery implements Query {
// starts on the Local Buckets.
queryMonitor.monitorQueryThread(Thread.currentThread(), this);
}
+
context.setCqQueryContext(this.isCqQuery);
result = executeUsingContext(context);
//Only wrap/copy results when copy on read is set and an index is used
@@ -552,7 +554,6 @@ public class DefaultQuery implements Query {
public Object executeUsingContext(ExecutionContext context)
throws FunctionDomainException, TypeMismatchException, NameResolutionException, QueryInvocationTargetException {
QueryObserver observer = QueryObserverHolder.getInstance();
-
long startTime = CachePerfStats.getStatTime();
TXStateProxy tx = null;
if (!((GemFireCacheImpl)this.cache).isClient()) { // fixes bug 42294
@@ -562,6 +563,10 @@ public class DefaultQuery implements Query {
observer.startQuery(this);
observer.beforeQueryEvaluation(compiledQuery, context);
Object results = null;
+
+ if (DefaultQuery.testHook != null) {
+ DefaultQuery.testHook.doTestHook(6);
+ }
try {
// two-pass evaluation.
// first pre-compute dependencies, cached in the context.
@@ -990,7 +995,6 @@ public class DefaultQuery implements Query {
public Object execute(RegionFunctionContext context, Object[] parameters)
throws FunctionDomainException, TypeMismatchException,
NameResolutionException, QueryInvocationTargetException {
-
Object result = null;
// Supported only with RegionFunctionContext
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/57d84860/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/QueryMonitor.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/QueryMonitor.java b/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/QueryMonitor.java
index 65a64a4..6843576 100755
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/QueryMonitor.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/QueryMonitor.java
@@ -130,35 +130,19 @@ public class QueryMonitor implements Runnable {
long maxTimeSet = GemFireCacheImpl.getInstance().TEST_MAX_QUERY_EXECUTION_TIME;
QueryThreadTask queryTask = (QueryThreadTask)queryThreads.peek();
+ long currentTime = System.currentTimeMillis();
+
// This is to check if the QueryMonitoring thread slept longer than the expected time.
// Its seen that in some cases based on OS thread scheduling the thread can sleep much
// longer than the specified time.
if (queryTask != null) {
- if ((System.currentTimeMillis() - queryTask.StartTime) > maxTimeSet){
+ if ((currentTime - queryTask.StartTime) > maxTimeSet){
// The sleep() is unpredictable.
testException = new QueryExecutionTimeoutException("The QueryMonitor thread may be sleeping longer than" +
" the set sleep time. This will happen as the sleep is based on OS thread scheduling," +
" verify the time spent by the executor thread.");
}
}
-
- // This is to see if query finished before it could get canceled, this could happen because
- // of a faster machine.
- // Check if the query finished before the max_query_execution time.
- queryTask = (QueryThreadTask)this.queryMonitorTasks.get(queryThread);
- if (queryTask != null){
- this.queryMonitorTasks.remove(queryThread);
- if (!GemFireCacheImpl.getInstance().TEST_MAX_QUERY_EXECUTION_TIME_OVERRIDE_EXCEPTION && testException == null && ((System.currentTimeMillis() - queryTask.StartTime) <
- (maxTimeSet + 10 /* 10ms buffer */))){
- testException = new QueryExecutionTimeoutException("The Query completed sucessfully before it got canceled.");
- }
- }
-
- if ((testException == null) && (query instanceof DefaultQuery)) {
- if (((DefaultQuery)query).isCanceled()) {
- testException = new QueryExecutionTimeoutException("The query task could not be found but the query is marked as having been canceled");
- }
- }
}
// END - DUnit Test purpose.
@@ -233,9 +217,7 @@ public class QueryMonitor implements Runnable {
}
continue;
}
- if (DefaultQuery.testHook != null) {
- DefaultQuery.testHook.doTestHook(6);
- }
+
long currentTime = System.currentTimeMillis();
// Check if the sleepTime is greater than the remaining query execution time.
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/57d84860/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndex.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndex.java b/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndex.java
index 79d0c54..13c8a8e 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndex.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/cache/query/internal/index/CompactRangeIndex.java
@@ -767,6 +767,8 @@ public class CompactRangeIndex extends AbstractIndex {
while (entriesIter.hasNext()) {
try {
+ // Check if query execution on this thread is canceled.
+ QueryMonitor.isQueryExecutionCanceled();
if (IndexManager.testHook != null) {
if (this.region.getCache().getLogger().fineEnabled()) {
this.region