Github user sandhyasun commented on a diff in the pull request:
https://github.com/apache/trafodion/pull/1586#discussion_r192318454
--- Diff: core/sql/runtimestats/sscpipc.cpp ---
@@ -907,3 +910,53 @@ void
SscpNewIncomingConnectionStream::processSecInvReq()
request->decrRefCount();
}
+void SscpNewIncomingConnectionStream::processLobLockReq()
+{
+ IpcMessageObjVersion msgVer = getNextObjVersion();
+
+ ex_assert(msgVer <= currRtsStatsReqVersionNumber, "Up-rev message
received.");
+ NAHeap *statsHeap = NULL;
+ LobLockRequest *request = new(getHeap())
+ LobLockRequest(getHeap());
+
+ *this >> *request;
+ ex_assert( !moreObjects(), "unknown object follows LobLockRequest.");
+ SscpGlobals *sscpGlobals = getSscpGlobals();
+ StatsGlobals *statsGlobals = sscpGlobals->getStatsGlobals();
+ int error = statsGlobals->getStatsSemaphore(sscpGlobals->getSemId(),
+ sscpGlobals->myPin());
+ statsHeap = statsGlobals->getStatsHeap();
+ char *ll = new (statsHeap) char [LOB_LOCK_ID_SIZE];
+ memcpy(ll,request->getLobLockId(),LOB_LOCK_ID_SIZE+1);
+ SyncHashQueue *lobLockList = statsGlobals->getLobLocks();
+ if (ll[0] == '+') // If it's a positive value, we are supposed to insert
it.
--- End diff --
To address the scenario where 2 clients on different nodes check for a lock
and being the process of setting it, instead of simply setting/inserting into
the HashQueue, we should do an extra check for existence here before setting .
If it's already there, some other process on another node may have propagated
the same lockLockId first . So we should send a diagsArea back here to indicate
the set for this client/process failed.
---