You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by se...@apache.org on 2017/01/27 04:48:48 UTC
[3/5] incubator-trafodion git commit: [TRAFODION-2455] More
refinements to row count estimation retry logic
[TRAFODION-2455] More refinements to row count estimation retry logic
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/dbc6c087
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/dbc6c087
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/dbc6c087
Branch: refs/heads/master
Commit: dbc6c0876ca5af07b63d68f388bad07195d106a5
Parents: f165363
Author: Dave Birdsall <db...@apache.org>
Authored: Wed Jan 25 22:40:56 2017 +0000
Committer: Dave Birdsall <db...@apache.org>
Committed: Wed Jan 25 22:40:56 2017 +0000
----------------------------------------------------------------------
core/sqf/monitor/linux/process.cxx | 19 ++++++++++++++++--
core/sql/executor/HBaseClient_JNI.cpp | 9 +++++++--
core/sql/executor/HBaseClient_JNI.h | 1 +
.../java/org/trafodion/sql/HBaseClient.java | 2 ++
core/sql/ustat/hs_cli.cpp | 6 ------
core/sql/ustat/hs_cli.h | 3 ---
core/sql/ustat/hs_globals.cpp | 21 ++++++++++++++------
core/sql/ustat/hs_log.cpp | 5 +++--
8 files changed, 45 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/dbc6c087/core/sqf/monitor/linux/process.cxx
----------------------------------------------------------------------
diff --git a/core/sqf/monitor/linux/process.cxx b/core/sqf/monitor/linux/process.cxx
index d84d6af..67c1980 100755
--- a/core/sqf/monitor/linux/process.cxx
+++ b/core/sqf/monitor/linux/process.cxx
@@ -1306,6 +1306,7 @@ bool CProcess::Create (CProcess *parent, int & result)
char sq_ic[5];
char term[20];
char tz[100];
+ bool tz_exists;
char xauthority[MAX_PROCESS_PATH];
char *display;
char *vnodes;
@@ -1317,7 +1318,11 @@ bool CProcess::Create (CProcess *parent, int & result)
env = getenv ("TERM");
STRCPY (term, (env?env:"ansi"));
env = getenv ("TZ");
- STRCPY (tz, (env?env:""));
+ tz_exists = (env != NULL);
+ if (tz_exists)
+ {
+ STRCPY (tz, env); // see note regarding TZ below
+ }
env = getenv ("USER");
STRCPY (user, (env?env:""));
env = getenv ("HOME");
@@ -1505,7 +1510,17 @@ bool CProcess::Create (CProcess *parent, int & result)
setEnvStrVal ( childEnv, nextEnv, "USER", user );
setEnvStrVal ( childEnv, nextEnv, "HOME", home );
setEnvStrVal ( childEnv, nextEnv, "TERM", term );
- setEnvStrVal ( childEnv, nextEnv, "TZ", tz );
+ if (tz_exists)
+ {
+ // Note that if TZ does not exist, we don't want to set it.
+ // The absence of TZ causes the glib localtime function to
+ // use the local time as defined in /etc/localtime. But,
+ // an invalid TZ setting (such as the empty string) causes
+ // the localtime function to use UTC. So, the semantics of
+ // an unset TZ are not the same as the semantics of
+ // TZ=<empty string>.
+ setEnvStrVal ( childEnv, nextEnv, "TZ", tz );
+ }
setEnvStrVal ( childEnv, nextEnv, "CLASSPATH", getenv("CLASSPATH"));
if ( display )
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/dbc6c087/core/sql/executor/HBaseClient_JNI.cpp
----------------------------------------------------------------------
diff --git a/core/sql/executor/HBaseClient_JNI.cpp b/core/sql/executor/HBaseClient_JNI.cpp
index 32e2203..da43948 100644
--- a/core/sql/executor/HBaseClient_JNI.cpp
+++ b/core/sql/executor/HBaseClient_JNI.cpp
@@ -63,6 +63,7 @@ static const char* const hbcErrorEnumStr[] =
,"Java exception in getHBulkLoadClient()."
,"Preparing parameters for estimateRowCount()."
,"Java exception in estimateRowCount()."
+ ,"estimateRowCount() returned false."
,"Java exception in releaseHBulkLoadClient()."
,"Java exception in getBlockCacheFraction()."
,"Preparing parameters for getLatestSnapshot()."
@@ -1307,6 +1308,10 @@ HBC_RetCode HBaseClient_JNI::estimateRowCount(const char* tblName,
Int64& rowCount,
Int32& breadCrumb)
{
+ // Note: Please use HBC_ERROR_ROWCOUNT_EST_EXCEPTION only for
+ // those error returns that call getExceptionDetails(). This
+ // tells the caller that Java exception information is available.
+
QRLogger::log(CAT_SQL_HBASE, LL_DEBUG, "HBaseClient_JNI::estimateRowCount(%s) called.", tblName);
breadCrumb = 1;
if (jenv_ == NULL)
@@ -1356,9 +1361,9 @@ HBC_RetCode HBaseClient_JNI::estimateRowCount(const char* tblName,
breadCrumb = 5;
if (jresult == false)
{
- logError(CAT_SQL_HBASE, "HBaseClient_JNI::estimateRowCount()", getLastError());
+ logError(CAT_SQL_HBASE, "HBaseClient_JNI::estimateRowCount() returned false", getLastError());
jenv_->PopLocalFrame(NULL);
- return HBC_ERROR_ROWCOUNT_EST_EXCEPTION;
+ return HBC_ERROR_ROWCOUNT_EST_FALSE;
}
breadCrumb = 6;
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/dbc6c087/core/sql/executor/HBaseClient_JNI.h
----------------------------------------------------------------------
diff --git a/core/sql/executor/HBaseClient_JNI.h b/core/sql/executor/HBaseClient_JNI.h
index c15913e..735cd09 100644
--- a/core/sql/executor/HBaseClient_JNI.h
+++ b/core/sql/executor/HBaseClient_JNI.h
@@ -364,6 +364,7 @@ typedef enum {
,HBC_ERROR_GET_HBLC_EXCEPTION
,HBC_ERROR_ROWCOUNT_EST_PARAM
,HBC_ERROR_ROWCOUNT_EST_EXCEPTION
+ ,HBC_ERROR_ROWCOUNT_EST_FALSE
,HBC_ERROR_REL_HBLC_EXCEPTION
,HBC_ERROR_GET_CACHE_FRAC_EXCEPTION
,HBC_ERROR_GET_LATEST_SNP_PARAM
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/dbc6c087/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java
----------------------------------------------------------------------
diff --git a/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java b/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java
index a6d26b5..d677991 100644
--- a/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java
+++ b/core/sql/src/main/java/org/trafodion/sql/HBaseClient.java
@@ -1124,6 +1124,8 @@ public class HBaseClient {
// ignore the interruption and keep going
}
retryWait = 2 * retryWait;
+ if (retryWait > 30000)
+ retryWait = 30000; // max out the retry wait at 30 seconds
}
else {
// we've retried enough; just re-throw
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/dbc6c087/core/sql/ustat/hs_cli.cpp
----------------------------------------------------------------------
diff --git a/core/sql/ustat/hs_cli.cpp b/core/sql/ustat/hs_cli.cpp
index 5e693a8..ff16b86 100644
--- a/core/sql/ustat/hs_cli.cpp
+++ b/core/sql/ustat/hs_cli.cpp
@@ -499,12 +499,6 @@ Lng32 HSClearCLIDiagnostics()
return retcode;
}
-// Clear any JNI diagnostic text stored in the CLI
-void HSFuncClearJniErrorStr()
-{
- GetCliGlobals()->currContext()->setJniErrorStr("");
-}
-
// Obtain any JNI diagnostic text stored in the CLI
const char * HSFuncGetJniErrorStr()
{
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/dbc6c087/core/sql/ustat/hs_cli.h
----------------------------------------------------------------------
diff --git a/core/sql/ustat/hs_cli.h b/core/sql/ustat/hs_cli.h
index 97ce4ab..ffb55a9 100644
--- a/core/sql/ustat/hs_cli.h
+++ b/core/sql/ustat/hs_cli.h
@@ -129,9 +129,6 @@ Lng32 HSFuncExecDDL( const char *dml
);
Lng32 HSClearCLIDiagnostics();
-// Clear any JNI diagnostic text stored in the CLI
-void HSFuncClearJniErrorStr();
-
// Obtain any JNI diagnostic text stored in the CLI
const char * HSFuncGetJniErrorStr();
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/dbc6c087/core/sql/ustat/hs_globals.cpp
----------------------------------------------------------------------
diff --git a/core/sql/ustat/hs_globals.cpp b/core/sql/ustat/hs_globals.cpp
index ca1255e..df0594c 100644
--- a/core/sql/ustat/hs_globals.cpp
+++ b/core/sql/ustat/hs_globals.cpp
@@ -72,6 +72,7 @@
#include "PrivMgrComponentPrivileges.h"
#include "PrivMgrCommands.h"
#include "CmpDDLCatErrorCodes.h"
+#include "HBaseClient_JNI.h" // to get HBC_ERROR_ROWCOUNT_EST_EXCEPTION
#include <sys/stat.h>
#include <sys/types.h>
@@ -3123,7 +3124,6 @@ Lng32 HSGlobalsClass::Initialize()
LM->StartTimer("getRowCount()");
Int32 errorCode = 0;
Int32 breadCrumb = 0;
- HSFuncClearJniErrorStr(); // clear out any stale error info
actualRowCount = objDef->getRowCount(currentRowCountIsEstimate_,
inserts, deletes, updates,
numPartitions,
@@ -3138,20 +3138,29 @@ Lng32 HSGlobalsClass::Initialize()
LM->Log(LM->msg);
sprintf(LM->msg, "\terrorCode=%d, breadCrumb=%d", errorCode, breadCrumb);
LM->Log(LM->msg);
- const char * jniErrorStr = HSFuncGetJniErrorStr();
- if (strlen(jniErrorStr) > 0)
+ if (errorCode == HBC_ERROR_ROWCOUNT_EST_EXCEPTION)
{
- LM->Log("\tJNI exception info:");
- LM->Log(jniErrorStr);
+ const char * jniErrorStr = HSFuncGetJniErrorStr();
+ if (strlen(jniErrorStr) > 0)
+ {
+ LM->Log("\tJNI exception info:");
+ LM->Log(jniErrorStr);
+ }
}
}
- if (errorCode)
+ if (errorCode == HBC_ERROR_ROWCOUNT_EST_EXCEPTION)
{
*CmpCommon::diags() << DgSqlCode(-UERR_BAD_EST_ROWCOUNT) << DgInt0(errorCode)
<< DgInt1(breadCrumb) << DgString0(HSFuncGetJniErrorStr());
return -1;
}
+ else if (errorCode)
+ {
+ *CmpCommon::diags() << DgSqlCode(-UERR_BAD_EST_ROWCOUNT) << DgInt0(errorCode)
+ << DgInt1(breadCrumb) << DgString0("");
+ return -1;
+ }
// We only allow an estimate when sampling, and then only if the
// estimated row count is at least ustat_min_estimate_for_rowcount (CQD),
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/dbc6c087/core/sql/ustat/hs_log.cpp
----------------------------------------------------------------------
diff --git a/core/sql/ustat/hs_log.cpp b/core/sql/ustat/hs_log.cpp
index 776a316..f7584d0 100644
--- a/core/sql/ustat/hs_log.cpp
+++ b/core/sql/ustat/hs_log.cpp
@@ -285,9 +285,10 @@ void HSLogMan::Log(const char *data)
{
ofstream fileout(logFile_->data(), ios::app);
time_t currentTime = time(0);
- struct tm * currentTimeExploded = localtime(¤tTime);
+ struct tm currentTimeExploded;
+ localtime_r(¤tTime,¤tTimeExploded);
char localTime[100]; // way more space than needed
- strftime(localTime,sizeof(localTime),"%c",currentTimeExploded);
+ strftime(localTime,sizeof(localTime),"%c",¤tTimeExploded);
fileout << "[" << localTime << "] " << data << endl;
}
}