Remove code that empties the LOB data file when creating an empty_blob.
Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/fb0ab72b Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/fb0ab72b Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/fb0ab72b Branch: refs/heads/master Commit: fb0ab72b30124418eba9473df5ac24743ffbc204 Parents: f04ffee Author: Sandhya Sundaresan <sand...@apache.org> Authored: Fri Nov 30 18:26:31 2018 +0000 Committer: Sandhya Sundaresan <sand...@apache.org> Committed: Fri Nov 30 18:26:31 2018 +0000 ---------------------------------------------------------------------- core/sql/exp/ExpLOBaccess.cpp | 91 +++++------------- core/sql/regress/executor/EXPECTED130 | 147 ++++++++++++++++------------- core/sql/regress/executor/TEST130 | 2 + 3 files changed, 107 insertions(+), 133 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafodion/blob/fb0ab72b/core/sql/exp/ExpLOBaccess.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/ExpLOBaccess.cpp b/core/sql/exp/ExpLOBaccess.cpp index ce48d5d..7a6c9ca 100644 --- a/core/sql/exp/ExpLOBaccess.cpp +++ b/core/sql/exp/ExpLOBaccess.cpp @@ -1779,77 +1779,23 @@ Ex_Lob_Error ExLob::allocateDesc(ULng32 size, Int64 &descNum, Int64 &dataOffset, lobDebugInfo("In ExLob::allocateDesc",0,__LINE__,lobTrace_); Int32 openFlags = O_RDONLY ; HDFS_Client_RetCode hdfsClientRetcode; + hdfsFileInfo *fInfo = NULL; if (! useLibHdfs_) { - if (size == 0) { - // Delete and Create the Hdfs file by passing overwrite to TRUE - hdfsClientRetcode = hdfsClient_->hdfsCreate(lobDataFile_.data(), TRUE, FALSE, FALSE); - if (hdfsClientRetcode != HDFS_CLIENT_OK) - return LOB_DATA_FILE_WRITE_ERROR; - else { - dataOffset = 0; - return LOB_OPER_OK; - } - } - else { + dataOffset = hdfsClient_->hdfsSize(hdfsClientRetcode); if (hdfsClientRetcode != HDFS_CLIENT_OK) return LOB_DATA_FILE_WRITE_ERROR; ex_assert(dataOffset >= 0, "Offset is -1 possibly due to path being directory"); return LOB_OPER_OK; - } + } - if (size == 0) //we are trying to empty this lob. + else { - //rename lob datafile - 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_.data(),O_WRONLY|O_CREAT,0,0,0); - if (!fdNew) - { - // 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,lobDataFile_.data()); - if (rc2 == -1) - { - lobDebugInfo("Problem restoring datafile . Will need to retry the update",0,__LINE__,lobTrace_); - return LOB_DATA_FILE_WRITE_ERROR; - } - return LOB_DATA_FILE_OPEN_ERROR; - - } - else - { - //A new empty data file has been created. - // delete the saved data file - 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_); - } - hdfsCloseFile(fs_,fdNew); - fdNew = NULL; - } + fInfo = hdfsGetPathInfo(fs_, lobDataFile_.data()); + if (fInfo) + dataOffset = fInfo->mSize; } - hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_.data()); - if (fInfo) - dataOffset = fInfo->mSize; // if -1, don't do GC or if reached the limit do GC if ((lobGCLimit != -1) && (dataOffset > lobGCLimit)) { @@ -1874,13 +1820,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_.data()); + if (! useLibHdfs_) + { + dataOffset = hdfsClient_->hdfsSize(hdfsClientRetcode); + if (hdfsClientRetcode != HDFS_CLIENT_OK) + return LOB_DATA_FILE_WRITE_ERROR; + ex_assert(dataOffset >= 0, "Offset is -1 possibly due to path being directory"); + } + else + { + hdfsFreeFileInfo(fInfo, 1); + fInfo = hdfsGetPathInfo(fs_, lobDataFile_.data()); + if (fInfo) + dataOffset = fInfo->mSize; + + } } - if (fInfo) - dataOffset = fInfo->mSize; - + // 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 @@ -1894,8 +1851,6 @@ Ex_Lob_Error ExLob::allocateDesc(ULng32 size, Int64 &descNum, Int64 &dataOffset, str_sprintf(logBuf,"Allocating new Offset %ld in %s ", dataOffset,lobDataFileSubstr); lobDebugInfo(logBuf,0,__LINE__,lobTrace_); - //Find the last offset in the file - // dataOffset = hdfsTell(fs_,fdData_); //commenting out.hdfsTell always returns 0 !! return LOB_OPER_OK; }