[
https://issues.apache.org/jira/browse/TRAFODION-1444?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14692851#comment-14692851
]
ASF GitHub Bot commented on TRAFODION-1444:
-------------------------------------------
Github user selvaganesang commented on a diff in the pull request:
https://github.com/apache/incubator-trafodion/pull/52#discussion_r36824105
--- Diff: core/sql/executor/HBaseClient_JNI.cpp ---
@@ -2844,819 +2871,980 @@ HBC_RetCode
HBaseClient_JNI::getHbaseTableInfo(const char* tblName,
return HBC_OK; // Table exists.
}
-
-//
===========================================================================
-// ===== Class HTableClient
-//
===========================================================================
-
-JavaMethodInit* HTableClient_JNI::JavaMethods_ = NULL;
-jclass HTableClient_JNI::javaClass_ = 0;
-bool HTableClient_JNI::javaMethodsInitialized_ = false;
-pthread_mutex_t HTableClient_JNI::javaMethodsInitMutex_ =
PTHREAD_MUTEX_INITIALIZER;
-
-static const char* const htcErrorEnumStr[] =
-{
- "Preparing parameters for initConnection()."
- ,"Java exception in initConnection()."
- ,"Java exception in setTransactionID()."
- ,"Java exception in cleanup()."
- ,"Java exception in close()."
- ,"Preparing parameters for scanOpen()."
- ,"Java exception in scanOpen()."
- ,"Java exception in fetchRows()."
- ,"Java exception in scanClose()."
- ,"Preparing parameters for getRowOpen()."
- ,"Java exception in getRowOpen()."
- ,"Preparing parameters for getRowsOpen()."
- ,"Java exception in getRowsOpen()."
- ,"Java exception in getClose()."
- ,"Preparing parameters for deleteRow()."
- ,"Java exception in deleteRow()."
- ,"Preparing parameters for deleteRows()."
- ,"Java exception in deleteRows()."
- ,"Preparing parameters for checkAndDeleteRow()."
- ,"Java exception in checkAndDeleteRow()."
- ,"Row deleted in checkAndDeleteRow()."
- ,"Preparing parameters for insertRow()."
- ,"Java exception in insertRow()."
- ,"Preparing parameters for insertRows()."
- ,"Java exception in insertRows()."
- ,"Preparing parameters for checkAndInsertRow()."
- ,"Java exception in checkAndInsertRow()."
- ,"Dup RowId in checkAndInsertRow()."
- ,"Transactions not supported yet in checkAndInsertRow()"
- ,"Preparing parameters for checkAndUpdateRow()."
- ,"Java exception in checkAndUpdateRow()."
- ,"Dup RowId in checkAndUpdateRow()."
- ,"Transactions not supported yet in checkAndUpdateRow()"
- ,"Preparing parameters for create()."
- ,"Java exception in create()."
- ,"Preparing parameters for drop()."
- ,"Java exception in drop()."
- ,"Preparing parameters for exists()."
- ,"Java exception in exists()."
- ,"Preparing parameters for coProcAggr()."
- ,"Java exception in coProcAggr()."
- ,"Preparing parameters for grant()."
- ,"Java exception in grant()."
- ,"Preparing parameters for revoke()."
- ,"Java exception in revoke()."
- ,"Java exception in getendkeys()."
- ,"Java exception in getHTableName()."
- ,"Java exception in flush()."
- ,"Java exception in getColName()."
- ,"Java exception in getColValue()."
- ,"Java exception in getRowID()."
- ,"Java exception in nextCell()."
- ,"Preparing parameters for getRows()."
- ,"Java exception in getRows()."
- ,"Java exception in completeAsyncOperation()."
- ,"Async Hbase Operation not yet complete."
-};
-
//////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////
-char* HTableClient_JNI::getErrorText(HTC_RetCode errEnum)
+HBC_RetCode HBaseClient_JNI::insertRow(NAHeap *heap, const char *tableName,
+ ExHbaseAccessStats *hbs, bool useTRex, Int64 transID, HbaseStr rowID,
+ HbaseStr row, Int64 timestamp, bool checkAndPut, bool asyncOperation,
+ HTableClient_JNI **outHtc)
{
- if (errEnum < (HTC_RetCode)JOI_LAST)
- return JavaObjectInterface::getErrorText((JOI_RetCode)errEnum);
- else
- return (char*)htcErrorEnumStr[errEnum-HTC_FIRST-1];
-}
+
+ HTableClient_JNI *htc = NULL;
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-HTableClient_JNI::~HTableClient_JNI()
-{
- //QRLogger::log(CAT_JNI_TOP, LL_DEBUG, "HTableClient destructor
called.");
- cleanupResultInfo();
- if (tableName_ != NULL)
- {
- NADELETEBASIC(tableName_, heap_);
+ if (asyncOperation) {
+ HTableClient_JNI *htc = new (heap) HTableClient_JNI(heap,
(jobject)-1);
+ if (htc->init() != HTC_OK) {
+ NADELETE(htc, HTableClient_JNI, heap);
+ return HBC_ERROR_INSERTROW_EXCEPTION;
+ }
+ htc->setTableName(tableName);
+ htc->setHbaseStats(hbs);
}
- if (colNameAllocLen_ != 0)
- NADELETEBASIC(colName_, heap_);
- if (numCellsAllocated_ > 0)
- {
- NADELETEBASIC(p_kvValLen_, heap_);
- NADELETEBASIC(p_kvValOffset_, heap_);
- NADELETEBASIC(p_kvFamLen_, heap_);
- NADELETEBASIC(p_kvFamOffset_, heap_);
- NADELETEBASIC(p_kvQualLen_, heap_);
- NADELETEBASIC(p_kvQualOffset_, heap_);
- NADELETEBASIC(p_timestamp_, heap_);
- numCellsAllocated_ = 0;
+ if (jenv_->PushLocalFrame(jniHandleCapacity_) != 0) {
+ getExceptionDetails();
+ if (htc != NULL)
+ NADELETE(htc, HTableClient_JNI, heap);
+ return HBC_ERROR_INSERTROW_PARAM;
}
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-HTC_RetCode HTableClient_JNI::init()
-{
- static char className[]="org/trafodion/sql/HBaseAccess/HTableClient";
- HTC_RetCode rc;
-
- if (isInitialized())
- return HTC_OK;
+ jstring js_tblName = jenv_->NewStringUTF(tableName);
+ if (js_tblName == NULL) {
+
GetCliGlobals()->setJniErrorStr(getErrorText(HBC_ERROR_INSERTROW_PARAM));
+ if (htc != NULL)
+ NADELETE(htc, HTableClient_JNI, heap);
+ jenv_->PopLocalFrame(NULL);
+ return HBC_ERROR_INSERTROW_PARAM;
+ }
+ jbyteArray jba_rowID = jenv_->NewByteArray(rowID.len);
+ if (jba_rowID == NULL) {
+
GetCliGlobals()->setJniErrorStr(getErrorText(HBC_ERROR_INSERTROW_PARAM));
+ if (htc != NULL)
+ NADELETE(htc, HTableClient_JNI, heap);
+ jenv_->PopLocalFrame(NULL);
+ return HBC_ERROR_INSERTROW_PARAM;
+ }
+ jenv_->SetByteArrayRegion(jba_rowID, 0, rowID.len, (const
jbyte*)rowID.val);
- if (javaMethodsInitialized_)
- return (HTC_RetCode)JavaObjectInterface::init(className, javaClass_,
JavaMethods_, (Int32)JM_LAST, javaMethodsInitialized_);
- else
- {
- pthread_mutex_lock(&javaMethodsInitMutex_);
- if (javaMethodsInitialized_)
- {
- pthread_mutex_unlock(&javaMethodsInitMutex_);
- return (HTC_RetCode)JavaObjectInterface::init(className, javaClass_,
JavaMethods_, (Int32)JM_LAST, javaMethodsInitialized_);
- }
- JavaMethods_ = new JavaMethodInit[JM_LAST];
-
- JavaMethods_[JM_CTOR ].jm_name = "<init>";
- JavaMethods_[JM_CTOR ].jm_signature = "()V";
- JavaMethods_[JM_GET_ERROR ].jm_name = "getLastError";
- JavaMethods_[JM_GET_ERROR ].jm_signature = "()Ljava/lang/String;";
- JavaMethods_[JM_SCAN_OPEN ].jm_name = "startScan";
- JavaMethods_[JM_SCAN_OPEN ].jm_signature =
"(J[B[B[Ljava/lang/Object;JZI[Ljava/lang/Object;[Ljava/lang/Object;[Ljava/lang/Object;FZZILjava/lang/String;Ljava/lang/String;II)Z";
- JavaMethods_[JM_GET_OPEN ].jm_name = "startGet";
- JavaMethods_[JM_GET_OPEN ].jm_signature =
"(J[B[Ljava/lang/Object;J)I";
- JavaMethods_[JM_GETS_OPEN ].jm_name = "startGet";
- JavaMethods_[JM_GETS_OPEN ].jm_signature =
"(J[Ljava/lang/Object;[Ljava/lang/Object;J)I";
- JavaMethods_[JM_DELETE ].jm_name = "deleteRow";
- JavaMethods_[JM_DELETE ].jm_signature =
"(J[B[Ljava/lang/Object;J)Z";
- JavaMethods_[JM_CHECKANDDELETE ].jm_name =
"checkAndDeleteRow";
- JavaMethods_[JM_CHECKANDDELETE ].jm_signature = "(J[B[B[BJ)Z";
- JavaMethods_[JM_CHECKANDUPDATE ].jm_name =
"checkAndUpdateRow";
- JavaMethods_[JM_CHECKANDUPDATE ].jm_signature =
"(J[BLjava/lang/Object;[B[BJZ)Z";
- JavaMethods_[JM_COPROC_AGGR ].jm_name = "coProcAggr";
- JavaMethods_[JM_COPROC_AGGR ].jm_signature = "(JI[B[B[B[BZI)[B";
- JavaMethods_[JM_GET_NAME ].jm_name = "getTableName";
- JavaMethods_[JM_GET_NAME ].jm_signature = "()Ljava/lang/String;";
- JavaMethods_[JM_GET_HTNAME ].jm_name = "getTableName";
- JavaMethods_[JM_GET_HTNAME ].jm_signature = "()Ljava/lang/String;";
- JavaMethods_[JM_GETENDKEYS ].jm_name = "getEndKeys";
- JavaMethods_[JM_GETENDKEYS ].jm_signature =
"()Lorg/trafodion/sql/HBaseAccess/ByteArrayList;";
- JavaMethods_[JM_FLUSHT ].jm_name = "flush";
- JavaMethods_[JM_FLUSHT ].jm_signature = "()Z";
- JavaMethods_[JM_SET_WB_SIZE ].jm_name = "setWriteBufferSize";
- JavaMethods_[JM_SET_WB_SIZE ].jm_signature = "(J)Z";
- JavaMethods_[JM_SET_WRITE_TO_WAL ].jm_name = "setWriteToWAL";
- JavaMethods_[JM_SET_WRITE_TO_WAL ].jm_signature = "(Z)Z";
- JavaMethods_[JM_DIRECT_INSERT ].jm_name = "insertRow";
- JavaMethods_[JM_DIRECT_INSERT ].jm_signature =
"(J[BLjava/lang/Object;JZ)Z";
- JavaMethods_[JM_DIRECT_CHECKANDINSERT ].jm_name =
"checkAndInsertRow";
- JavaMethods_[JM_DIRECT_CHECKANDINSERT ].jm_signature =
"(J[BLjava/lang/Object;JZ)Z";
- JavaMethods_[JM_DIRECT_INSERT_ROWS ].jm_name = "putRows";
- JavaMethods_[JM_DIRECT_INSERT_ROWS ].jm_signature =
"(JSLjava/lang/Object;Ljava/lang/Object;JZZ)Z";
- JavaMethods_[JM_DIRECT_DELETE_ROWS ].jm_name = "deleteRows";
- JavaMethods_[JM_DIRECT_DELETE_ROWS ].jm_signature =
"(JSLjava/lang/Object;J)Z";
- JavaMethods_[JM_FETCH_ROWS ].jm_name = "fetchRows";
- JavaMethods_[JM_FETCH_ROWS ].jm_signature = "()I";
- JavaMethods_[JM_DIRECT_GET_ROWS ].jm_name = "getRows";
- JavaMethods_[JM_DIRECT_GET_ROWS ].jm_signature =
"(JSLjava/lang/Object;[Ljava/lang/Object;)I";
- JavaMethods_[JM_COMPLETE_PUT ].jm_name = "completeAsyncOperation";
- JavaMethods_[JM_COMPLETE_PUT ].jm_signature = "(I[Z)Z";
-
- rc = (HTC_RetCode)JavaObjectInterface::init(className, javaClass_,
JavaMethods_, (Int32)JM_LAST, javaMethodsInitialized_);
- javaMethodsInitialized_ = TRUE;
- pthread_mutex_unlock(&javaMethodsInitMutex_);
+ jobject jRow = jenv_->NewDirectByteBuffer(row.val, row.len);
+ if (jRow == NULL) {
+
GetCliGlobals()->setJniErrorStr(getErrorText(HBC_ERROR_INSERTROW_PARAM));
+ if (htc != NULL)
+ NADELETE(htc, HTableClient_JNI, heap);
+ jenv_->PopLocalFrame(NULL);
+ return HBC_ERROR_INSERTROW_PARAM;
}
- return rc;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-NAString HTableClient_JNI::getLastJavaError()
-{
- return
JavaObjectInterface::getLastJavaError(JavaMethods_[JM_GET_ERROR].methodID);
+ jlong j_htc = (long)htc;
+ jboolean j_useTRex = useTRex;
+ jlong j_tid = transID;
+ jlong j_ts = timestamp;
+ jboolean j_checkAndPut = checkAndPut;
+ jboolean j_asyncOperation = asyncOperation;
+
+ if (hbs)
+ hbs->getTimer().start();
+ tsRecentJMFromJNI = JavaMethods_[JM_HBC_DIRECT_INSERT_ROW].jm_full_name;
+ jboolean jresult = jenv_->CallBooleanMethod(javaObj_,
JavaMethods_[JM_HBC_DIRECT_INSERT_ROW].methodID,
+ j_htc, js_tblName, j_useTRex, j_tid, jba_rowID, jRow,
j_ts, j_checkAndPut, j_asyncOperation);
+ if (hbs) {
+ hbs->incHbaseCalls();
+ if (!asyncOperation)
+ hbs->incMaxHbaseIOTime(hbs->getTimer().stop());
+ }
+ if (jenv_->ExceptionCheck()) {
+ getExceptionDetails();
+ logError(CAT_SQL_HBASE, __FILE__, __LINE__);
+ logError(CAT_SQL_HBASE, "HBaseClient_JNI::insertRow()",
getLastError());
+ jenv_->PopLocalFrame(NULL);
+ if (htc != NULL)
+ NADELETE(htc, HTableClient_JNI, heap);
+ return HBC_ERROR_INSERTROW_EXCEPTION;
+ }
+ if (hbs)
+ hbs->incBytesRead(rowID.len + row.len);
+ if (jresult == false) {
+ jenv_->PopLocalFrame(NULL);
+ if (htc != NULL)
+ NADELETE(htc, HTableClient_JNI, heap);
+ return HBC_ERROR_INSERTROW_DUP_ROWID;
+ }
+ *outHtc = htc;
--- End diff --
Yes. htc is null for sync operations. This asyncHtc_ in
ExpHbaseInterface_JNI will be set to null. Hence, there is no need for release
the asyncHtc_
> Reduce the path length for IUD operations in Trafodion in the hbase client
> layer
> --------------------------------------------------------------------------------
>
> Key: TRAFODION-1444
> URL: https://issues.apache.org/jira/browse/TRAFODION-1444
> Project: Apache Trafodion
> Issue Type: Improvement
> Components: sql-exe
> Affects Versions: 2.0-incubating
> Reporter: Selvaganesan Govindarajan
> Assignee: Selvaganesan Govindarajan
> Original Estimate: 96h
> Remaining Estimate: 96h
>
> There are 3 JNI to java transitions for insert, update, delete,
> checkAndInsert, checkAndUpdate and checkAndDelete operations. It can be done
> with one jni transition and reduced memory allocation.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)