Repository: kylin
Updated Branches:
  refs/heads/1.4-rc 0456db93d -> 871154447


eBay-JIRA-524: automatical expansion when buffer overflow


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

Branch: refs/heads/1.4-rc
Commit: d02a5f5d97078094dbbe7a0a809a7bcc81a3676c
Parents: 0456db9
Author: kyotoYaho <nju_y...@apache.org>
Authored: Tue May 17 21:10:58 2016 +0800
Committer: Zhong <yangzh...@lm-shc-16501214.corp.ebay.com>
Committed: Fri May 27 10:15:18 2016 +0800

----------------------------------------------------------------------
 .../org/apache/kylin/dict/DictCodeSystem.java   |  7 +++++
 .../metadata/filter/ConstantTupleFilter.java    | 30 ++++++++++++++++----
 .../metadata/filter/TupleFilterSerializer.java  | 24 ++++++++++++++--
 3 files changed, 54 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/d02a5f5d/core-dictionary/src/main/java/org/apache/kylin/dict/DictCodeSystem.java
----------------------------------------------------------------------
diff --git 
a/core-dictionary/src/main/java/org/apache/kylin/dict/DictCodeSystem.java 
b/core-dictionary/src/main/java/org/apache/kylin/dict/DictCodeSystem.java
index 83ad20c..5a2044e 100644
--- a/core-dictionary/src/main/java/org/apache/kylin/dict/DictCodeSystem.java
+++ b/core-dictionary/src/main/java/org/apache/kylin/dict/DictCodeSystem.java
@@ -22,6 +22,8 @@ import java.nio.ByteBuffer;
 
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.metadata.filter.IFilterCodeSystem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A simple code system where all values are dictionary IDs (fixed length 
bytes) encoded as ISO-8859-1 strings.
@@ -30,6 +32,8 @@ import org.apache.kylin.metadata.filter.IFilterCodeSystem;
  */
 public class DictCodeSystem implements IFilterCodeSystem<String> {
 
+    private static final Logger logger = 
LoggerFactory.getLogger(DictCodeSystem.class);
+
     public static final DictCodeSystem INSTANCE = new DictCodeSystem();
 
     private DictCodeSystem() {
@@ -57,6 +61,9 @@ public class DictCodeSystem implements 
IFilterCodeSystem<String> {
     //TODO: should use ISO-8859-1 rather than UTF8
     @Override
     public void serialize(String value, ByteBuffer buffer) {
+        if(value.length() > 1000 ){
+            logger.info("value length exceeds 1000: {}", 
value.substring(0,1000));
+        }
         BytesUtil.writeUTFString(value, buffer);
     }
 

http://git-wip-us.apache.org/repos/asf/kylin/blob/d02a5f5d/core-metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
 
b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
index 074f163..a92c699 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/ConstantTupleFilter.java
@@ -18,6 +18,7 @@
 
 package org.apache.kylin.metadata.filter;
 
+import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.util.Collection;
 import java.util.Collections;
@@ -25,6 +26,8 @@ import java.util.HashSet;
 
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * 
@@ -33,6 +36,8 @@ import org.apache.kylin.metadata.tuple.IEvaluatableTuple;
  */
 public class ConstantTupleFilter extends TupleFilter {
 
+    private static final Logger logger = 
LoggerFactory.getLogger(ConstantTupleFilter.class);
+
     public static final ConstantTupleFilter FALSE = new ConstantTupleFilter();
     public static final ConstantTupleFilter TRUE = new 
ConstantTupleFilter((Object) null); // not sure of underlying code system, null 
is the only value that applies to all types
 
@@ -89,11 +94,26 @@ public class ConstantTupleFilter extends TupleFilter {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public byte[] serialize(IFilterCodeSystem cs) {
-        ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
-        int size = this.constantValues.size();
-        BytesUtil.writeVInt(size, buffer);
-        for (Object val : this.constantValues) {
-            cs.serialize(val, buffer);
+        ByteBuffer buffer;
+        int bufferSize = BUFFER_SIZE;
+        while(true){
+            try{
+                buffer = ByteBuffer.allocate(bufferSize);
+                int size = this.constantValues.size();
+                BytesUtil.writeVInt(size, buffer);
+                logger.info("constantValues.size: {}", size);
+                for (Object val : this.constantValues) {
+                    if(! (val instanceof String)){
+                        logger.error("Problematic constant value:" + val);
+                    }
+                    cs.serialize(val, buffer);
+                    logger.info("Buffer Position: {}", buffer.position());
+                }
+                break;
+            }catch (BufferOverflowException e) {
+                logger.info("Buffer size {} cannot hold the filter, resizing 
to 4 times", bufferSize);
+                bufferSize *= 4;
+            }
         }
         byte[] result = new byte[buffer.position()];
         System.arraycopy(buffer.array(), 0, result, 0, buffer.position());

http://git-wip-us.apache.org/repos/asf/kylin/blob/d02a5f5d/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
 
b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
index a394a51..628a97c 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/TupleFilterSerializer.java
@@ -18,12 +18,15 @@
 
 package org.apache.kylin.metadata.filter;
 
+import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Stack;
 
 import org.apache.kylin.common.util.BytesUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * 
http://eli.thegreenplace.net/2011/09/29/an-interesting-tree-serialization-algorithm-from-dwarf
@@ -33,11 +36,14 @@ import org.apache.kylin.common.util.BytesUtil;
  */
 public class TupleFilterSerializer {
 
+    private static final Logger logger = 
LoggerFactory.getLogger(TupleFilterSerializer.class);
+
     public interface Decorator {
         TupleFilter onSerialize(TupleFilter filter);
     }
 
     private static final int BUFFER_SIZE = 65536;
+    private static final int BUFFER_SIZE_MAX = 268435456;
     private static final Map<Integer, TupleFilter.FilterOperatorEnum> 
ID_OP_MAP = new HashMap<Integer, TupleFilter.FilterOperatorEnum>();
 
     static {
@@ -51,8 +57,22 @@ public class TupleFilterSerializer {
     }
 
     public static byte[] serialize(TupleFilter rootFilter, Decorator 
decorator, IFilterCodeSystem<?> cs) {
-        ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
-        internalSerialize(rootFilter, decorator, buffer, cs);
+        ByteBuffer buffer;
+        int bufferSize = BUFFER_SIZE;
+        while (true) {
+            try {
+                buffer = ByteBuffer.allocate(bufferSize);
+                internalSerialize(rootFilter, decorator, buffer, cs);
+                break;
+            } catch (BufferOverflowException e) {
+                logger.info("Buffer size {} cannot hold the filter, resizing 
to 4 times", bufferSize);
+                bufferSize *= 4;
+                if(bufferSize > BUFFER_SIZE_MAX){
+                    logger.error("Buffer size {} exceeds the limitation {}", 
bufferSize, BUFFER_SIZE_MAX);
+                    throw e;
+                }
+            }
+        }
         byte[] result = new byte[buffer.position()];
         System.arraycopy(buffer.array(), 0, result, 0, buffer.position());
         return result;

Reply via email to