You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2017/02/22 02:31:45 UTC

[11/13] kylin git commit: code refactor per KYLIN-2438

code refactor per KYLIN-2438


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/4bdb62cb
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/4bdb62cb
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/4bdb62cb

Branch: refs/heads/master-hbase0.98
Commit: 4bdb62cb3697e15d005a1a5383edf21f2a3ff567
Parents: 661f016
Author: Hongbin Ma <ma...@apache.org>
Authored: Mon Feb 20 10:15:53 2017 +0800
Committer: Hongbin Ma <ma...@apache.org>
Committed: Tue Feb 21 20:58:31 2017 +0800

----------------------------------------------------------------------
 .../apache/kylin/common/KylinConfigBase.java    |   6 +-
 .../org/apache/kylin/common/QueryContext.java   |   2 +-
 .../cube/inmemcubing/ConcurrentDiskStore.java   |   7 +-
 .../cube/inmemcubing/InMemCubeBuilder.java      |   5 -
 .../kylin/cube/inmemcubing/MemDiskStore.java    |   6 -
 .../apache/kylin/gridtable/EmptyGTScanner.java  |   9 +-
 .../kylin/gridtable/GTAggregateScanner.java     |   7 +-
 .../apache/kylin/gridtable/GTFilterScanner.java |   5 -
 .../apache/kylin/gridtable/GTScanRequest.java   |   9 +-
 .../org/apache/kylin/gridtable/IGTScanner.java  |   4 -
 .../benchmark/SortedGTRecordGenerator.java      |   6 -
 .../gridtable/memstore/GTSimpleMemStore.java    |   5 -
 .../gridtable/AggregationCacheSpillTest.java    |  12 +-
 .../kylin/gridtable/SimpleGridTableTest.java    |   9 +-
 .../storage/gtrecord/CubeSegmentScanner.java    |   5 -
 .../kylin/storage/gtrecord/ScannerWorker.java   |  15 +-
 .../gtrecord/StorageResponseGTScatter.java      |   9 +-
 .../apache/kylin/query/ITFailfastQueryTest.java | 154 +++++++++++++++++++
 .../apache/kylin/query/ITKylinQueryTest.java    |  18 ---
 .../org/apache/kylin/query/KylinTestBase.java   |  15 ++
 .../apache/kylin/rest/service/QueryService.java |  12 +-
 .../hbase/cube/HBaseScannerBenchmark.java       |   3 -
 .../storage/hbase/cube/SimpleHBaseStore.java    |   5 -
 .../hbase/cube/v2/CubeHBaseEndpointRPC.java     |  22 ++-
 .../storage/hbase/cube/v2/CubeHBaseScanRPC.java |  33 +---
 .../hbase/cube/v2/HBaseReadonlyStore.java       |   5 -
 .../coprocessor/endpoint/CubeVisitService.java  |   2 +-
 .../endpoint/protobuf/CubeVisit.proto           |   2 +-
 .../hbase/steps/SandboxMetastoreCLI.java        |   1 -
 29 files changed, 210 insertions(+), 183 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
index f7d8452..13d967d 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java
@@ -826,7 +826,7 @@ abstract public class KylinConfigBase implements Serializable {
     }
 
     public int getLargeQueryThreshold() {
-        return Integer.parseInt(getOptional("kylin.query.large-query-threshold", String.valueOf((int) (getScanThreshold() * 0.1))));
+        return Integer.parseInt(getOptional("kylin.query.large-query-threshold", String.valueOf(1000000)));
     }
 
     public int getDerivedInThreshold() {
@@ -865,6 +865,10 @@ abstract public class KylinConfigBase implements Serializable {
         return Long.parseLong(this.getOptional("kylin.query.cache-threshold-scan-count", String.valueOf(10 * 1024)));
     }
 
+    public long getQueryScanBytesCacheThreshold() {
+        return Long.parseLong(this.getOptional("kylin.query.cache-threshold-scan-bytes", String.valueOf(1024 * 1024)));
+    }
+
     public boolean isQuerySecureEnabled() {
         return Boolean.parseBoolean(this.getOptional("kylin.query.security-enabled", "true"));
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-common/src/main/java/org/apache/kylin/common/QueryContext.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/QueryContext.java b/core-common/src/main/java/org/apache/kylin/common/QueryContext.java
index 67925b6..5457aa5 100644
--- a/core-common/src/main/java/org/apache/kylin/common/QueryContext.java
+++ b/core-common/src/main/java/org/apache/kylin/common/QueryContext.java
@@ -49,7 +49,7 @@ public class QueryContext {
     }
 
     public String getQueryId() {
-        return queryId;
+        return queryId == null ? "" : queryId;
     }
 
     public void setQueryId(String queryId) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/ConcurrentDiskStore.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/ConcurrentDiskStore.java b/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/ConcurrentDiskStore.java
index 5219ede..41d2dfb 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/ConcurrentDiskStore.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/ConcurrentDiskStore.java
@@ -265,11 +265,6 @@ public class ConcurrentDiskStore implements IGTStore, Closeable {
             return info;
         }
 
-        @Override
-        public long getScannedRowCount() {
-            return count;
-        }
-
     }
 
     private class Writer implements IGTWriter {
@@ -371,4 +366,4 @@ public class ConcurrentDiskStore implements IGTStore, Closeable {
         return "ConcurrentDiskStore@" + (info.getTableName() == null ? this.hashCode() : info.getTableName());
     }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilder.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilder.java b/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilder.java
index a74f0c0..e08844e 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilder.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilder.java
@@ -564,10 +564,5 @@ public class InMemCubeBuilder extends AbstractInMemCubeBuilder {
         public GTInfo getInfo() {
             return info;
         }
-
-        @Override
-        public long getScannedRowCount() {
-            return 0L;
-        }
     }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/MemDiskStore.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/MemDiskStore.java b/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/MemDiskStore.java
index 81403ab..a5471df 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/MemDiskStore.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/MemDiskStore.java
@@ -277,12 +277,6 @@ public class MemDiskStore implements IGTStore, Closeable {
         public GTInfo getInfo() {
             return info;
         }
-
-        @Override
-        public long getScannedRowCount() {
-            return count;
-        }
-
     }
 
     private class Writer implements IGTWriter {

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/gridtable/EmptyGTScanner.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/EmptyGTScanner.java b/core-cube/src/main/java/org/apache/kylin/gridtable/EmptyGTScanner.java
index 01d31f0..8b6c995 100644
--- a/core-cube/src/main/java/org/apache/kylin/gridtable/EmptyGTScanner.java
+++ b/core-cube/src/main/java/org/apache/kylin/gridtable/EmptyGTScanner.java
@@ -22,10 +22,8 @@ import java.io.IOException;
 import java.util.Iterator;
 
 public class EmptyGTScanner implements IGTScanner {
-    private long reportScannedRowCount;
 
-    public EmptyGTScanner(long reportScannedRowCount) {
-        this.reportScannedRowCount = reportScannedRowCount;
+    public EmptyGTScanner() {
     }
 
     @Override
@@ -34,11 +32,6 @@ public class EmptyGTScanner implements IGTScanner {
     }
 
     @Override
-    public long getScannedRowCount() {
-        return reportScannedRowCount;
-    }
-
-    @Override
     public void close() throws IOException {
 
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java b/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java
index 8b0efcc..7cdd4f5 100644
--- a/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java
+++ b/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java
@@ -129,11 +129,6 @@ public class GTAggregateScanner implements IGTScanner {
     }
 
     @Override
-    public long getScannedRowCount() {
-        return inputScanner.getScannedRowCount();
-    }
-
-    @Override
     public void close() throws IOException {
         inputScanner.close();
         aggrCache.close();
@@ -598,4 +593,4 @@ public class GTAggregateScanner implements IGTScanner {
             }
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/gridtable/GTFilterScanner.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/GTFilterScanner.java b/core-cube/src/main/java/org/apache/kylin/gridtable/GTFilterScanner.java
index f1f84af..717f89c 100644
--- a/core-cube/src/main/java/org/apache/kylin/gridtable/GTFilterScanner.java
+++ b/core-cube/src/main/java/org/apache/kylin/gridtable/GTFilterScanner.java
@@ -63,11 +63,6 @@ public class GTFilterScanner implements IGTScanner {
     }
 
     @Override
-    public long getScannedRowCount() {
-        return inputScanner.getScannedRowCount();
-    }
-
-    @Override
     public void close() throws IOException {
         inputScanner.close();
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/gridtable/GTScanRequest.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/GTScanRequest.java b/core-cube/src/main/java/org/apache/kylin/gridtable/GTScanRequest.java
index 651e5c4..4629c8e 100644
--- a/core-cube/src/main/java/org/apache/kylin/gridtable/GTScanRequest.java
+++ b/core-cube/src/main/java/org/apache/kylin/gridtable/GTScanRequest.java
@@ -42,7 +42,7 @@ import com.google.common.collect.Sets;
 public class GTScanRequest {
 
     private static final Logger logger = LoggerFactory.getLogger(GTScanRequest.class);
-    
+
     //it's not necessary to increase the checkInterval to very large because the check cost is not high
     //changing it might break org.apache.kylin.query.ITKylinQueryTest.testTimeoutQuery()
     public static final int terminateCheckInterval = 100;
@@ -175,8 +175,8 @@ public class GTScanRequest {
     public IGTScanner decorateScanner(IGTScanner scanner, boolean filterToggledOn, boolean aggrToggledOn, boolean hasPreFiltered, boolean spillEnabled) throws IOException {
         IGTScanner result = scanner;
         if (!filterToggledOn) { //Skip reading this section if you're not profiling! 
-            int scanned = lookAndForget(result);
-            return new EmptyGTScanner(scanned);
+            lookAndForget(result);
+            return new EmptyGTScanner();
         } else {
 
             if (this.hasFilterPushDown() && !hasPreFiltered) {
@@ -184,9 +184,8 @@ public class GTScanRequest {
             }
 
             if (!aggrToggledOn) {//Skip reading this section if you're not profiling! 
-                long scanned = result.getScannedRowCount();
                 lookAndForget(result);
-                return new EmptyGTScanner(scanned);
+                return new EmptyGTScanner();
             }
 
             if (!this.isAllowStorageAggregation()) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/gridtable/IGTScanner.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/IGTScanner.java b/core-cube/src/main/java/org/apache/kylin/gridtable/IGTScanner.java
index 980787b..96c7972 100644
--- a/core-cube/src/main/java/org/apache/kylin/gridtable/IGTScanner.java
+++ b/core-cube/src/main/java/org/apache/kylin/gridtable/IGTScanner.java
@@ -21,9 +21,5 @@ package org.apache.kylin.gridtable;
 import java.io.Closeable;
 
 public interface IGTScanner extends Iterable<GTRecord>, Closeable {
-
     GTInfo getInfo();
-
-    long getScannedRowCount();
-
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/gridtable/benchmark/SortedGTRecordGenerator.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/benchmark/SortedGTRecordGenerator.java b/core-cube/src/main/java/org/apache/kylin/gridtable/benchmark/SortedGTRecordGenerator.java
index 9c839bb..71a0a21 100644
--- a/core-cube/src/main/java/org/apache/kylin/gridtable/benchmark/SortedGTRecordGenerator.java
+++ b/core-cube/src/main/java/org/apache/kylin/gridtable/benchmark/SortedGTRecordGenerator.java
@@ -184,12 +184,6 @@ public class SortedGTRecordGenerator {
         public GTInfo getInfo() {
             return info;
         }
-
-        @Override
-        public long getScannedRowCount() {
-            return counter;
-        }
-
     }
 
     private class Distribution {

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/main/java/org/apache/kylin/gridtable/memstore/GTSimpleMemStore.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/memstore/GTSimpleMemStore.java b/core-cube/src/main/java/org/apache/kylin/gridtable/memstore/GTSimpleMemStore.java
index f9f370b..e1b5406 100644
--- a/core-cube/src/main/java/org/apache/kylin/gridtable/memstore/GTSimpleMemStore.java
+++ b/core-cube/src/main/java/org/apache/kylin/gridtable/memstore/GTSimpleMemStore.java
@@ -106,11 +106,6 @@ public class GTSimpleMemStore implements IGTStore {
             }
 
             @Override
-            public long getScannedRowCount() {
-                return count;
-            }
-
-            @Override
             public void close() throws IOException {
             }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/test/java/org/apache/kylin/gridtable/AggregationCacheSpillTest.java
----------------------------------------------------------------------
diff --git a/core-cube/src/test/java/org/apache/kylin/gridtable/AggregationCacheSpillTest.java b/core-cube/src/test/java/org/apache/kylin/gridtable/AggregationCacheSpillTest.java
index 7abb069..8b2243c 100644
--- a/core-cube/src/test/java/org/apache/kylin/gridtable/AggregationCacheSpillTest.java
+++ b/core-cube/src/test/java/org/apache/kylin/gridtable/AggregationCacheSpillTest.java
@@ -68,11 +68,6 @@ public class AggregationCacheSpillTest extends LocalFileMetadataTestCase {
             }
 
             @Override
-            public long getScannedRowCount() {
-                throw new UnsupportedOperationException();
-            }
-
-            @Override
             public void close() throws IOException {
             }
 
@@ -109,11 +104,6 @@ public class AggregationCacheSpillTest extends LocalFileMetadataTestCase {
             }
 
             @Override
-            public long getScannedRowCount() {
-                throw new UnsupportedOperationException();
-            }
-
-            @Override
             public void close() throws IOException {
             }
 
@@ -141,4 +131,4 @@ public class AggregationCacheSpillTest extends LocalFileMetadataTestCase {
         assertEquals(10, count);
         scanner.close();
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-cube/src/test/java/org/apache/kylin/gridtable/SimpleGridTableTest.java
----------------------------------------------------------------------
diff --git a/core-cube/src/test/java/org/apache/kylin/gridtable/SimpleGridTableTest.java b/core-cube/src/test/java/org/apache/kylin/gridtable/SimpleGridTableTest.java
index 4ac6644..14a25c5 100644
--- a/core-cube/src/test/java/org/apache/kylin/gridtable/SimpleGridTableTest.java
+++ b/core-cube/src/test/java/org/apache/kylin/gridtable/SimpleGridTableTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.kylin.gridtable;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -53,7 +52,6 @@ public class SimpleGridTableTest extends LocalFileMetadataTestCase {
 
         GTBuilder builder = rebuild(table);
         IGTScanner scanner = scan(table);
-        assertEquals(builder.getWrittenRowCount(), scanner.getScannedRowCount());
     }
 
     @Test
@@ -64,7 +62,6 @@ public class SimpleGridTableTest extends LocalFileMetadataTestCase {
 
         GTBuilder builder = rebuild(table);
         IGTScanner scanner = scan(table);
-        assertEquals(builder.getWrittenRowCount(), scanner.getScannedRowCount());
     }
 
     @Test
@@ -75,7 +72,6 @@ public class SimpleGridTableTest extends LocalFileMetadataTestCase {
 
         GTBuilder builder = rebuild(table);
         IGTScanner scanner = scanAndAggregate(table);
-        assertEquals(builder.getWrittenRowCount(), scanner.getScannedRowCount());
     }
 
     @Test
@@ -86,7 +82,6 @@ public class SimpleGridTableTest extends LocalFileMetadataTestCase {
 
         rebuildViaAppend(table);
         IGTScanner scanner = scan(table);
-        assertEquals(10, scanner.getScannedRowCount());
     }
 
     private IGTScanner scan(GridTable table) throws IOException {
@@ -101,12 +96,11 @@ public class SimpleGridTableTest extends LocalFileMetadataTestCase {
             System.out.println(r);
         }
         scanner.close();
-        System.out.println("Scanned Row Count: " + scanner.getScannedRowCount());
         return scanner;
     }
 
     private IGTScanner scanAndAggregate(GridTable table) throws IOException {
-        GTScanRequest req = new GTScanRequestBuilder().setInfo(table.getInfo()).setRanges(null).setDimensions(null).setAggrGroupBy(setOf(0, 2)).setAggrMetrics(setOf(3, 4)).setAggrMetricsFuncs(new String[]{"count", "sum"}).setFilterPushDown(null).createGTScanRequest();
+        GTScanRequest req = new GTScanRequestBuilder().setInfo(table.getInfo()).setRanges(null).setDimensions(null).setAggrGroupBy(setOf(0, 2)).setAggrMetrics(setOf(3, 4)).setAggrMetricsFuncs(new String[] { "count", "sum" }).setFilterPushDown(null).createGTScanRequest();
         IGTScanner scanner = table.scan(req);
         int i = 0;
         for (GTRecord r : scanner) {
@@ -135,7 +129,6 @@ public class SimpleGridTableTest extends LocalFileMetadataTestCase {
             System.out.println(r);
         }
         scanner.close();
-        System.out.println("Scanned Row Count: " + scanner.getScannedRowCount());
         return scanner;
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/CubeSegmentScanner.java
----------------------------------------------------------------------
diff --git a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/CubeSegmentScanner.java b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/CubeSegmentScanner.java
index 029502c..4f206d4 100644
--- a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/CubeSegmentScanner.java
+++ b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/CubeSegmentScanner.java
@@ -96,11 +96,6 @@ public class CubeSegmentScanner implements IGTScanner {
         return scanRequest == null ? null : scanRequest.getInfo();
     }
 
-    @Override
-    public long getScannedRowCount() {
-        return scanner.getScannedRowCount();
-    }
-
     public CubeSegment getSegment() {
         return this.cubeSeg;
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/ScannerWorker.java
----------------------------------------------------------------------
diff --git a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/ScannerWorker.java b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/ScannerWorker.java
index fd50c54..9e89227 100644
--- a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/ScannerWorker.java
+++ b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/ScannerWorker.java
@@ -18,6 +18,10 @@
 
 package org.apache.kylin.storage.gtrecord;
 
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+
 import org.apache.kylin.cube.cuboid.Cuboid;
 import org.apache.kylin.gridtable.EmptyGTScanner;
 import org.apache.kylin.gridtable.GTInfo;
@@ -29,10 +33,6 @@ import org.apache.kylin.metadata.model.ISegment;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Iterator;
-
 public class ScannerWorker {
 
     private static final Logger logger = LoggerFactory.getLogger(ScannerWorker.class);
@@ -41,7 +41,7 @@ public class ScannerWorker {
     public ScannerWorker(ISegment segment, Cuboid cuboid, GTScanRequest scanRequest, String gtStorage) {
         if (scanRequest == null) {
             logger.info("Segment {} will be skipped", segment);
-            internal = new EmptyGTScanner(0);
+            internal = new EmptyGTScanner();
             return;
         }
 
@@ -62,9 +62,4 @@ public class ScannerWorker {
     public void close() throws IOException {
         internal.close();
     }
-
-    public long getScannedRowCount() {
-        return internal.getScannedRowCount();
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/StorageResponseGTScatter.java
----------------------------------------------------------------------
diff --git a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/StorageResponseGTScatter.java b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/StorageResponseGTScatter.java
index dc8746f..3904b5c 100644
--- a/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/StorageResponseGTScatter.java
+++ b/core-storage/src/main/java/org/apache/kylin/storage/gtrecord/StorageResponseGTScatter.java
@@ -45,15 +45,13 @@ public class StorageResponseGTScatter implements IGTScanner {
     private IPartitionStreamer partitionStreamer;
     private Iterator<byte[]> blocks;
     private ImmutableBitSet columns;
-    private long totalScannedCount;
     private int storagePushDownLimit = -1;
 
-    public StorageResponseGTScatter(GTInfo info, IPartitionStreamer partitionStreamer, ImmutableBitSet columns, long totalScannedCount, int storagePushDownLimit) {
+    public StorageResponseGTScatter(GTInfo info, IPartitionStreamer partitionStreamer, ImmutableBitSet columns, int storagePushDownLimit) {
         this.info = info;
         this.partitionStreamer = partitionStreamer;
         this.blocks = partitionStreamer.asByteArrayIterator();
         this.columns = columns;
-        this.totalScannedCount = totalScannedCount;
         this.storagePushDownLimit = storagePushDownLimit;
     }
 
@@ -63,11 +61,6 @@ public class StorageResponseGTScatter implements IGTScanner {
     }
 
     @Override
-    public long getScannedRowCount() {
-        return totalScannedCount;
-    }
-
-    @Override
     public void close() throws IOException {
         //If upper consumer failed while consuming the GTRecords, the consumer should call IGTScanner's close method to ensure releasing resource
         partitionStreamer.close();

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/kylin-it/src/test/java/org/apache/kylin/query/ITFailfastQueryTest.java
----------------------------------------------------------------------
diff --git a/kylin-it/src/test/java/org/apache/kylin/query/ITFailfastQueryTest.java b/kylin-it/src/test/java/org/apache/kylin/query/ITFailfastQueryTest.java
new file mode 100644
index 0000000..a3720c8
--- /dev/null
+++ b/kylin-it/src/test/java/org/apache/kylin/query/ITFailfastQueryTest.java
@@ -0,0 +1,154 @@
+/*
+ * 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.kylin.query;
+
+import java.io.File;
+import java.util.Map;
+
+import org.apache.kylin.common.KylinConfig;
+import org.apache.kylin.common.QueryContext;
+import org.apache.kylin.common.exceptions.ResourceLimitExceededException;
+import org.apache.kylin.metadata.realization.RealizationType;
+import org.apache.kylin.query.routing.Candidate;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import com.google.common.collect.Maps;
+
+public class ITFailfastQueryTest extends KylinTestBase {
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        printInfo("setUp in ITFailfastQueryTest");
+        Map<RealizationType, Integer> priorities = Maps.newHashMap();
+        priorities.put(RealizationType.HYBRID, 0);
+        priorities.put(RealizationType.CUBE, 0);
+        priorities.put(RealizationType.INVERTED_INDEX, 0);
+        Candidate.setPriorities(priorities);
+        joinType = "left";
+        setupAll();
+    }
+
+    @After
+    public void cleanUp() {
+        QueryContext.reset();
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        printInfo("tearDown in ITFailfastQueryTest");
+        Candidate.restorePriorities();
+        clean();
+    }
+
+    @Test
+    public void testPartitionExceedMaxScanBytes() throws Exception {
+        String key = "kylin.storage.partition.max-scan-bytes";
+        long saved = KylinConfig.getInstanceFromEnv().getPartitionMaxScanBytes();
+        KylinConfig.getInstanceFromEnv().setProperty(key, "18000");//very low threshold 
+
+        boolean meetExpectedException = false;
+        try {
+            String queryFileName = getQueryFolderPrefix() + "src/test/resources/query/sql/query01.sql";
+            File sqlFile = new File(queryFileName);
+            try {
+                runSQL(sqlFile, false, false);
+            } catch (Exception e) {
+                if (findRoot(e) instanceof ResourceLimitExceededException) {
+                    //expected
+                    meetExpectedException = true;
+                } else {
+                    throw new RuntimeException(e);
+                }
+            }
+
+            if (!meetExpectedException) {
+                throw new RuntimeException("Did not meet expected exception");
+            }
+        } finally {
+            KylinConfig.getInstanceFromEnv().setProperty(key, String.valueOf(saved));
+        }
+    }
+
+    @Test
+    public void testPartitionNotExceedMaxScanBytes() throws Exception {
+        String key = "kylin.storage.partition.max-scan-bytes";
+        long saved = KylinConfig.getInstanceFromEnv().getPartitionMaxScanBytes();
+        KylinConfig.getInstanceFromEnv().setProperty(key, "20000");//enough threshold 
+
+        try {
+            String queryFileName = getQueryFolderPrefix() + "src/test/resources/query/sql/query01.sql";
+            File sqlFile = new File(queryFileName);
+            runSQL(sqlFile, false, false);
+        } finally {
+            KylinConfig.getInstanceFromEnv().setProperty(key, String.valueOf(saved));
+        }
+    }
+
+    @Test
+    public void testQueryExceedMaxScanBytes() throws Exception {
+        String key = "kylin.query.max-scan-bytes";
+        long saved = KylinConfig.getInstanceFromEnv().getQueryMaxScanBytes();
+        KylinConfig.getInstanceFromEnv().setProperty(key, "30000");//very low threshold 
+
+        boolean meetExpectedException = false;
+        try {
+            String queryFileName = getQueryFolderPrefix() + "src/test/resources/query/sql/query01.sql";
+            File sqlFile = new File(queryFileName);
+            try {
+                runSQL(sqlFile, false, false);
+            } catch (Exception e) {
+                if (findRoot(e) instanceof ResourceLimitExceededException) {
+                    //expected
+                    meetExpectedException = true;
+                } else {
+                    throw new RuntimeException(e);
+                }
+            }
+
+            if (!meetExpectedException) {
+                throw new RuntimeException("Did not meet expected exception");
+            }
+        } finally {
+            KylinConfig.getInstanceFromEnv().setProperty(key, String.valueOf(saved));
+        }
+    }
+
+    @Test
+    public void testQueryNotExceedMaxScanBytes() throws Exception {
+        String key = "kylin.query.max-scan-bytes";
+        long saved = KylinConfig.getInstanceFromEnv().getQueryMaxScanBytes();
+        KylinConfig.getInstanceFromEnv().setProperty(key, "40000");//enough threshold 
+
+        try {
+            String queryFileName = getQueryFolderPrefix() + "src/test/resources/query/sql/query01.sql";
+            File sqlFile = new File(queryFileName);
+            runSQL(sqlFile, false, false);
+        } finally {
+            KylinConfig.getInstanceFromEnv().setProperty(key, String.valueOf(saved));
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java
----------------------------------------------------------------------
diff --git a/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java b/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java
index 842ce40..1158704 100644
--- a/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java
+++ b/kylin-it/src/test/java/org/apache/kylin/query/ITKylinQueryTest.java
@@ -74,21 +74,6 @@ public class ITKylinQueryTest extends KylinTestBase {
         clean();
     }
 
-    protected String getQueryFolderPrefix() {
-        return "";
-    }
-
-    protected Throwable findRoot(Throwable throwable) {
-        while (true) {
-            if (throwable.getCause() != null) {
-                throwable = throwable.getCause();
-            } else {
-                break;
-            }
-        }
-        return throwable;
-    }
-
     @Test
     public void testTimeoutQuery() throws Exception {
         try {
@@ -121,9 +106,6 @@ public class ITKylinQueryTest extends KylinTestBase {
             try {
                 runSQL(sqlFile, false, false);
             } catch (SQLException e) {
-
-                System.out.println(e.getMessage());
-
                 if (findRoot(e) instanceof KylinTimeoutException) {
                     //expected
                     continue;

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java
----------------------------------------------------------------------
diff --git a/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java b/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java
index 402aaa0..fd04b2f 100644
--- a/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java
+++ b/kylin-it/src/test/java/org/apache/kylin/query/KylinTestBase.java
@@ -692,4 +692,19 @@ public class KylinTestBase {
         return OLAPContext.getThreadLocalContexts().iterator().next();
     }
 
+    protected String getQueryFolderPrefix() {
+        return "";
+    }
+
+    protected Throwable findRoot(Throwable throwable) {
+        while (true) {
+            if (throwable.getCause() != null) {
+                throwable = throwable.getCause();
+            } else {
+                break;
+            }
+        }
+        return throwable;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
----------------------------------------------------------------------
diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
index 4c02aa4..122b823 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
@@ -361,14 +361,16 @@ public class QueryService extends BasicService {
                     sqlResponse = query(sqlRequest);
 
                     long durationThreshold = kylinConfig.getQueryDurationCacheThreshold();
-                    long scancountThreshold = kylinConfig.getQueryScanCountCacheThreshold();
+                    long scanCountThreshold = kylinConfig.getQueryScanCountCacheThreshold();
+                    long scanBytesThreshold = kylinConfig.getQueryScanBytesCacheThreshold();
                     sqlResponse.setDuration(System.currentTimeMillis() - startTime);
                     logger.info("Stats of SQL response: isException: {}, duration: {}, total scan count {}", //
                             String.valueOf(sqlResponse.getIsException()), String.valueOf(sqlResponse.getDuration()), String.valueOf(sqlResponse.getTotalScanCount()));
-                    if (checkCondition(queryCacheEnabled, "query cache is disabled") && //
-                            checkCondition(!sqlResponse.getIsException(), "query has exception") && //
-                            checkCondition(sqlResponse.getDuration() > durationThreshold || sqlResponse.getTotalScanCount() > scancountThreshold, "query is too lightweight with duration: {} ({}), scan count: {} ({})", sqlResponse.getDuration(), durationThreshold, sqlResponse.getTotalScanCount(), scancountThreshold) && // 
-                            checkCondition(sqlResponse.getResults().size() < kylinConfig.getLargeQueryThreshold(), "query response is too large: {} ({})", sqlResponse.getResults().size(), kylinConfig.getLargeQueryThreshold())) {
+                    if (checkCondition(queryCacheEnabled, "query cache is disabled") //
+                            && checkCondition(!sqlResponse.getIsException(), "query has exception") //
+                            && checkCondition(sqlResponse.getDuration() > durationThreshold || sqlResponse.getTotalScanCount() > scanCountThreshold || sqlResponse.getTotalScanBytes() > scanBytesThreshold, //
+                                    "query is too lightweight with duration: {} (threshold {}), scan count: {} (threshold {}), scan bytes: {} (threshold {})", sqlResponse.getDuration(), durationThreshold, sqlResponse.getTotalScanCount(), scanCountThreshold, sqlResponse.getTotalScanBytes(), scanBytesThreshold)
+                            && checkCondition(sqlResponse.getResults().size() < kylinConfig.getLargeQueryThreshold(), "query response is too large: {} ({})", sqlResponse.getResults().size(), kylinConfig.getLargeQueryThreshold())) {
                         cacheManager.getCache(SUCCESS_QUERY_CACHE).put(new Element(sqlRequest, sqlResponse));
                     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/HBaseScannerBenchmark.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/HBaseScannerBenchmark.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/HBaseScannerBenchmark.java
index 3fdb92f..3eecba1 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/HBaseScannerBenchmark.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/HBaseScannerBenchmark.java
@@ -132,9 +132,6 @@ public class HBaseScannerBenchmark {
         }
         scan.close();
 
-        if (scan.getScannedRowCount() != count)
-            throw new IllegalStateException();
-
         t = System.currentTimeMillis() - t;
         logger.info(msg + ", " + count + " records, " + speed(t) + "K rec/sec");
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/SimpleHBaseStore.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/SimpleHBaseStore.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/SimpleHBaseStore.java
index f63d9c2..b12173d 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/SimpleHBaseStore.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/SimpleHBaseStore.java
@@ -205,10 +205,5 @@ public class SimpleHBaseStore implements IGTStore {
         public GTInfo getInfo() {
             return info;
         }
-
-        @Override
-        public long getScannedRowCount() {
-            return count;
-        }
     }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
index abc3437..82b67b6 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseEndpointRPC.java
@@ -23,7 +23,6 @@ import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.zip.DataFormatException;
 
@@ -146,8 +145,6 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC {
 
         logger.debug("Submitting rpc to {} shards starting from shard {}, scan range count {}", shardNum, cuboidBaseShard, rawScans.size());
 
-        final AtomicLong totalScannedCount = new AtomicLong(0);
-
         // KylinConfig: use env instance instead of CubeSegment, because KylinConfig will share among queries
         // for different cubes until redeployment of coprocessor jar.
         final KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv();
@@ -205,7 +202,6 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC {
                                         Stats stats = result.getStats();
                                         queryContext.addAndGetScannedRows(stats.getScannedRowCount());
                                         queryContext.addAndGetScannedBytes(stats.getScannedBytes());
-                                        totalScannedCount.addAndGet(stats.getScannedRowCount());
 
                                         // if any other region has responded with error, skip further processing
                                         if (regionErrorHolder.get() != null) {
@@ -249,7 +245,7 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC {
             });
         }
 
-        return new StorageResponseGTScatter(fullGTInfo, new DummyPartitionStreamer(epResultItr), scanRequest.getColumns(), totalScannedCount.get(), scanRequest.getStoragePushDownLimit());
+        return new StorageResponseGTScatter(fullGTInfo, new DummyPartitionStreamer(epResultItr), scanRequest.getColumns(), scanRequest.getStoragePushDownLimit());
     }
 
     private ByteString serializeGTScanReq(GTScanRequest scanRequest) {
@@ -317,14 +313,14 @@ public class CubeHBaseEndpointRPC extends CubeHBaseRPC {
         CubeVisitResponse.ErrorInfo errorInfo = response.getErrorInfo();
 
         switch (errorInfo.getType()) {
-            case UNKNOWN_TYPE:
-                return new RuntimeException("Coprocessor aborts: " + errorInfo.getMessage());
-            case TIMEOUT:
-                return new KylinTimeoutException(errorInfo.getMessage());
-            case RESOURCE_LIMIT_EXCEEDED:
-                return new ResourceLimitExceededException("Coprocessor resource limit exceeded: " + errorInfo.getMessage());
-            default:
-                throw new AssertionError("Unknown error type: " + errorInfo.getType());
+        case UNKNOWN_TYPE:
+            return new RuntimeException("Coprocessor aborts: " + errorInfo.getMessage());
+        case TIMEOUT:
+            return new KylinTimeoutException(errorInfo.getMessage());
+        case RESOURCE_LIMIT_EXCEEDED:
+            return new ResourceLimitExceededException("Coprocessor resource limit exceeded: " + errorInfo.getMessage());
+        default:
+            throw new AssertionError("Unknown error type: " + errorInfo.getType());
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseScanRPC.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseScanRPC.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseScanRPC.java
index 1698180..33f8d90 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseScanRPC.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/CubeHBaseScanRPC.java
@@ -93,31 +93,7 @@ public class CubeHBaseScanRPC extends CubeHBaseRPC {
 
     @Override
     public IGTScanner getGTScanner(final GTScanRequest scanRequest) throws IOException {
-        final IGTScanner scanner = getGTScannerInternal(scanRequest);
-
-        return new IGTScanner() {
-            @Override
-            public GTInfo getInfo() {
-                return scanner.getInfo();
-            }
-
-            @Override
-            public long getScannedRowCount() {
-                long sum = 0;
-                sum += scanner.getScannedRowCount();
-                return sum;
-            }
-
-            @Override
-            public void close() throws IOException {
-                scanner.close();
-            }
-
-            @Override
-            public Iterator<GTRecord> iterator() {
-                return scanner.iterator();
-            }
-        };
+        return getGTScannerInternal(scanRequest);
     }
 
     //for non-sharding cases it will only return one byte[] with not shard at beginning
@@ -229,11 +205,6 @@ public class CubeHBaseScanRPC extends CubeHBaseRPC {
             }
 
             @Override
-            public long getScannedRowCount() {
-                return decorateScanner.getScannedRowCount();
-            }
-
-            @Override
             public void close() throws IOException {
                 decorateScanner.close();
             }
@@ -244,4 +215,4 @@ public class CubeHBaseScanRPC extends CubeHBaseRPC {
             }
         };
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/HBaseReadonlyStore.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/HBaseReadonlyStore.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/HBaseReadonlyStore.java
index 4c02dff..631e8e8 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/HBaseReadonlyStore.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/HBaseReadonlyStore.java
@@ -152,11 +152,6 @@ public class HBaseReadonlyStore implements IGTStore {
             public GTInfo getInfo() {
                 return info;
             }
-
-            @Override
-            public long getScannedRowCount() {
-                return count;
-            }
         };
     }
 }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
index 61cf067..cde127e 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/CubeVisitService.java
@@ -293,7 +293,7 @@ public class CubeVisitService extends CubeVisitProtos.CubeVisitService implement
             ResourceTrackingCellListIterator cellListIterator = new ResourceTrackingCellListIterator(
                     allCellLists,
                     scanReq.getStorageScanRowNumThreshold(), // for old client (scan threshold)
-                    request.hasMaxScanBytes() ? Long.MAX_VALUE : request.getMaxScanBytes(), // for new client
+                    !request.hasMaxScanBytes() ? Long.MAX_VALUE : request.getMaxScanBytes(), // for new client
                     scanReq.getTimeout());
 
             IGTStore store = new HBaseReadonlyStore(cellListIterator, scanReq, hbaseRawScans.get(0).hbaseColumns, hbaseColumnsToGT, request.getRowkeyPreambleSize(), behavior.delayToggledOn());

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
----------------------------------------------------------------------
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
index e01ff52..aa83595 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v2/coprocessor/endpoint/protobuf/CubeVisit.proto
@@ -37,7 +37,7 @@ message CubeVisitRequest {
     required string kylinProperties = 5; // kylin properties
     optional string queryId = 6;
     optional bool spillEnabled = 7 [default = true];
-    optional int64 maxScanBytes = 8; // 0 means no limit
+    optional int64 maxScanBytes = 8; // must be positive
     message IntList {
         repeated int32 ints = 1;
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/4bdb62cb/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/SandboxMetastoreCLI.java
----------------------------------------------------------------------
diff --git a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/SandboxMetastoreCLI.java b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/SandboxMetastoreCLI.java
index 691886b..62b154e 100644
--- a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/SandboxMetastoreCLI.java
+++ b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/steps/SandboxMetastoreCLI.java
@@ -36,7 +36,6 @@ import org.slf4j.LoggerFactory;
  * It is desinged to run in hadoop CLI, both in sandbox or in real hadoop environment
  */
 public class SandboxMetastoreCLI {
-
     private static final Logger logger = LoggerFactory.getLogger(SandboxMetastoreCLI.class);
 
     public static void main(String[] args) throws Exception {