Repository: carbondata
Updated Branches:
  refs/heads/master b8d602598 -> 0fa0a96c4


[CARBONDATA-3108][CARBONDATA-3044] Fix the error of jvm will crash when 
CarbonRow use wrong index number in CSDK

1. fix the error of jvm will crash when CarbonRow use wrong index number in CSDK
   including getString, getVarchar, getArray, getDecimal
2. delete/release the data after running
3. init the variable to NULL

This closes #2929


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

Branch: refs/heads/master
Commit: 0fa0a96c4d55e4bba9bdf118fa7c3e37cd4713a7
Parents: b8d6025
Author: xubo245 <xub...@huawei.com>
Authored: Mon Nov 19 22:48:31 2018 +0800
Committer: kunal642 <kunalkapoor...@gmail.com>
Committed: Wed Nov 21 23:04:07 2018 +0530

----------------------------------------------------------------------
 store/CSDK/src/CarbonReader.cpp                 |   7 +-
 store/CSDK/src/CarbonReader.h                   |   5 +
 store/CSDK/src/CarbonRow.cpp                    |  60 +++++++--
 store/CSDK/src/CarbonRow.h                      |   6 +
 store/CSDK/src/CarbonWriter.cpp                 |   3 +
 store/CSDK/test/main.cpp                        | 124 +++++++++++++++----
 .../org/apache/carbondata/sdk/file/RowUtil.java |   7 +-
 7 files changed, 177 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/carbondata/blob/0fa0a96c/store/CSDK/src/CarbonReader.cpp
----------------------------------------------------------------------
diff --git a/store/CSDK/src/CarbonReader.cpp b/store/CSDK/src/CarbonReader.cpp
index 8375b73..8ee65d0 100644
--- a/store/CSDK/src/CarbonReader.cpp
+++ b/store/CSDK/src/CarbonReader.cpp
@@ -31,7 +31,7 @@ void CarbonReader::builder(JNIEnv *env, char *path, char 
*tableName) {
         throw std::runtime_error("tableName parameter can't be NULL.");
     }
     jniEnv = env;
-    jclass carbonReaderClass = 
env->FindClass("org/apache/carbondata/sdk/file/CarbonReader");
+    carbonReaderClass = 
env->FindClass("org/apache/carbondata/sdk/file/CarbonReader");
     if (carbonReaderClass == NULL) {
         throw std::runtime_error("Can't find the class in java: 
org/apache/carbondata/sdk/file/CarbonReader");
     }
@@ -56,7 +56,7 @@ void CarbonReader::builder(JNIEnv *env, char *path) {
         throw std::runtime_error("path parameter can't be NULL.");
     }
     jniEnv = env;
-    jclass carbonReaderClass = 
env->FindClass("org/apache/carbondata/sdk/file/CarbonReader");
+    carbonReaderClass = 
env->FindClass("org/apache/carbondata/sdk/file/CarbonReader");
     if (carbonReaderClass == NULL) {
         throw std::runtime_error("Can't find the class in java: 
org/apache/carbondata/sdk/file/CarbonReader");
     }
@@ -230,4 +230,7 @@ void CarbonReader::close() {
     if (jniEnv->ExceptionCheck()) {
         throw jniEnv->ExceptionOccurred();
     }
+    jniEnv->DeleteLocalRef(carbonReaderBuilderObject);
+    jniEnv->DeleteLocalRef(carbonReaderObject);
+    jniEnv->DeleteLocalRef(carbonReaderClass);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/carbondata/blob/0fa0a96c/store/CSDK/src/CarbonReader.h
----------------------------------------------------------------------
diff --git a/store/CSDK/src/CarbonReader.h b/store/CSDK/src/CarbonReader.h
index 246e24b..9a1daeb 100644
--- a/store/CSDK/src/CarbonReader.h
+++ b/store/CSDK/src/CarbonReader.h
@@ -46,6 +46,11 @@ private:
     jobject carbonReaderObject = NULL;
 
     /**
+    * carbonReader class for reading data
+    */
+    jclass carbonReaderClass = NULL;
+
+    /**
      * Return true if carbonReaderBuilder Object isn't NULL
      * Throw exception if carbonReaderBuilder Object is NULL
      *

http://git-wip-us.apache.org/repos/asf/carbondata/blob/0fa0a96c/store/CSDK/src/CarbonRow.cpp
----------------------------------------------------------------------
diff --git a/store/CSDK/src/CarbonRow.cpp b/store/CSDK/src/CarbonRow.cpp
index f7066ec..45cf8f6 100644
--- a/store/CSDK/src/CarbonRow.cpp
+++ b/store/CSDK/src/CarbonRow.cpp
@@ -87,6 +87,9 @@ CarbonRow::CarbonRow(JNIEnv *env) {
     if (getArrayId == NULL) {
         throw std::runtime_error("Can't find the method in java: getArray");
     }
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
 }
 
 void CarbonRow::setCarbonRow(jobject data) {
@@ -114,7 +117,11 @@ short CarbonRow::getShort(int ordinal) {
     jvalue args[2];
     args[0].l = carbonRow;
     args[1].i = ordinal;
-    return jniEnv->CallStaticShortMethodA(rowUtilClass, getShortId, args);
+    short result = jniEnv->CallStaticShortMethodA(rowUtilClass, getShortId, 
args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
+    return result;
 }
 
 int CarbonRow::getInt(int ordinal) {
@@ -123,7 +130,11 @@ int CarbonRow::getInt(int ordinal) {
     jvalue args[2];
     args[0].l = carbonRow;
     args[1].i = ordinal;
-    return jniEnv->CallStaticIntMethodA(rowUtilClass, getIntId, args);
+    int result = jniEnv->CallStaticIntMethodA(rowUtilClass, getIntId, args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
+    return result;
 }
 
 long CarbonRow::getLong(int ordinal) {
@@ -132,7 +143,11 @@ long CarbonRow::getLong(int ordinal) {
     jvalue args[2];
     args[0].l = carbonRow;
     args[1].i = ordinal;
-    return jniEnv->CallStaticLongMethodA(rowUtilClass, getLongId, args);
+    long result = jniEnv->CallStaticLongMethodA(rowUtilClass, getLongId, args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
+    return result;
 }
 
 double CarbonRow::getDouble(int ordinal) {
@@ -141,17 +156,24 @@ double CarbonRow::getDouble(int ordinal) {
     jvalue args[2];
     args[0].l = carbonRow;
     args[1].i = ordinal;
-    return jniEnv->CallStaticDoubleMethodA(rowUtilClass, getDoubleId, args);
+    double result = jniEnv->CallStaticDoubleMethodA(rowUtilClass, getDoubleId, 
args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
+    return result;
 }
 
-
 float CarbonRow::getFloat(int ordinal) {
     checkCarbonRow();
     checkOrdinal(ordinal);
     jvalue args[2];
     args[0].l = carbonRow;
     args[1].i = ordinal;
-    return jniEnv->CallStaticFloatMethodA(rowUtilClass, getFloatId, args);
+    float result = jniEnv->CallStaticFloatMethodA(rowUtilClass, getFloatId, 
args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
+    return result;
 }
 
 jboolean CarbonRow::getBoolean(int ordinal) {
@@ -160,7 +182,11 @@ jboolean CarbonRow::getBoolean(int ordinal) {
     jvalue args[2];
     args[0].l = carbonRow;
     args[1].i = ordinal;
-    return jniEnv->CallStaticBooleanMethodA(rowUtilClass, getBooleanId, args);
+    bool result = jniEnv->CallStaticBooleanMethodA(rowUtilClass, getBooleanId, 
args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
+    return result;
 }
 
 char *CarbonRow::getString(int ordinal) {
@@ -170,6 +196,9 @@ char *CarbonRow::getString(int ordinal) {
     args[0].l = carbonRow;
     args[1].i = ordinal;
     jobject data = jniEnv->CallStaticObjectMethodA(rowUtilClass, getStringId, 
args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
     char *str = (char *) jniEnv->GetStringUTFChars((jstring) data, JNI_FALSE);
     jniEnv->DeleteLocalRef(data);
     return str;
@@ -182,6 +211,9 @@ char *CarbonRow::getDecimal(int ordinal) {
     args[0].l = carbonRow;
     args[1].i = ordinal;
     jobject data = jniEnv->CallStaticObjectMethodA(rowUtilClass, getDecimalId, 
args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
     char *str = (char *) jniEnv->GetStringUTFChars((jstring) data, JNI_FALSE);
     jniEnv->DeleteLocalRef(data);
     return str;
@@ -194,6 +226,9 @@ char *CarbonRow::getVarchar(int ordinal) {
     args[0].l = carbonRow;
     args[1].i = ordinal;
     jobject data = jniEnv->CallStaticObjectMethodA(rowUtilClass, getVarcharId, 
args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
     char *str = (char *) jniEnv->GetStringUTFChars((jstring) data, JNI_FALSE);
     jniEnv->DeleteLocalRef(data);
     return str;
@@ -205,5 +240,14 @@ jobjectArray CarbonRow::getArray(int ordinal) {
     jvalue args[2];
     args[0].l = carbonRow;
     args[1].i = ordinal;
-    return (jobjectArray) jniEnv->CallStaticObjectMethodA(rowUtilClass, 
getArrayId, args);
+    jobjectArray result = (jobjectArray) 
jniEnv->CallStaticObjectMethodA(rowUtilClass, getArrayId, args);
+    if (jniEnv->ExceptionCheck()) {
+        throw jniEnv->ExceptionOccurred();
+    }
+    return result;
+}
+
+void CarbonRow::close() {
+    jniEnv->DeleteLocalRef(rowUtilClass);
+    jniEnv->DeleteLocalRef(carbonRow);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/carbondata/blob/0fa0a96c/store/CSDK/src/CarbonRow.h
----------------------------------------------------------------------
diff --git a/store/CSDK/src/CarbonRow.h b/store/CSDK/src/CarbonRow.h
index c57f826..e715299 100644
--- a/store/CSDK/src/CarbonRow.h
+++ b/store/CSDK/src/CarbonRow.h
@@ -154,4 +154,10 @@ public:
      * @return jobjectArray data type data
      */
     jobjectArray getArray(int ordinal);
+
+    /**
+     * delete data and release
+     * @return
+     */
+    void close();
 };

http://git-wip-us.apache.org/repos/asf/carbondata/blob/0fa0a96c/store/CSDK/src/CarbonWriter.cpp
----------------------------------------------------------------------
diff --git a/store/CSDK/src/CarbonWriter.cpp b/store/CSDK/src/CarbonWriter.cpp
index 6619e33..2a4bcc7 100644
--- a/store/CSDK/src/CarbonWriter.cpp
+++ b/store/CSDK/src/CarbonWriter.cpp
@@ -164,4 +164,7 @@ void CarbonWriter::close() {
     if (jniEnv->ExceptionCheck()) {
         throw jniEnv->ExceptionOccurred();
     }
+    jniEnv->DeleteLocalRef(carbonWriterBuilderObject);
+    jniEnv->DeleteLocalRef(carbonWriterObject);
+    jniEnv->DeleteLocalRef(carbonWriter);
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/carbondata/blob/0fa0a96c/store/CSDK/test/main.cpp
----------------------------------------------------------------------
diff --git a/store/CSDK/test/main.cpp b/store/CSDK/test/main.cpp
index 44a7c69..5ab3976 100644
--- a/store/CSDK/test/main.cpp
+++ b/store/CSDK/test/main.cpp
@@ -72,10 +72,16 @@ JNIEnv *initJVM() {
  * @param arr array
  */
 void printArray(JNIEnv *env, jobjectArray arr) {
+    if (env->ExceptionCheck()) {
+        throw env->ExceptionOccurred();
+    }
     jsize length = env->GetArrayLength(arr);
     int j = 0;
     for (j = 0; j < length; j++) {
         jobject element = env->GetObjectArrayElement(arr, j);
+        if (env->ExceptionCheck()) {
+            throw env->ExceptionOccurred();
+        }
         char *str = (char *) env->GetStringUTFChars((jstring) element, 
JNI_FALSE);
         printf("%s\t", str);
     }
@@ -102,27 +108,66 @@ void printBoolean(jboolean bool1) {
  * @param env JNIEnv
  * @param reader CarbonReader object
  */
+void printResultWithException(JNIEnv *env, CarbonReader reader) {
+    try {
+        CarbonRow carbonRow(env);
+        while (reader.hasNext()) {
+            jobject row = reader.readNextRow();
+            carbonRow.setCarbonRow(row);
+            printf("%s\t", carbonRow.getString(1));
+            printf("%d\t", carbonRow.getInt(1));
+            printf("%ld\t", carbonRow.getLong(2));
+            printf("%s\t", carbonRow.getVarchar(1));
+            printArray(env, carbonRow.getArray(0));
+            printf("%d\t", carbonRow.getShort(5));
+            printf("%d\t", carbonRow.getInt(6));
+            printf("%ld\t", carbonRow.getLong(7));
+            printf("%lf\t", carbonRow.getDouble(8));
+            printBoolean(carbonRow.getBoolean(9));
+            printf("%s\t", carbonRow.getDecimal(9));
+            printf("%f\t", carbonRow.getFloat(11));
+            printf("\n");
+            env->DeleteLocalRef(row);
+        }
+        reader.close();
+        carbonRow.close();
+    } catch (jthrowable e) {
+        env->ExceptionDescribe();
+    }
+}
+
+/**
+ * print result of reading data
+ *
+ * @param env JNIEnv
+ * @param reader CarbonReader object
+ */
 void printResult(JNIEnv *env, CarbonReader reader) {
-    CarbonRow carbonRow(env);
-    while (reader.hasNext()) {
-        jobject row = reader.readNextRow();
-        carbonRow.setCarbonRow(row);
-        printf("%s\t", carbonRow.getString(0));
-        printf("%d\t", carbonRow.getInt(1));
-        printf("%ld\t", carbonRow.getLong(2));
-        printf("%s\t", carbonRow.getVarchar(3));
-        printArray(env, carbonRow.getArray(4));
-        printf("%d\t", carbonRow.getShort(5));
-        printf("%d\t", carbonRow.getInt(6));
-        printf("%ld\t", carbonRow.getLong(7));
-        printf("%lf\t", carbonRow.getDouble(8));
-        printBoolean(carbonRow.getBoolean(9));
-        printf("%s\t", carbonRow.getDecimal(10));
-        printf("%f\t", carbonRow.getFloat(11));
-        printf("\n");
-        env->DeleteLocalRef(row);
+    try {
+        CarbonRow carbonRow(env);
+        while (reader.hasNext()) {
+            jobject row = reader.readNextRow();
+            carbonRow.setCarbonRow(row);
+            printf("%s\t", carbonRow.getString(0));
+            printf("%d\t", carbonRow.getInt(1));
+            printf("%ld\t", carbonRow.getLong(2));
+            printf("%s\t", carbonRow.getVarchar(3));
+            printArray(env, carbonRow.getArray(4));
+            printf("%d\t", carbonRow.getShort(5));
+            printf("%d\t", carbonRow.getInt(6));
+            printf("%ld\t", carbonRow.getLong(7));
+            printf("%lf\t", carbonRow.getDouble(8));
+            printBoolean(carbonRow.getBoolean(9));
+            printf("%s\t", carbonRow.getDecimal(10));
+            printf("%f\t", carbonRow.getFloat(11));
+            printf("\n");
+            env->DeleteLocalRef(row);
+        }
+        carbonRow.close();
+        reader.close();
+    } catch (jthrowable e) {
+        env->ExceptionDescribe();
     }
-    reader.close();
 }
 
 /**
@@ -159,6 +204,30 @@ bool readSchema(JNIEnv *env, char *Path, bool 
validateSchema) {
 }
 
 /**
+ * test the exception when carbonRow with wrong index.
+ *
+ * @param env  jni env
+ * @return
+ */
+bool tryCarbonRowException(JNIEnv *env, char *path) {
+    printf("\nRead data from local without projection:\n");
+
+    CarbonReader carbonReaderClass;
+    try {
+        carbonReaderClass.builder(env, path);
+    } catch (runtime_error e) {
+        printf("\nget exception fro builder and throw\n");
+        throw e;
+    }
+    try {
+        carbonReaderClass.build();
+    } catch (jthrowable e) {
+        env->ExceptionDescribe();
+    }
+    printResultWithException(env, carbonReaderClass);
+}
+
+/**
  * test read data from local disk, without projection
  *
  * @param env  jni env
@@ -251,6 +320,7 @@ void testReadNextRow(JNIEnv *env, char *path, int printNum, 
char **argv, int arg
         printf("total line is: %d,\t build time is: %lf s,\tread time is %lf 
s, average speed is %lf records/s  ",
                i, buildTime, time / 1000000.0, i / (time / 1000000.0));
         carbonReaderClass.close();
+        carbonRow.close();
     } catch (jthrowable) {
         env->ExceptionDescribe();
     }
@@ -353,6 +423,7 @@ void testReadNextBatchRow(JNIEnv *env, char *path, int 
batchSize, int printNum,
     printf("total line is: %d,\t build time is: %lf s,\tread time is %lf s, 
average speed is %lf records/s  ",
            i, buildTime, time / 1000000.0, i / (time / 1000000.0));
     carbonReaderClass.close();
+    carbonRow.close();
 }
 
 /**
@@ -410,6 +481,7 @@ bool readFromLocalWithProjection(JNIEnv *env, char *path) {
     }
 
     reader.close();
+    carbonRow.close();
 }
 
 
@@ -566,6 +638,7 @@ bool testWriteData(JNIEnv *env, char *path, int argc, char 
*argv[]) {
             env->DeleteLocalRef(row);
         }
         carbonReader.close();
+        carbonRow.close();
     } catch (jthrowable ex) {
         env->ExceptionDescribe();
         env->ExceptionClear();
@@ -604,36 +677,39 @@ int main(int argc, char *argv[]) {
     // init jvm
     JNIEnv *env;
     env = initJVM();
-    char *S3WritePath = "s3a://sdk/WriterOutput/carbondata2";
-    char *S3ReadPath = "s3a://sdk/WriterOutput/carbondata";
+    char *S3WritePath = "s3a://csdk/WriterOutput/carbondata2";
+    char *S3ReadPath = "s3a://csdk/WriterOutput/carbondata";
 
     char *smallFilePath = "../../../../resources/carbondata";
     char *path = "../../../../../../../Downloads/carbon-data-big/dir2";
-    char *S3Path = "s3a://sdk/ges/i400bs128";
+    char *S3Path = "s3a://csdk/bigData/i400bs128";
 
     if (argc > 3) {
         // TODO: need support read schema from S3 in the future
         testWriteData(env, S3WritePath, 4, argv);
         readFromS3(env, S3ReadPath, argv);
+
         testReadNextRow(env, S3Path, 100000, argv, 4, false);
         testReadNextRow(env, S3Path, 100000, argv, 4, true);
         testReadNextBatchRow(env, S3Path, 100000, 100000, argv, 4, false);
         testReadNextBatchRow(env, S3Path, 100000, 100000, argv, 4, true);
     } else {
         tryCatchException(env);
+        tryCarbonRowException(env, smallFilePath);
         testCarbonProperties(env);
         testWriteData(env, "./data", 1, argv);
         testWriteData(env, "./data", 1, argv);
         readFromLocalWithoutProjection(env, smallFilePath);
         readFromLocalWithProjection(env, smallFilePath);
+        readSchema(env, path, false);
+        readSchema(env, path, true);
+
         int batch = 32000;
         int printNum = 32000;
         testReadNextRow(env, path, printNum, argv, 0, true);
         testReadNextRow(env, path, printNum, argv, 0, false);
         testReadNextBatchRow(env, path, batch, printNum, argv, 0, true);
         testReadNextBatchRow(env, path, batch, printNum, argv, 0, false);
-        readSchema(env, path, false);
-        readSchema(env, path, true);
     }
     (jvm)->DestroyJavaVM();
 

http://git-wip-us.apache.org/repos/asf/carbondata/blob/0fa0a96c/store/sdk/src/main/java/org/apache/carbondata/sdk/file/RowUtil.java
----------------------------------------------------------------------
diff --git 
a/store/sdk/src/main/java/org/apache/carbondata/sdk/file/RowUtil.java 
b/store/sdk/src/main/java/org/apache/carbondata/sdk/file/RowUtil.java
index b7a594f..fdf3cfc 100644
--- a/store/sdk/src/main/java/org/apache/carbondata/sdk/file/RowUtil.java
+++ b/store/sdk/src/main/java/org/apache/carbondata/sdk/file/RowUtil.java
@@ -70,7 +70,12 @@ public class RowUtil implements Serializable {
    * @return array data type data
    */
   public static Object[] getArray(Object[] data, int ordinal) {
-    return (Object[]) data[ordinal];
+    Object object = data[ordinal];
+    if (object instanceof Object[]) {
+      return (Object[]) data[ordinal];
+    } else {
+      throw new IllegalArgumentException("It's not an array in ordinal of 
data.");
+    }
   }
 
   /**

Reply via email to