I added your fix, additional stats to some of the other auxiliaries, update the jcsadmin.jsp with a summary view, tagged, and added a new temp build called 1.2.7.9.2
--- Aaron Smuts <[EMAIL PROTECTED]> wrote: > I created a bug for this and am looking into it. > > http://issues.apache.org/jira/browse/JCS-12 > > > --- jklame <[EMAIL PROTECTED]> wrote: > > > > > Hi, > > > > We encountered a problem with an infinite loop in > > java.io.ObjectOutputStream > > which we were able to fix by ensuring that access > to > > it was synchronized > > inside LateralTCPSender.java. I thought I > should > > report exactly what we > > found and what we did to solve the problem so that > > perhaps similar changes > > might be made for the next release of jcs. > > > > We were using the LateralTCPCache in jcs.1.2.7.9 > and > > were performing > > serveral thousand gets and puts per minute from > > multiple threads all using > > the same JCS object. Very quickly, one of these > > threads would end up in an > > infinite loop in ObjectOutputStream.lookup() > > (offending loop in bold) > > > > int lookup(Object obj) { > > if (size == 0) { > > return -1; > > } > > int index = hash(obj) % spine.length; > > for (int i = spine[index]; i >= 0; i = > next[i]) > > { > > if (objs[i] == obj) { > > return i; > > } > > } > > return -1; > > } > > > > Once one thread ended up in this loop, all other > > threads would end up > > blocking, waiting to obtain a lock on this.getLock > > in > > LateralTCPSender.sendAndReceive() (found by > > performing a thread dump after > > the application had stopped responding). But > > since the thread in the > > inifinite loop already had a lock on this.getLock, > > > our application was > > effectively dead. > > > > Now ObjectOutputStream is not thread-safe. > Indeed, > > if multiple threads > > attempt to write objects to the same > > ObjectOutputStream simultaneously, it > > is likely that the internal object cache will > become > > corrupted and > > subsequent writes will end up locked in the > > aforementioned infinite loop. > > > > Looking at LateralTCPSender.java more carefully, > we > > noticed that the send( > > LateralElementDescriptor led ) method did perform > > non-thread-safe writes to > > the shared ObjectOutputStream. Wrapping access > to > > it with a > > synchronized(this.getLock) block (exactly as was > > done in the sendAndReceive > > method appears to have fixed out problem. I've > > included the 1.2.7.9 > > version of this method with the changes we made in > > bold. > > > > > > /** > > * Sends commands to the lateral cache > listener. > > * <p> > > * @param led > > * @throws IOException > > */ > > public void send( LateralElementDescriptor led > ) > > throws IOException > > { > > sendCnt++; > > if ( log.isInfoEnabled() ) > > { > > if ( sendCnt % 100 == 0 ) > > { > > log.info( "Send Count (port " + > port > > + ") = " + sendCnt ); > > } > > } > > > > if ( log.isDebugEnabled() ) > > { > > log.debug( "sending > > LateralElementDescriptor" ); > > } > > > > if ( led == null ) > > { > > return; > > } > > > > if ( address == null ) > > { > > throw new IOException( "No remote host > > is set for > > LateralTCPSender." ); > > } > > > > if ( oos != null ) > > { > > synchronized(this.getLock) > > { try > > { > > oos.writeObject( led ); > > oos.flush(); > > if ( ++counter >= > > RESET_FREQUENCY ) > > { > > counter = 0; > > // Failing to reset the > > object output stream every > > now and > > // then creates a serious > > memory leak. > > if ( log.isDebugEnabled() > ) > > { > > log.debug( "Doing > > oos.reset()" ); > > } > > oos.reset(); > > } > > } > > catch ( IOException e ) > > { > > oos = null; > > log.error( "Detected problem > > with connection: " + e ); > > throw e; > > } > > } } > > } > > > > Comments? > > John > > > > > > -- > > View this message in context: > > > http://www.nabble.com/100--cpu-issue-with-LateralTCPCache-tf2318435.html#a6449346 > > Sent from the JCS - Users mailing list archive at > > Nabble.com. > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: > > [EMAIL PROTECTED] > > For additional commands, e-mail: > > [EMAIL PROTECTED] > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: > [EMAIL PROTECTED] > For additional commands, e-mail: > [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]