[omniORB] Assertion in Strand::Sync::RdUnlock() under stress
Chris Newbold
cnewbold@laurelnetworks.com
15 Aug 2001 11:15:21 -0400
We're currently using omniORB 3.03 patch 7, running on Red Hat Linux
6.x. The ORB and all related code was built with gcc 2.95.2.
During a stress test run for our application, omniORB failed with an
assertion in Strand::Sync::RdUnlock(); here's the backtrace:
#0 0x08a8a7cf CoreSigHandler+299
#1 0x403c0552 pthread_sighandler+194
#2 0x403e9b18 __restore
#3 0x403e9bf1 __kill+17
#4 0x403eaf62 abort+206
#5 0x4024479f omniORB::fatalException::fatalException(char const *,
int, char const *)+55
#6 0x402186d8 omni::assertFail(char const *, int, char const *)+216
#7 0x40238994 Strand::Sync::RdUnlock(bool)+80
#8 0x4023754d NetBufferedStream::RdUnlock(void)+77
#9 0x402368f3 NetBufferedStream::~NetBufferedStream(void)+35
#10 0x4022a6dc GIOP_S::~GIOP_S(void)+172
#11 0x4022b13c GIOP_S::dispatcher(Strand *)+1164
#12 0x4024a119 tcpSocketWorker::_realRun(void *)+101
#13 0x402611d2 omniORB::giopServerThreadWrapper::run(void (*)(void *),
void *)+30
#14 0x4024a0a4 tcpSocketWorker::run(void *)+48
#15 0x4029802a omni_thread_wrapper+170
I've spent some time poking around in the code, but have come to only a
few very cursory conclusions: 1) hitting this assertion would seem to
indicate that there was a sequence of unbalanced calles to RdLock() and
RdUnlock(); 2) the use of RdLock() and RdUnlock() in the request
handling path appears to be trivial (and error-free); 3) this could
possibly be caused by unintended concurrency on the underlying Strand;
4) it could just be dodgy exception handling code generated by the
compiler (which burns us a new way each week...)
Any suggestions would be appriciated.
-Chris Newbold
Laurel Networks, Inc.