Github user sandhyasun commented on a diff in the pull request:
https://github.com/apache/trafodion/pull/1428#discussion_r192260422
--- Diff: core/sql/exp/ExpLOBaccess.cpp ---
@@ -870,6 +870,67 @@ Ex_Lob_Error ExLob::getLength(char *handleIn, Int32
handleInLen,Int64 &outLobLen
}
return err;
}
+Ex_Lob_Error ExLob::getOffset(char *handleIn, Int32 handleInLen,Int64
&outLobOffset,LobsSubOper so, Int64 transId)
+{
+ char logBuf[4096];
+ Int32 cliErr = 0;
+ Ex_Lob_Error err=LOB_OPER_OK;
+ char *blackBox = new(getLobGlobalHeap()) char[MAX_LOB_FILE_NAME_LEN+6];
+ Int32 blackBoxLen = 0;
+ Int64 dummy = 0;
+ Int32 dummy2 = 0;
+ if (so != Lob_External_File)
+ {
+
+ cliErr = SQL_EXEC_LOBcliInterface(handleIn,
handleInLen,NULL,NULL,NULL,NULL,LOB_CLI_SELECT_LOBOFFSET,LOB_CLI_ExecImmed,&outLobOffset,0,
0, 0,0,transId,lobTrace_);
+
+ if (cliErr < 0 ) {
+ str_sprintf(logBuf,"CLI SELECT_LOBOFFSET returned error
%d",cliErr);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
+
+ return LOB_DESC_READ_ERROR;
+ }
+ }
+
+ return err;
+}
+
+Ex_Lob_Error ExLob::getFileName(char *handleIn, Int32 handleInLen, char
*outFileName, Int32 &outFileLen , LobsSubOper so, Int64 transId)
+{
+ char logBuf[4096];
+ Int32 cliErr = 0;
+ Ex_Lob_Error err=LOB_OPER_OK;
+ Int64 dummy = 0;
+ Int32 dummy2 = 0;
+ if (so != Lob_External_File)
+ {
+ //Derive the filename from the LOB handle and return
+ str_cpy_all(outFileName, (char
*)lobDataFile_.data(),lobDataFile_.length());
--- End diff --
On further thought, maybe there needs to be an extra check in the sscp. in
::processLobRequest where we should check if another process on another node
has already propgated/set the same lock into the local shared segment and if so
error out and ensure that the current SetLobkLock call fails . This way only
one of them succeeds. There can be cases where both processes repeatedly fail
but with AQR and erroring out seems like a safer thing to do. Will set
@selvaganesang comment on this issue.
---