You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by db...@apache.org on 2017/01/24 23:47:02 UTC

[2/6] incubator-trafodion git commit: Reworks

Reworks


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

Branch: refs/heads/master
Commit: 237f9e8e28cba752068756e6a4f0fe80408d334e
Parents: 49498df
Author: Dave Birdsall <db...@apache.org>
Authored: Thu Jan 19 23:48:14 2017 +0000
Committer: Dave Birdsall <db...@apache.org>
Committed: Thu Jan 19 23:48:14 2017 +0000

----------------------------------------------------------------------
 core/sql/bin/SqlciErrors.txt   |   3 +-
 core/sql/exp/ExpLOB.cpp        |  10 ++
 core/sql/exp/ExpLOBaccess.cpp  | 186 +++++++++++++++++++++++-------------
 core/sql/exp/ExpLOBaccess.h    |  17 ++--
 core/sql/exp/ExpLOBprocess.cpp |   2 +-
 5 files changed, 142 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/237f9e8e/core/sql/bin/SqlciErrors.txt
----------------------------------------------------------------------
diff --git a/core/sql/bin/SqlciErrors.txt b/core/sql/bin/SqlciErrors.txt
index a7f9bf9..d5110cb 100644
--- a/core/sql/bin/SqlciErrors.txt
+++ b/core/sql/bin/SqlciErrors.txt
@@ -1591,7 +1591,8 @@ $1~String1 --------------------------------
 8553 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Stream overflow; subscription rate has fallen too far behind publishing rate.
 8554 ZZZZZ 99999 UUUUUUUU UUUUU UUUUUUU -- unused, although the error number reservation doc says it is used ---
 8555 ZZZZZ 99999 ADVANCED CRTCL DIALOUT An internal error occurred in the SQL executor in the disk process.
-8556 ZZZZZ 99999 BEGINNER MAJOR DBADMIN An error occurred while accessing HBase table $0~string0. $1~string1 
+8556 ZZZZZ 99999 BEGINNER MAJOR DBADMIN An error occurred while accessing HBase table $0~string0. $1~string1
+8557 ZZZZZ 99999 BEGINNER MAJOR DBADMIN The file name passed to externaltolob exceeds 256 bytes.
 8570 ZZZZZ 99999 ADVANCED MAJOR DBADMIN SQL could not allocate sufficient memory to build query.
 8571 ZZZZZ 99999 ADVANCED MAJOR DBADMIN SQL could not allocate sufficient memory to execute query.
 8572 ZZZZZ 99999 ADVANCED CRTCL DIALOUT The statement has incurred a fatal error and must be deallocated.

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/237f9e8e/core/sql/exp/ExpLOB.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpLOB.cpp b/core/sql/exp/ExpLOB.cpp
index feb9641..66da5fc 100644
--- a/core/sql/exp/ExpLOB.cpp
+++ b/core/sql/exp/ExpLOB.cpp
@@ -775,6 +775,16 @@ ex_expr::exp_return_type ExpLOBiud::insertDesc(char *op_data[],
   Int64 lobLen = 0;
   if(!fromEmpty())
     lobLen = getOperand(1)->getLength();
+
+  // until SQL_EXEC_LOBcliInterface is changed to allow for unlimited
+  // black box sizes, we have to prevent over-sized file names from
+  // being stored
+  if ((so == Lob_External) && (lobLen > MAX_LOB_FILE_NAME_LEN))
+    {
+      ExRaiseSqlError(h, diagsArea, 
+		      (ExeErrorCode)(8557));
+      return ex_expr::EXPR_ERROR;
+    }
   
   blackBoxLen_ = 0;
   if (fromExternal())

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/237f9e8e/core/sql/exp/ExpLOBaccess.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpLOBaccess.cpp b/core/sql/exp/ExpLOBaccess.cpp
index e5bd380..8c40bf7 100644
--- a/core/sql/exp/ExpLOBaccess.cpp
+++ b/core/sql/exp/ExpLOBaccess.cpp
@@ -75,7 +75,8 @@ extern int ms_transid_reinstate(MS_Mon_Transid_Type, MS_Mon_Transseq_Type);
 // short LobServerFNum;
 SB_Phandle_Type serverPhandle;
 
-ExLob::ExLob() :
+ExLob::ExLob(NAHeap * heap) :
+    lobDataFile_(heap),
     storage_(Lob_Invalid_Storage),
     lobStorageLocation_(string()),
     lobGlobalHeap_(NULL),
@@ -167,14 +168,14 @@ Ex_Lob_Error ExLob::initialize(const char *lobFile, Ex_Lob_Mode mode,
   if (mode == EX_LOB_CREATE) 
     { 
       // check if file is already created
-      hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.c_str());
+      hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.data());
       if (fInfo != NULL) 
 	{
 	  hdfsFreeFileInfo(fInfo, 1);
 	  return LOB_DATA_FILE_CREATE_ERROR;
 	} 
       openFlags = O_WRONLY | O_CREAT;   
-      fdData_ = hdfsOpenFile(fs_, lobDataFile_.c_str(), openFlags, bufferSize, replication, blockSize);
+      fdData_ = hdfsOpenFile(fs_, lobDataFile_.data(), openFlags, bufferSize, replication, blockSize);
       if (!fdData_) 
 	{
           return LOB_DATA_FILE_CREATE_ERROR;
@@ -250,11 +251,10 @@ Ex_Lob_Error ExLob::fetchCursor(char *handleIn, Int32 handleLenIn, Int64 &outOff
         if (blackBox && blackBoxLen >0 )
           {
             // we have received the external data file name from the descriptor table
-            // replace the contents of the lobDataFile with this name 
-            lobDataFile_.assign(blackBox,0,blackBoxLen);  // copy blackBox safely (up to blackBoxLen chars)
-            size_t found = lobDataFile_.find_last_not_of("0");
-            if (found != string::npos)
-              lobDataFile_.erase(found+1);  // trim off any trailing '0'
+            // replace the contents of the lobDataFile with this name
+            char temp[blackBoxLen+1];
+            str_cpy_and_null(temp, blackBox, blackBoxLen, '\0', '0', TRUE);
+            lobDataFile_ = temp;
           }
         outOffset = offset;
         outSize = size;
@@ -306,7 +306,7 @@ Ex_Lob_Error ExLob::writeData(Int64 offset, char *data, Int32 size, Int64 &operL
     if (!fdData_ || (openFlags_ != (O_WRONLY | O_APPEND))) // file is not open for write
     {
       // get file info
-      hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.c_str());
+      hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.data());
       if (fInfo == NULL) {
          return LOB_DATA_FILE_NOT_FOUND_ERROR;
       }
@@ -314,7 +314,7 @@ Ex_Lob_Error ExLob::writeData(Int64 offset, char *data, Int32 size, Int64 &operL
      hdfsCloseFile(fs_, fdData_);
      fdData_=NULL;
      openFlags_ = O_WRONLY | O_APPEND; 
-     fdData_ = hdfsOpenFile(fs_, lobDataFile_.c_str(), openFlags_, 0, 0, 0);
+     fdData_ = hdfsOpenFile(fs_, lobDataFile_.data(), openFlags_, 0, 0, 0);
      if (!fdData_) {
        openFlags_ = -1;
        return LOB_DATA_FILE_OPEN_ERROR;
@@ -340,7 +340,7 @@ Ex_Lob_Error ExLob::writeDataSimple(char *data, Int64 size, LobsSubOper subOpera
     if (!fdData_ || (openFlags_ != (O_WRONLY | O_APPEND))) // file is not open for write
     {
       // get file info
-      hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.c_str());
+      hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.data());
       if (fInfo == NULL) {
          return LOB_DATA_FILE_NOT_FOUND_ERROR;
       } else { 
@@ -353,7 +353,7 @@ Ex_Lob_Error ExLob::writeDataSimple(char *data, Int64 size, LobsSubOper subOpera
       hdfsCloseFile(fs_, fdData_);
       fdData_=NULL;
       openFlags_ = O_WRONLY | O_APPEND ; 
-      fdData_ = hdfsOpenFile(fs_, lobDataFile_.c_str(), openFlags_, bufferSize, replication, blockSize);
+      fdData_ = hdfsOpenFile(fs_, lobDataFile_.data(), openFlags_, bufferSize, replication, blockSize);
       if (!fdData_) {
          openFlags_ = -1;
          return LOB_DATA_FILE_OPEN_ERROR;
@@ -978,10 +978,9 @@ Ex_Lob_Error ExLob::readToMem(char *memAddr, Int64 size,  Int64 &operLen,char *
        
        // we have received the external data file name from the descriptor table
        // replace the contents of the lobDataFile with this name 
-       lobDataFile_.assign(blackBox,0,blackBoxLen);  // copy blackBox safely (up to blackBoxLen chars)
-       size_t found = lobDataFile_.find_last_not_of("0");
-       if (found != string::npos)
-         lobDataFile_.erase(found+1);  // trim off any trailing '0'
+       char temp[blackBoxLen+1];
+       str_cpy_and_null(temp, blackBox, blackBoxLen, '\0', '0', TRUE);
+       lobDataFile_ = temp;
      }
    if (blackBoxLen == -1)
      {
@@ -1055,10 +1054,9 @@ Ex_Lob_Error ExLob::readToFile(char *tgtFileName, Int64 tgtLength, Int64 &operLe
     {
       // we have received the external data file name from the descriptor table
       // replace the contents of the lobDataFile with this name 
-      lobDataFile_.assign(blackBox,0,blackBoxLen);  // copy blackBox safely (up to blackBoxLen chars)
-      size_t found = lobDataFile_.find_last_not_of("0");
-      if (found != string::npos)
-        lobDataFile_.erase(found+1);  // trim off any trailing '0'
+      char temp[blackBoxLen+1];
+      str_cpy_and_null(temp, blackBox, blackBoxLen, '\0', '0', TRUE);
+      lobDataFile_ = temp;
     }
   if (tgtType == HDFS_FILE)
     {
@@ -1287,10 +1285,15 @@ Ex_Lob_Error ExLob::delDesc(char *handleIn, Int32 handleInLen, Int64 transId)
 Ex_Lob_Error ExLob::purgeLob()
 {
     char logBuf[4096];
-     if (hdfsDelete(fs_, lobDataFile_.c_str(), 0) != 0)
+     if (hdfsDelete(fs_, lobDataFile_.data(), 0) != 0)
        {
-         string lobDataFileSubstr = lobDataFile_.substr(0,sizeof(logBuf - 40));  // make small enough to fit
-         str_sprintf(logBuf,"hdfsDelete of %s returned error",lobDataFileSubstr.c_str());
+         // extract a substring small enough to fit into logBuf
+         size_t len = MINOF(lobDataFile_.length(),sizeof(logBuf)-40); 
+         char lobDataFileSubstr[len+1];  // +1 for trailing null
+         strncpy(lobDataFileSubstr,lobDataFile_.data(),len);
+         lobDataFileSubstr[len] = '\0';
+  
+         str_sprintf(logBuf,"hdfsDelete of %s returned error",lobDataFileSubstr);
          lobDebugInfo("In ExLob::purgeLob",0,__LINE__,lobTrace_);
 	 return LOB_DATA_FILE_DELETE_ERROR;
        }
@@ -1412,7 +1415,7 @@ Ex_Lob_Error ExLob::openDataCursor(const char *file, LobsCursorType type,
         hdfsCloseFile(fs_, fdData_);
         fdData_ = NULL;
         openFlags_ = O_RDONLY;
-        fdData_ = hdfsOpenFile(fs_, lobDataFile_.c_str(), openFlags_, 0, 0, 0);
+        fdData_ = hdfsOpenFile(fs_, lobDataFile_.data(), openFlags_, 0, 0, 0);
        
         if (!fdData_)
           {
@@ -1508,23 +1511,30 @@ Ex_Lob_Error ExLob::allocateDesc(ULng32 size, Int64 &descNum, Int64 &dataOffset,
     if (size == 0) //we are trying to empty this lob.
       {
         //rename lob datafile
-        string saveLobDataFile = lobDataFile_ + "_save";
-        Int32 rc2 = hdfsRename(fs_,lobDataFile_.c_str(),saveLobDataFile.c_str());
+        char saveLobDataFile[lobDataFile_.length() + sizeof("_save")]; // sizeof includes room for null terminator
+        strcpy(saveLobDataFile,lobDataFile_.data());
+        strcpy(saveLobDataFile+lobDataFile_.length(),"_save");
+        Int32 rc2 = hdfsRename(fs_,lobDataFile_.data(),saveLobDataFile);
         if (rc2 == -1)
           {
             lobDebugInfo("Problem renaming datafile to save data file",0,__LINE__,lobTrace_);
             return LOB_DATA_FILE_WRITE_ERROR;
           }
         //create a new file of the same name.
-        hdfsFile fdNew = hdfsOpenFile(fs_, lobDataFile_.c_str(),O_WRONLY|O_CREAT,0,0,0);
+        hdfsFile fdNew = hdfsOpenFile(fs_, lobDataFile_.data(),O_WRONLY|O_CREAT,0,0,0);
         if (!fdNew) 
           {
-            string lobDataFileSubstr = lobDataFile_.substr(0,sizeof(logBuf - 40));  // make small enough to fit
-            str_sprintf(logBuf,"Could not create/open file:%s",lobDataFileSubstr.c_str());
+            // extract a substring small enough to fit into logBuf
+            size_t len = MINOF(lobDataFile_.length(),sizeof(logBuf)-40); 
+            char lobDataFileSubstr[len+1];  // +1 for trailing null
+            strncpy(lobDataFileSubstr,lobDataFile_.data(),len);
+            lobDataFileSubstr[len] = '\0';
+
+            str_sprintf(logBuf,"Could not create/open file:%s",lobDataFileSubstr);
             lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
             
             //restore previous version
-            Int32 rc2 = hdfsRename(fs_,saveLobDataFile.c_str(),lobDataFile_.c_str());
+            Int32 rc2 = hdfsRename(fs_,saveLobDataFile,lobDataFile_.data());
               if (rc2 == -1)
                 {
                   lobDebugInfo("Problem restoring datafile . Will need to retry the update",0,__LINE__,lobTrace_);
@@ -1537,7 +1547,7 @@ Ex_Lob_Error ExLob::allocateDesc(ULng32 size, Int64 &descNum, Int64 &dataOffset,
           {
             //A new empty data file has been created.
             // delete the saved data file
-            Int32 rc2 = hdfsDelete(fs_,saveLobDataFile.c_str(),FALSE);//ok to ignore error.nt32            
+            Int32 rc2 = hdfsDelete(fs_,saveLobDataFile,FALSE);//ok to ignore error.nt32            
             if (rc2 == -1)
               {
                 lobDebugInfo("Problem deleting saved datafile . Will need to manually cleanup saved datafile",0,__LINE__,lobTrace_);
@@ -1546,7 +1556,7 @@ Ex_Lob_Error ExLob::allocateDesc(ULng32 size, Int64 &descNum, Int64 &dataOffset,
             fdNew = NULL;    
           }
       }
-    hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.c_str());
+    hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.data());
     if (fInfo)
       dataOffset = fInfo->mSize;
 
@@ -1574,19 +1584,24 @@ Ex_Lob_Error ExLob::allocateDesc(ULng32 size, Int64 &descNum, Int64 &dataOffset,
       if (GCDone) // recalculate the new offset  
         {  
           hdfsFreeFileInfo(fInfo, 1);
-          fInfo = hdfsGetPathInfo(fs_, lobDataFile_.c_str());
+          fInfo = hdfsGetPathInfo(fs_, lobDataFile_.data());
         }
         
       if (fInfo)
         dataOffset = fInfo->mSize;
 
-      string lobDataFileSubstr = lobDataFile_.substr(0,sizeof(logBuf - 70));  // make small enough to fit below
+      // extract a substring small enough to fit into logBuf
+      size_t len = MINOF(lobDataFile_.length(),sizeof(logBuf)-70); 
+      char lobDataFileSubstr[len+1];  // +1 for trailing null
+      strncpy(lobDataFileSubstr,lobDataFile_.data(),len);
+      lobDataFileSubstr[len] = '\0';
+
       if (GCDone)
         str_sprintf(logBuf,"Done GC. Allocating new Offset %Ld in %s",
-                    dataOffset,lobDataFileSubstr.c_str());
+                    dataOffset,lobDataFileSubstr);
       else
         str_sprintf(logBuf,"Allocating new Offset %Ld in %s ",
-                    dataOffset,lobDataFileSubstr.c_str());
+                    dataOffset,lobDataFileSubstr);
       lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
       //Find the last offset in the file
       // dataOffset = hdfsTell(fs_,fdData_);  //commenting out.hdfsTell always returns 0 !!
@@ -1599,14 +1614,32 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
   char logBuf[4096];
   lobDebugInfo("In ExLob::compactLobDataFile",0,__LINE__,lobTrace_);
   Int64 maxMemChunk = 1024*1024*1024; //1GB limit for intermediate buffer for transfering data
-  string saveLobDataFile = lobDataFile_ + "_save";
-  string tmpLobDataFile = lobDataFile_ + "_tmp";
 
-  string lobDataFileSubstr = lobDataFile_.substr(0,sizeof(logBuf)/3 - 20);  // make small enough to fit
-  string tmpLobDataFileSubstr = tmpLobDataFile.substr(0,sizeof(logBuf)/3 - 20);
-  string saveLobDataFileSubstr = saveLobDataFile.substr(0,sizeof(logBuf)/3 - 20);
+  // make some temporary file names
+  size_t len = lobDataFile_.length();
+  char saveLobDataFile[len + sizeof("_save")]; // sizeof includes room for null terminator
+  strcpy(saveLobDataFile,lobDataFile_.data());
+  strcpy(saveLobDataFile+len,"_save");
+  char tmpLobDataFile[len + sizeof("_tmp")]; // sizeof includes room for null terminator
+  strcpy(tmpLobDataFile,lobDataFile_.data());
+  strcpy(tmpLobDataFile+len,"_tmp");
+
+  // extract small enough bits of these file names to fit in logBuf
+  len = MINOF(lobDataFile_.length(),sizeof(logBuf)/3 - 20); 
+  char lobDataFileSubstr[len + 1];
+  strncpy(lobDataFileSubstr,lobDataFile_.data(),len);
+  lobDataFileSubstr[len] = '\0';
+  len = MINOF(sizeof(tmpLobDataFile),sizeof(logBuf)/3 - 20); 
+  char tmpLobDataFileSubstr[len + 1];
+  strncpy(tmpLobDataFileSubstr,tmpLobDataFile,len);
+  tmpLobDataFileSubstr[len] = '\0';
+  len = MINOF(sizeof(saveLobDataFile),sizeof(logBuf)/3 - 20);
+  char saveLobDataFileSubstr[len + 1];
+  strncpy(saveLobDataFileSubstr,saveLobDataFile,len);
+  saveLobDataFileSubstr[len] = '\0';
+
   str_sprintf(logBuf,"DataFile %s, TempDataFile : %s, SaveDataFile : %s ",
-              lobDataFileSubstr.c_str(),tmpLobDataFileSubstr.c_str(), saveLobDataFileSubstr.c_str());
+              lobDataFileSubstr,tmpLobDataFileSubstr, saveLobDataFileSubstr);
 
   lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
   hdfsFS fs = hdfsConnect(hdfsServer_,hdfsPort_);
@@ -1614,12 +1647,17 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
     return LOB_DATA_FILE_OPEN_ERROR;
   
  
-  hdfsFile  fdData = hdfsOpenFile(fs, lobDataFile_.c_str(), O_RDONLY, 0, 0,0);
+  hdfsFile  fdData = hdfsOpenFile(fs, lobDataFile_.data(), O_RDONLY, 0, 0,0);
   
   if (!fdData)
     {
-      string lobDataFileSubstr = lobDataFile_.substr(0,sizeof(logBuf - 40));  // make small enough to fit
-      str_sprintf(logBuf,"Could not open file:%s",lobDataFileSubstr.c_str());
+      // extract substring small enough to fit in logBuf
+      len = MINOF(lobDataFile_.length(),sizeof(logBuf) - 40); 
+      char lobDataFileSubstr2[len + 1];
+      strncpy(lobDataFileSubstr2,lobDataFile_.data(),len);
+      lobDataFileSubstr2[len] = '\0';
+
+      str_sprintf(logBuf,"Could not open file:%s",lobDataFileSubstr2);
       lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
       hdfsCloseFile(fs,fdData);
       fdData = NULL;
@@ -1627,11 +1665,16 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
     }
                           
         
-  hdfsFile fdTemp = hdfsOpenFile(fs, tmpLobDataFile.c_str(),O_WRONLY|O_CREAT,0,0,0);
-   if (!fdTemp) 
+  hdfsFile fdTemp = hdfsOpenFile(fs, tmpLobDataFile,O_WRONLY|O_CREAT,0,0,0);
+  if (!fdTemp) 
     {
-      string tmpLobDataFileSubstr = lobDataFile_.substr(0,sizeof(logBuf - 40));  // make small enough to fit
-      str_sprintf(logBuf,"Could not open file:%s",tmpLobDataFileSubstr.c_str());
+      // extract substring small enough to fit in logBuf
+      len = MINOF(sizeof(tmpLobDataFile),sizeof(logBuf)/3 - 20); 
+      char tmpLobDataFileSubstr2[len + 1];
+      strncpy(tmpLobDataFileSubstr2,tmpLobDataFile,len);
+      tmpLobDataFileSubstr2[len] = '\0';
+
+      str_sprintf(logBuf,"Could not open file:%s",tmpLobDataFileSubstr2);
       lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
       hdfsCloseFile(fs,fdTemp);
       fdTemp = NULL;
@@ -1700,13 +1743,13 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
   
    //Now save the data file and rename the tempfile to the original datafile
 
-   Int32 rc2 = hdfsRename(fs,lobDataFile_.c_str(),saveLobDataFile.c_str());
+   Int32 rc2 = hdfsRename(fs,lobDataFile_.data(),saveLobDataFile);
    if (rc2 == -1)
      {
        lobDebugInfo("Problem renaming datafile to save data file",0,__LINE__,lobTrace_);
        return LOB_DATA_FILE_WRITE_ERROR;
      }
-   rc2 = hdfsRename(fs,tmpLobDataFile.c_str(), lobDataFile_.c_str());
+   rc2 = hdfsRename(fs,tmpLobDataFile, lobDataFile_.data());
    if (rc2 == -1)
      {
        lobDebugInfo("Problem renaming temp datafile to data file",0,__LINE__,lobTrace_);
@@ -1723,9 +1766,11 @@ Ex_Lob_Error ExLob::restoreLobDataFile()
   hdfsFS fs = hdfsConnect(hdfsServer_,hdfsPort_);
   if (fs == NULL)
     return LOB_DATA_FILE_OPEN_ERROR;
-  string saveLobDataFile = lobDataFile_ + "_save";
-  Int32 rc2 = hdfsDelete(fs,lobDataFile_.c_str(),FALSE);//ok to ignore error.
-  rc2 = hdfsRename(fs,saveLobDataFile.c_str(), lobDataFile_.c_str());
+  char saveLobDataFile[lobDataFile_.length() + sizeof("_save")]; // sizeof includes room for null terminator
+  strcpy(saveLobDataFile,lobDataFile_.data());
+  strcpy(saveLobDataFile+lobDataFile_.length(),"_save");
+  Int32 rc2 = hdfsDelete(fs,lobDataFile_.data(),FALSE);//ok to ignore error.
+  rc2 = hdfsRename(fs,saveLobDataFile, lobDataFile_.data());
   if (rc2)
      {
        lobDebugInfo("Problem renaming savedatafile to data file",0,__LINE__,lobTrace_);
@@ -1742,8 +1787,10 @@ Ex_Lob_Error ExLob::purgeBackupLobDataFile()
   hdfsFS fs = hdfsConnect(hdfsServer_,hdfsPort_);
   if (fs == NULL)
     return LOB_DATA_FILE_OPEN_ERROR;
-  string saveLobDataFile = lobDataFile_ + "_save";
-  Int32 rc2 = hdfsDelete(fs,saveLobDataFile.c_str(),FALSE);//ok to ignore error.
+  char saveLobDataFile[lobDataFile_.length() + sizeof("_save")]; // sizeof includes room for null terminator
+  strcpy(saveLobDataFile,lobDataFile_.data());
+  strcpy(saveLobDataFile+lobDataFile_.length(),"_save");
+  Int32 rc2 = hdfsDelete(fs,saveLobDataFile,FALSE);//ok to ignore error.
    
   return rc;
 }
@@ -1830,7 +1877,7 @@ Ex_Lob_Error ExLob::readCursorData(char *tgt, Int64 tgtSize, cursor_t &cursor, I
           hdfsCloseFile(fs_, fdData_);
           fdData_=NULL;
           openFlags_ = O_RDONLY;
-          fdData_ = hdfsOpenFile(fs_, lobDataFile_.c_str(), openFlags_, 0, 0, 0);
+          fdData_ = hdfsOpenFile(fs_, lobDataFile_.data(), openFlags_, 0, 0, 0);
         
           if (!fdData_)
             {
@@ -1905,7 +1952,7 @@ Ex_Lob_Error ExLob::readDataToMem(char *memAddr,
       hdfsCloseFile(fs_, fdData_);
       fdData_=NULL;
       openFlags_ = O_RDONLY;
-      fdData_ = hdfsOpenFile(fs_, lobDataFile_.c_str(), openFlags_, 0, 0, 0);
+      fdData_ = hdfsOpenFile(fs_, lobDataFile_.data(), openFlags_, 0, 0, 0);
     
       if (!fdData_)
         {
@@ -1917,7 +1964,7 @@ Ex_Lob_Error ExLob::readDataToMem(char *memAddr,
     }
   else
     {
-      fdData_ = hdfsOpenFile(fs_, lobDataFile_.c_str(), openFlags_, 0, 0, 0);
+      fdData_ = hdfsOpenFile(fs_, lobDataFile_.data(), openFlags_, 0, 0, 0);
      
       if (!fdData_)
         {
@@ -1939,9 +1986,14 @@ Ex_Lob_Error ExLob::readDataToMem(char *memAddr,
 	return LOB_DATA_READ_ERROR;
       } 
       
-      string lobDataFileSubstr = lobDataFile_.substr(0,sizeof(logBuf - 100));  // make small enough to fit
+      // extract a substring small enough to fit into logBuf
+      size_t len = MINOF(lobDataFile_.length(),sizeof(logBuf)-100); 
+      char lobDataFileSubstr[len+1];  // +1 for trailing null
+      strncpy(lobDataFileSubstr,lobDataFile_.data(),len);
+      lobDataFileSubstr[len] = '\0';
+
       str_sprintf(logBuf,"After hdfsPread: File:%s, Offset:%Ld, Size:%Ld,Target Mem Addr:%Ld",
-                  lobDataFileSubstr.c_str(),offset,size,memAddr);
+                  lobDataFileSubstr,offset,size,memAddr);
       lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
       operLen = bytesRead;
       return LOB_OPER_OK;
@@ -2334,8 +2386,7 @@ Ex_Lob_Error ExLobsOper (
 
       if (it == lobMap->end())
 	{
-	  //lobPtr = new (lobGlobals->getHeap())ExLob();
-	  lobPtr = new ExLob();
+	  lobPtr = new (lobGlobals->getHeap())ExLob(lobGlobals->getHeap());
 	  if (lobPtr == NULL) 
 	    return LOB_ALLOC_ERROR;
 
@@ -3105,10 +3156,6 @@ ExLobGlobals::~ExLobGlobals()
     preOpenList_.clear();
     preOpenListLock_.unlock();
 
-    
-    if (lobMap_) 
-      delete lobMap_;
-
     if (numWorkerThreads_ > 0) { 
        for (int i=0; numWorkerThreads_-i > 0 && i < NUM_WORKER_THREADS; i++) {
            QRLogger::log(CAT_SQL_EXE, LL_DEBUG, 0, NULL,  
@@ -3139,6 +3186,11 @@ ExLobGlobals::~ExLobGlobals()
       c_it = postfetchBufList_.erase(c_it);
     }
     postfetchBufListLock_.unlock();
+
+    //delete the lobMap AFTER the worker threads have finished their pending 
+    //work since they may still be using an objetc that was fetched off the lobMap_
+    if (lobMap_) 
+      delete lobMap_;
     
     //msg_mon_close_process(&serverPhandle);
     if (threadTraceFile_)

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/237f9e8e/core/sql/exp/ExpLOBaccess.h
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpLOBaccess.h b/core/sql/exp/ExpLOBaccess.h
index a793487..3d981b4 100644
--- a/core/sql/exp/ExpLOBaccess.h
+++ b/core/sql/exp/ExpLOBaccess.h
@@ -399,12 +399,12 @@ void cleanupLOBDataDescFiles(const char *hdfsServer, int hdfsPort, const char *h
 // ExLob 
 ///////////////////////////////////////////////////////////////////////////////
 
-class ExLob
+class ExLob : public NABasicObject
 {
   public:
     
-    ExLob();  // default constructor
-    ~ExLob(); // default desctructor
+    ExLob(NAHeap * heap);  // default constructor
+    virtual ~ExLob(); // default desctructor
 
     Ex_Lob_Error initialize(const char *lobFile, Ex_Lob_Mode mode, char *dir, 
                             LobsStorage storage, char *hdfsServer, Int64 hdfsPort,
@@ -458,7 +458,7 @@ class ExLob
   
   Ex_Lob_Error lockDesc();
   Ex_Lob_Error unlockDesc();
-  const char *getDataFileName() { return lobDataFile_.c_str(); }
+  const char *getDataFileName() { return lobDataFile_.data(); }
   
   int getErrNo();
   
@@ -515,7 +515,7 @@ class ExLob
 
   public:
 
-    string lobDataFile_; // TODO: change to NAString when ExLobCursor is allocated off of an NAHeap
+    NAString lobDataFile_;
     lobCursors_t lobCursors_;
     ExLobLock lobCursorLock_;
     LobsStorage storage_;
@@ -558,7 +558,7 @@ class ExLobHdfsRequest
 };
 
 
-class ExLobPreOpen
+class ExLobPreOpen : public NABasicObject
 {
   public :
 
@@ -575,7 +575,10 @@ class ExLobPreOpen
       // nothing else to do
     }
 
-    ~ExLobPreOpen();
+    virtual ~ExLobPreOpen()
+    { 
+      // nothing else to do
+    };
 
   public :
     ExLob *lobPtr_; 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/237f9e8e/core/sql/exp/ExpLOBprocess.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpLOBprocess.cpp b/core/sql/exp/ExpLOBprocess.cpp
index 92779ef..1bf0598 100644
--- a/core/sql/exp/ExpLOBprocess.cpp
+++ b/core/sql/exp/ExpLOBprocess.cpp
@@ -502,7 +502,7 @@ Ex_Lob_Error ExLobGlobals::getLobPtr(char *lobName, ExLob *& lobPtr)
 
     if (it == lobMap->end())
     {
-        lobPtr = new ExLob();
+        lobPtr = new (lobGlobals->getHeap())ExLob(lobGlobals->getHeap());
         if (lobPtr == NULL) 
           return LOB_ALLOC_ERROR;