Repository: incubator-trafodion Updated Branches: refs/heads/master d8208546b -> 89433fbab
[TRAFODION-2801] select count(*) with cqd hbase_coprocessors 'off' and cqd traf_table_snapshot_scan 'latest' fail Changed to pass two more arrays references - familyArray and QualifierArray from Java to JNI to extract the family and the qualifier names correctly on the native side Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/c4fe7987 Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/c4fe7987 Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/c4fe7987 Branch: refs/heads/master Commit: c4fe798711a18b9e78a0dad80b85705f1f89ac66 Parents: d820854 Author: selvaganesang <[email protected]> Authored: Thu Nov 9 22:23:29 2017 +0000 Committer: selvaganesang <[email protected]> Committed: Thu Nov 9 22:23:29 2017 +0000 ---------------------------------------------------------------------- core/sql/executor/HBaseClient_JNI.cpp | 176 +++++++++++++------ core/sql/executor/HBaseClient_JNI.h | 13 +- .../executor/org_trafodion_sql_HTableClient.h | 4 +- .../java/org/trafodion/sql/HTableClient.java | 24 ++- 4 files changed, 152 insertions(+), 65 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/c4fe7987/core/sql/executor/HBaseClient_JNI.cpp ---------------------------------------------------------------------- diff --git a/core/sql/executor/HBaseClient_JNI.cpp b/core/sql/executor/HBaseClient_JNI.cpp index 78c4289..c181b41 100644 --- a/core/sql/executor/HBaseClient_JNI.cpp +++ b/core/sql/executor/HBaseClient_JNI.cpp @@ -3239,6 +3239,7 @@ static const char* const htcErrorEnumStr[] = ,"Async Hbase Operation not yet complete." ,"Java exception in setWriteToWal()." ,"Java exception in setWriteBufferSize()." + ,"Java exception in prepareForNextCell()." }; ////////////////////////////////////////////////////////////////////////////// @@ -4312,7 +4313,8 @@ JNIEXPORT jint JNICALL Java_org_trafodion_sql_HTableClient_setResultInfo jintArray jKvQualLen, jintArray jKvQualOffset, jintArray jKvFamLen, jintArray jKvFamOffset, jlongArray jTimestamp, - jobjectArray jKvBuffer, jobjectArray jRowIDs, + jobjectArray jKvBuffer, + jobjectArray jKvFamArray, jobjectArray jkvQualArray, jobjectArray jRowIDs, jintArray jKvsPerRow, jint numCellsReturned, jint numRowsReturned) { HTableClient_JNI *htc = (HTableClient_JNI *)jniObject; @@ -4321,7 +4323,8 @@ JNIEXPORT jint JNICALL Java_org_trafodion_sql_HTableClient_setResultInfo htc->setJavaObject(jobj); htc->setResultInfo(jKvValLen, jKvValOffset, jKvQualLen, jKvQualOffset, jKvFamLen, jKvFamOffset, - jTimestamp, jKvBuffer, jRowIDs, jKvsPerRow, numCellsReturned, numRowsReturned); + jTimestamp, jKvBuffer, jKvFamArray, jkvQualArray, + jRowIDs, jKvsPerRow, numCellsReturned, numRowsReturned); return 0; } @@ -4348,7 +4351,8 @@ void HTableClient_JNI::setResultInfo( jintArray jKvValLen, jintArray jKvValOffse jintArray jKvQualLen, jintArray jKvQualOffset, jintArray jKvFamLen, jintArray jKvFamOffset, jlongArray jTimestamp, - jobjectArray jKvBuffer, jobjectArray jRowIDs, + jobjectArray jKvBuffer, + jobjectArray jKvFamArray, jobjectArray jKvQualArray, jobjectArray jRowIDs, jintArray jKvsPerRow, jint numCellsReturned, jint numRowsReturned) { if (numRowsReturned_ > 0) @@ -4393,6 +4397,16 @@ void HTableClient_JNI::setResultInfo( jintArray jKvValLen, jintArray jKvValOffse if (jenv_->ExceptionCheck()) exceptionFound = TRUE; } + if (! exceptionFound) { + jKvFamArray_ = (jobjectArray)jenv_->NewGlobalRef(jKvFamArray); + if (jenv_->ExceptionCheck()) + exceptionFound = TRUE; + } + if (! exceptionFound) { + jKvQualArray_ = (jobjectArray)jenv_->NewGlobalRef(jKvQualArray); + if (jenv_->ExceptionCheck()) + exceptionFound = TRUE; + } } if (! exceptionFound) { jRowIDs_ = (jobjectArray)jenv_->NewGlobalRef(jRowIDs); @@ -4449,6 +4463,14 @@ void HTableClient_JNI::cleanupResultInfo() jenv_->DeleteGlobalRef(jKvBuffer_); jKvBuffer_ = NULL; } + if (jKvFamArray_ != NULL) { + jenv_->DeleteGlobalRef(jKvFamArray_); + jKvFamArray_ = NULL; + } + if (jKvQualArray_ != NULL) { + jenv_->DeleteGlobalRef(jKvQualArray_); + jKvQualArray_ = NULL; + } if (jRowIDs_ != NULL) { jenv_->DeleteGlobalRef(jRowIDs_); jRowIDs_ = NULL; @@ -4458,6 +4480,16 @@ void HTableClient_JNI::cleanupResultInfo() jenv_->DeleteGlobalRef(jba_kvBuffer_); jba_kvBuffer_ = NULL; } + if (jba_kvFamArray_ != NULL) + { + jenv_->DeleteGlobalRef(jba_kvFamArray_); + jba_kvFamArray_ = NULL; + } + if (jba_kvQualArray_ != NULL) + { + jenv_->DeleteGlobalRef(jba_kvQualArray_); + jba_kvQualArray_ = NULL; + } if (p_rowID_ != NULL) { jenv_->ReleaseByteArrayElements(jba_rowID_, p_rowID_, JNI_ABORT); @@ -4474,6 +4506,7 @@ void HTableClient_JNI::cleanupResultInfo() return; } + HTC_RetCode HTableClient_JNI::nextRow() { HTC_RetCode retCode; @@ -4598,52 +4631,106 @@ void HTableClient_JNI::getResultInfo() prevRowCellNum_ = 0; } -HTC_RetCode HTableClient_JNI::getColName(int colNo, - char **outColName, - short &colNameLen, - Int64 ×tamp) +HTC_RetCode HTableClient_JNI::prepareForNextCell(int idx) { - jint kvsPerRow = p_kvsPerRow_[currentRowNum_]; - if (kvsPerRow == 0 || colNo >= kvsPerRow) + jobject kvBufferObj; + + if (jba_kvFamArray_ != NULL) { - *outColName == NULL; - timestamp = 0; - return HTC_OK; + jenv_->DeleteGlobalRef(jba_kvFamArray_); + jba_kvFamArray_ = NULL; } - int idx = prevRowCellNum_ + colNo; - ex_assert((idx < numCellsReturned_), "Buffer overflow"); - jint kvQualLen = p_kvQualLen_[idx]; - jint kvQualOffset = p_kvQualOffset_[idx]; - jint kvFamLen = p_kvFamLen_[idx]; - jint kvFamOffset = p_kvFamOffset_[idx]; + kvBufferObj = jenv_->GetObjectArrayElement(jKvFamArray_, idx); + if (jenv_->ExceptionCheck()) + { + getExceptionDetails(); + logError(CAT_SQL_HBASE, __FILE__, __LINE__); + logError(CAT_SQL_HBASE, "HTableClient_JNI::prepareForNextCell()", getLastError()); + return HTC_PREPARE_FOR_NEXTCELL_EXCEPTION; + } + jba_kvFamArray_ = (jbyteArray)jenv_->NewGlobalRef(kvBufferObj); + if (jenv_->ExceptionCheck()) + { + getExceptionDetails(); + logError(CAT_SQL_HBASE, __FILE__, __LINE__); + logError(CAT_SQL_HBASE, "HTableClient_JNI::prepareForNextCell()", getLastError()); + return HTC_PREPARE_FOR_NEXTCELL_EXCEPTION; + } + jenv_->DeleteLocalRef(kvBufferObj); + + if (jba_kvQualArray_ != NULL) + { + jenv_->DeleteGlobalRef(jba_kvQualArray_); + jba_kvQualArray_ = NULL; + } + kvBufferObj = jenv_->GetObjectArrayElement(jKvQualArray_, idx); + if (jenv_->ExceptionCheck()) + { + getExceptionDetails(); + logError(CAT_SQL_HBASE, __FILE__, __LINE__); + logError(CAT_SQL_HBASE, "HTableClient_JNI::prepareForNextCell()", getLastError()); + return HTC_PREPARE_FOR_NEXTCELL_EXCEPTION; + } + jba_kvQualArray_ = (jbyteArray)jenv_->NewGlobalRef(kvBufferObj); + if (jenv_->ExceptionCheck()) + { + getExceptionDetails(); + logError(CAT_SQL_HBASE, __FILE__, __LINE__); + logError(CAT_SQL_HBASE, "HTableClient_JNI::prepareForNextCell()", getLastError()); + return HTC_PREPARE_FOR_NEXTCELL_EXCEPTION; + } + jenv_->DeleteLocalRef(kvBufferObj); - // clean the kvBuffer of the previous column - // And get the kvBuffer for the current column if (jba_kvBuffer_ != NULL) { jenv_->DeleteGlobalRef(jba_kvBuffer_); jba_kvBuffer_ = NULL; } - jobject kvBufferObj; kvBufferObj = jenv_->GetObjectArrayElement(jKvBuffer_, idx); if (jenv_->ExceptionCheck()) { getExceptionDetails(); logError(CAT_SQL_HBASE, __FILE__, __LINE__); - logError(CAT_SQL_HBASE, "HTableClient_JNI::getColName()", getLastError()); - return HTC_GET_COLNAME_EXCEPTION; + logError(CAT_SQL_HBASE, "HTableClient_JNI::prepareForNextCell()", getLastError()); + return HTC_PREPARE_FOR_NEXTCELL_EXCEPTION; } - jba_kvBuffer_ = (jbyteArray)jenv_->NewGlobalRef(kvBufferObj); if (jenv_->ExceptionCheck()) { getExceptionDetails(); logError(CAT_SQL_HBASE, __FILE__, __LINE__); - logError(CAT_SQL_HBASE, "HTableClient_JNI::getColName()", getLastError()); - return HTC_GET_COLNAME_EXCEPTION; + logError(CAT_SQL_HBASE, "HTableClient_JNI::prepareForNextCell()", getLastError()); + return HTC_PREPARE_FOR_NEXTCELL_EXCEPTION; } jenv_->DeleteLocalRef(kvBufferObj); + return HTC_OK; +} + +HTC_RetCode HTableClient_JNI::getColName(int colNo, + char **outColName, + short &colNameLen, + Int64 ×tamp) +{ + HTC_RetCode retcode; + + jint kvsPerRow = p_kvsPerRow_[currentRowNum_]; + if (kvsPerRow == 0 || colNo >= kvsPerRow) + { + *outColName == NULL; + timestamp = 0; + return HTC_OK; + } + int idx = prevRowCellNum_ + colNo; + ex_assert((idx < numCellsReturned_), "Buffer overflow"); + jint kvQualLen = p_kvQualLen_[idx]; + jint kvQualOffset = p_kvQualOffset_[idx]; + jint kvFamLen = p_kvFamLen_[idx]; + jint kvFamOffset = p_kvFamOffset_[idx]; + + if ((retcode = prepareForNextCell(idx)) != HTC_OK) + return retcode; + colNameLen = kvQualLen + kvFamLen + 1; // 1 for ':' char * colName; if (colNameAllocLen_ == 0 && colNameLen <= INLINE_COLNAME_LEN) @@ -4659,11 +4746,11 @@ HTC_RetCode HTableClient_JNI::getColName(int colNo, } colName = colName_; } - jenv_->GetByteArrayRegion(jba_kvBuffer_, kvFamOffset, kvFamLen, + jenv_->GetByteArrayRegion(jba_kvFamArray_, kvFamOffset, kvFamLen, (jbyte *)colName); colName[kvFamLen] = ':'; char *temp = colName+ kvFamLen+1; - jenv_->GetByteArrayRegion(jba_kvBuffer_, kvQualOffset, kvQualLen, + jenv_->GetByteArrayRegion(jba_kvQualArray_, kvQualOffset, kvQualLen, (jbyte *)temp); timestamp = p_timestamp_[idx]; *outColName = colName; @@ -4873,33 +4960,8 @@ HTC_RetCode HTableClient_JNI::nextCell( jint kvFamLen = p_kvFamLen_[idx]; jint kvFamOffset = p_kvFamOffset_[idx]; - // clean the kvBuffer of the previous column - // And get the kvBuffer for the current column - - if (jba_kvBuffer_ != NULL) - { - jenv_->DeleteGlobalRef(jba_kvBuffer_); - jba_kvBuffer_ = NULL; - } - jobject kvBufferObj; - kvBufferObj = jenv_->GetObjectArrayElement(jKvBuffer_, idx); - if (jenv_->ExceptionCheck()) - { - getExceptionDetails(); - logError(CAT_SQL_HBASE, __FILE__, __LINE__); - logError(CAT_SQL_HBASE, "HTableClient_JNI::nextCell()", getLastError()); - return HTC_NEXTCELL_EXCEPTION; - } - - jba_kvBuffer_ = (jbyteArray)jenv_->NewGlobalRef(kvBufferObj); - if (jenv_->ExceptionCheck()) - { - getExceptionDetails(); - logError(CAT_SQL_HBASE, __FILE__, __LINE__); - logError(CAT_SQL_HBASE, "HTableClient_JNI::nextCell()", getLastError()); - return HTC_NEXTCELL_EXCEPTION; - } - jenv_->DeleteLocalRef(kvBufferObj); + if ((retcode = prepareForNextCell(idx)) != HTC_OK) + return retcode; int colNameLen = kvQualLen + kvFamLen + 1; // 1 for ':' char * colName; @@ -4916,13 +4978,13 @@ HTC_RetCode HTableClient_JNI::nextCell( } colName = colName_; } - jenv_->GetByteArrayRegion(jba_kvBuffer_, kvFamOffset, kvFamLen, + jenv_->GetByteArrayRegion(jba_kvFamArray_, kvFamOffset, kvFamLen, (jbyte *)colName); colName[kvFamLen] = ':'; colFamName.val = colName; colFamName.len = kvFamLen; char *temp = colName+ kvFamLen+1; - jenv_->GetByteArrayRegion(jba_kvBuffer_, kvQualOffset, kvQualLen, + jenv_->GetByteArrayRegion(jba_kvQualArray_, kvQualOffset, kvQualLen, (jbyte *)temp); colQualName.val = temp; colQualName.len = kvQualLen; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/c4fe7987/core/sql/executor/HBaseClient_JNI.h ---------------------------------------------------------------------- diff --git a/core/sql/executor/HBaseClient_JNI.h b/core/sql/executor/HBaseClient_JNI.h index 94e8922..d2f5d2b 100644 --- a/core/sql/executor/HBaseClient_JNI.h +++ b/core/sql/executor/HBaseClient_JNI.h @@ -115,6 +115,7 @@ typedef enum { ,HTC_ERROR_ASYNC_OPERATION_NOT_COMPLETE ,HTC_ERROR_WRITETOWAL_EXCEPTION ,HTC_ERROR_WRITEBUFFERSIZE_EXCEPTION + ,HTC_PREPARE_FOR_NEXTCELL_EXCEPTION ,HTC_LAST } HTC_RetCode; @@ -141,6 +142,8 @@ public: jKvFamOffset_ = NULL; jTimestamp_ = NULL; jKvBuffer_ = NULL; + jKvFamArray_ = NULL; + jKvQualArray_ = NULL; jRowIDs_ = NULL; jKvsPerRow_ = NULL; currentRowNum_ = -1; @@ -162,6 +165,8 @@ public: p_kvQualOffset_ = NULL; p_timestamp_ = NULL; jba_kvBuffer_ = NULL; + jba_kvFamArray_ = NULL; + jba_kvQualArray_ = NULL; jba_rowID_ = NULL; fetchMode_ = UNKNOWN; p_rowID_ = NULL; @@ -205,7 +210,8 @@ public: jintArray jKvQualLen, jintArray jKvQualOffset, jintArray jKvFamLen, jintArray jKvFamOffset, jlongArray jTimestamp, - jobjectArray jKvBuffer, jobjectArray jRowIDs, + jobjectArray jKvBuffer, + jobjectArray jKvFamArray, jobjectArray jKvQualArray, jobjectArray jRowIDs, jintArray jKvsPerRow, jint numCellsReturned, jint numRowsReturned); void getResultInfo(); void cleanupResultInfo(); @@ -232,6 +238,7 @@ public: HbaseStr &colVal, Int64 ×tamp); HTC_RetCode completeAsyncOperation(int timeout, NABoolean *resultArray, short resultArrayLen); + HTC_RetCode prepareForNextCell(int idx); // HTC_RetCode codeProcAggrGetResult(); @@ -299,6 +306,8 @@ private: jintArray jKvFamOffset_; jlongArray jTimestamp_; jobjectArray jKvBuffer_; + jobjectArray jKvFamArray_; + jobjectArray jKvQualArray_; jobjectArray jRowIDs_; jintArray jKvsPerRow_; jint *p_kvValLen_; @@ -309,6 +318,8 @@ private: jint *p_kvFamOffset_; jlong *p_timestamp_; jbyteArray jba_kvBuffer_; + jbyteArray jba_kvFamArray_; + jbyteArray jba_kvQualArray_; jbyteArray jba_rowID_; jbyte *p_rowID_; jint *p_kvsPerRow_; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/c4fe7987/core/sql/executor/org_trafodion_sql_HTableClient.h ---------------------------------------------------------------------- diff --git a/core/sql/executor/org_trafodion_sql_HTableClient.h b/core/sql/executor/org_trafodion_sql_HTableClient.h index e3c8837..b8cff61 100644 --- a/core/sql/executor/org_trafodion_sql_HTableClient.h +++ b/core/sql/executor/org_trafodion_sql_HTableClient.h @@ -16,10 +16,10 @@ extern "C" { /* * Class: org_trafodion_sql_HTableClient * Method: setResultInfo - * Signature: (J[I[I[I[I[I[I[J[[B[[B[III)I + * Signature: (J[I[I[I[I[I[I[J[[B[[B[[B[[B[III)I */ JNIEXPORT jint JNICALL Java_org_trafodion_sql_HTableClient_setResultInfo - (JNIEnv *, jobject, jlong, jintArray, jintArray, jintArray, jintArray, jintArray, jintArray, jlongArray, jobjectArray, jobjectArray, jintArray, jint, jint); + (JNIEnv *, jobject, jlong, jintArray, jintArray, jintArray, jintArray, jintArray, jintArray, jlongArray, jobjectArray, jobjectArray, jobjectArray, jobjectArray, jintArray, jint, jint); /* * Class: org_trafodion_sql_HTableClient http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/c4fe7987/core/sql/src/main/java/org/trafodion/sql/HTableClient.java ---------------------------------------------------------------------- diff --git a/core/sql/src/main/java/org/trafodion/sql/HTableClient.java b/core/sql/src/main/java/org/trafodion/sql/HTableClient.java index 12d134c..7dae2b8 100644 --- a/core/sql/src/main/java/org/trafodion/sql/HTableClient.java +++ b/core/sql/src/main/java/org/trafodion/sql/HTableClient.java @@ -129,6 +129,8 @@ public class HTableClient { byte[][] kvBuffer = null; byte[][] rowIDs = null; int[] kvsPerRow = null; + byte[][] kvFamArray = null; + byte[][] kvQualArray = null; static ExecutorService executorService = null; Future future = null; boolean preFetch = false; @@ -1242,6 +1244,8 @@ public class HTableClient { kvFamOffset = new int[numTotalCells]; kvTimestamp = new long[numTotalCells]; kvBuffer = new byte[numTotalCells][]; + kvFamArray = new byte[numTotalCells][]; + kvQualArray = new byte[numTotalCells][]; } if (rowIDs == null || (rowIDs != null && @@ -1271,6 +1275,8 @@ public class HTableClient { kvFamOffset[cellNum] = kv.getFamilyOffset(); kvTimestamp[cellNum] = kv.getTimestamp(); kvBuffer[cellNum] = kv.getValueArray(); + kvFamArray[cellNum] = kv.getFamilyArray(); + kvQualArray[cellNum] = kv.getQualifierArray(); colFound = true; } } @@ -1282,11 +1288,11 @@ public class HTableClient { if (cellsReturned == 0) setResultInfo(jniObject, null, null, null, null, null, null, - null, null, rowIDs, kvsPerRow, cellsReturned, rowsReturned); + null, null, null, null, rowIDs, kvsPerRow, cellsReturned, rowsReturned); else setResultInfo(jniObject, kvValLen, kvValOffset, kvQualLen, kvQualOffset, kvFamLen, kvFamOffset, - kvTimestamp, kvBuffer, rowIDs, kvsPerRow, cellsReturned, rowsReturned); + kvTimestamp, kvBuffer, kvFamArray, kvQualArray, rowIDs, kvsPerRow, cellsReturned, rowsReturned); return rowsReturned; } @@ -1294,6 +1300,7 @@ public class HTableClient { throws IOException { int rowsReturned = 1; int numTotalCells; + if (numColsInScan == 0) numTotalCells = result.size(); else @@ -1316,6 +1323,8 @@ public class HTableClient { kvFamOffset = new int[numTotalCells]; kvTimestamp = new long[numTotalCells]; kvBuffer = new byte[numTotalCells][]; + kvFamArray = new byte[numTotalCells][]; + kvQualArray = new byte[numTotalCells][]; } if (rowIDs == null) { @@ -1342,15 +1351,17 @@ public class HTableClient { kvFamOffset[colNum] = kv.getFamilyOffset(); kvTimestamp[colNum] = kv.getTimestamp(); kvBuffer[colNum] = kv.getValueArray(); + kvFamArray[colNum] = kv.getFamilyArray(); + kvQualArray[colNum] = kv.getQualifierArray(); } if (numColsReturned == 0) setResultInfo(jniObject, null, null, null, null, null, null, - null, null, rowIDs, kvsPerRow, numColsReturned, rowsReturned); + null, null, null, null, rowIDs, kvsPerRow, numColsReturned, rowsReturned); else setResultInfo(jniObject, kvValLen, kvValOffset, kvQualLen, kvQualOffset, kvFamLen, kvFamOffset, - kvTimestamp, kvBuffer, rowIDs, kvsPerRow, numColsReturned, rowsReturned); + kvTimestamp, kvBuffer, kvFamArray, kvQualArray, rowIDs, kvsPerRow, numColsReturned, rowsReturned); return rowsReturned; } @@ -1876,7 +1887,10 @@ public class HTableClient { int[] kvQualLen, int[] kvQualOffset, int[] kvFamLen, int[] kvFamOffset, long[] timestamp, - byte[][] kvBuffer, byte[][] rowIDs, + byte[][] kvBuffer, + byte[][] kvFamArray, + byte[][] kvQualArray, + byte[][] rowIDs, int[] kvsPerRow, int numCellsReturned, int rowsReturned);
