Repository: incubator-trafodion
Updated Branches:
  refs/heads/master 371cb7110 -> acadd048d


[TRAFODION-2783] jdbc_test_cdh fails at times with type 2 JDBC driver dumping 
core

In case of Type 2 JDBC driver, the Trafodion SQL engine is a library that is 
dynamic
loaded into the process. Initialization of C++ static objects in the dynamic 
loaded libraries
are supposed to be done before dlopen returns. But the behavior seems to be 
nondeterministic when
there are multiple threads or when there are dependent static objects (An 
static object expects
another to be initialized before it). I think, the order of the initialization 
is not guaranteed
by the standard.

Refactored the code to initialize static object CharInfo::builtinCollationDB_ 
as part of the first
CLI call in a thread safe manner.


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/9a8a7c39
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/9a8a7c39
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/9a8a7c39

Branch: refs/heads/master
Commit: 9a8a7c39fecff583d2988c76fb443620ee64df24
Parents: 6b07d62
Author: selvaganesang <[email protected]>
Authored: Thu Oct 26 04:47:16 2017 +0000
Committer: selvaganesang <[email protected]>
Committed: Thu Oct 26 04:47:16 2017 +0000

----------------------------------------------------------------------
 core/sql/cli/CliExtern.cpp   | 10 +++++++---
 core/sql/common/charinfo.cpp | 29 +++++++++++++++++++----------
 core/sql/common/charinfo.h   |  6 +++++-
 3 files changed, 31 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a8a7c39/core/sql/cli/CliExtern.cpp
----------------------------------------------------------------------
diff --git a/core/sql/cli/CliExtern.cpp b/core/sql/cli/CliExtern.cpp
index d7454f9..8e03ff3 100644
--- a/core/sql/cli/CliExtern.cpp
+++ b/core/sql/cli/CliExtern.cpp
@@ -92,6 +92,7 @@ CLISemaphore globalSemaphore ;
 #include <unistd.h>
 #include "QRLogger.h"
 
+void initStaticVariables();
 extern char ** environ;
 
 // this is set to true after the first CLI call.
@@ -870,7 +871,8 @@ short sqInit()
       exit(1);
     }
 
-
+    // Initialize static variables
+    initStaticVariables();
     // Initialize an Instruction Info array's offset index
     ex_conv_clause::populateInstrOffsetIndex();
 
@@ -6998,5 +7000,7 @@ Lng32 SQL_EXEC_PutRoutine
 }
 #endif
 
-
-
+void initStaticVariables()
+{
+   CharInfo::initBuiltinCollationDB();
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a8a7c39/core/sql/common/charinfo.cpp
----------------------------------------------------------------------
diff --git a/core/sql/common/charinfo.cpp b/core/sql/common/charinfo.cpp
index d52244e..c2cb8e2 100644
--- a/core/sql/common/charinfo.cpp
+++ b/core/sql/common/charinfo.cpp
@@ -103,7 +103,7 @@ static const struct mapCS mapCSArray[] = {
   { /*18*/ CharInfo::GBK,            SQLCHARSETSTRING_GBK,         3, TRUE,    
FALSE,  1,    2, "?" },
 };
 
-static const size_t SIZEOF_CS = sizeof(mapCSArray)/sizeof(mapCS);
+#define SIZEOF_CS  (sizeof(mapCSArray)/sizeof(mapCS))
 
 const char* CharInfo::getCharSetName(CharSet cs, NABoolean retUnknownAsBlank)
 {
@@ -363,7 +363,7 @@ void CollationInfo::display() const
 CollationDB::CollationDB(CollHeap *h)
   : CollationDBSupertype(h), heap_(h), refreshNeeded_(TRUE)
 {
-    if (this == &CharInfo::builtinCollationDB_) return;
+    if (this == CharInfo::builtinCollationDB_) return;
     cmpCurrentContext->getCollationDBList()->insert(this);
 }
 
@@ -371,13 +371,14 @@ CollationDB::CollationDB(CollHeap *h, const CollationInfo 
*co, size_t count)
   : CollationDBSupertype(h), heap_(h), refreshNeeded_(!!count)
 { 
    while (count--) CollationDBSupertype::insert(co++);
-   if (this == &CharInfo::builtinCollationDB_) return;
-   cmpCurrentContext->getCollationDBList()->insert(this);
+   if (this == CharInfo::builtinCollationDB_) return;
+   if (cmpCurrentContext != NULL)
+      cmpCurrentContext->getCollationDBList()->insert(this);
 }
 
 CollationDB::~CollationDB()
 { 
-   if (this == &CharInfo::builtinCollationDB_) return;
+   if (this == CharInfo::builtinCollationDB_) return;
    clearAndReset();
    cmpCurrentContext->getCollationDBList()->remove(this);
 }
@@ -529,8 +530,10 @@ static const CollationInfo mapCOArray[] = {
   CollationInfo(NULL, CharInfo::UNKNOWN_COLLATION,  SQLCOLLATIONSTRING_UNKNOWN,
                        STATIC_NEG)
 };
-static const size_t SIZEOF_CO = sizeof(mapCOArray)/sizeof(CollationInfo);
-const CollationDB CharInfo::builtinCollationDB_(NULL, mapCOArray, SIZEOF_CO);
+
+#define SIZEOF_CO (sizeof(mapCOArray)/sizeof(CollationInfo))
+
+const CollationDB *CharInfo::builtinCollationDB_;
 
 CharInfo::Collation CharInfo::getCollationEnum(const char* name,
                                               NABoolean formatNSK,
@@ -550,18 +553,18 @@ CharInfo::Collation CharInfo::getCollationEnum(const 
char* name,
     return CharInfo::UNKNOWN_COLLATION;
 
   // Collapse any nonzero formatNSK to single bit, for XOR
-  return builtinCollationDB_.getCollationEnum(name, !!formatNSK, namlen);
+  return builtinCollationDB_->getCollationEnum(name, !!formatNSK, namlen);
 }
 
 const char* CharInfo::getCollationName(Collation co,
                                       NABoolean retUnknownAsBlank)
 {
-  return builtinCollationDB_.getCollationName(co, retUnknownAsBlank);
+  return builtinCollationDB_->getCollationName(co, retUnknownAsBlank);
 }
 
 Int32 CharInfo::getCollationFlags(Collation co)
 {
-  return builtinCollationDB_.getCollationFlags(co);
+  return builtinCollationDB_->getCollationFlags(co);
 }
 
 //****************************************************************************
@@ -693,3 +696,9 @@ Int32 CharInfo::getMaxConvertedLenInBytes(CharSet sourceCS,
   return ((sourceLenInBytes/minBytesPerChar(sourceCS)) *
           maxBytesPerChar(targetCS));
 }
+
+void CharInfo::initBuiltinCollationDB()
+{
+   builtinCollationDB_ = new CollationDB(NULL, mapCOArray, SIZEOF_CO);
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a8a7c39/core/sql/common/charinfo.h
----------------------------------------------------------------------
diff --git a/core/sql/common/charinfo.h b/core/sql/common/charinfo.h
index 88aceb0..e9cfcbf 100644
--- a/core/sql/common/charinfo.h
+++ b/core/sql/common/charinfo.h
@@ -50,6 +50,7 @@
 #include "NAWinNT.h"
 #include "ComCharSetDefs.h"
 #include "sql_charset_strings.h"
+#include "charinfo.h"
 
 // Forward references
 class ComMPLoc;
@@ -260,11 +261,14 @@ public:
                                          Int32   sourceLenInBytes,
                                          CharSet targetCS);
 
+  static void initBuiltinCollationDB();
+ 
+
 private:
 friend class CollationDB;                      // needs to access builtinCDB_
 
    static const char*  const localeCharSet_;
-   static const CollationDB   builtinCollationDB_;
+   static const CollationDB   *builtinCollationDB_;
 
 }; // CharInfo
 

Reply via email to