Hi,

will do (once the cvs is back online again)

-- Juha


At 00:26 21.3.2001 +0100, you wrote:
>I have the problem too. (having a log file of 400mb)
>
>will this fix be checked into cvs?
>
>thx markus
>
>
>-----Original Message-----
>From: Bill Burke [mailto:[EMAIL PROTECTED]]
>Sent: Dienstag, 20. März 2001 21:14
>To: [EMAIL PROTECTED]
>Subject: Re: [JBoss-user] LOCKING-WAITING
>
>
>You're may be getting such a performance hit because of all the 
>LOCKING-WAITING messages being sent to jboss/logs/server.log.  Check out
>
>that file, my guess it will be very, very large.
>
>BTW, please don't remove that message.  It is very useful for debugging 
>purposes.
>
>Here's a fix for that very problem,
>
>in org.jboss.ejb.plugins.EntityInstanceInterceptor I changed the invoke 
>method.
>
>  public Object invoke(MethodInvocation mi)
>  throws Exception
>  {
>      // The id store is a CacheKey in the case of Entity
>      CacheKey key = (CacheKey)mi.getId();
>
>      // Get cache
>      AbstractInstanceCache cache = 
>(AbstractInstanceCache)container.getInstanceCache();
>      Sync mutex = (Sync)cache.getLock(key);
>
>      EnterpriseContext ctx = null;
>
>      try
>      {
>          boolean waitingOnTransaction = false; // So we don't output 
>LOCKING-WAITING all the time
>          boolean waitingOnContext = false; // So we don't output 
>LOCKING-WAITING all the time
>
>          do
>          {
>              if (mi.getTransaction() != null && 
>mi.getTransaction().getStatus() == Status.STATUS_MARKED_ROLLBACK)
>                  throw new RuntimeException("Transaction marked for 
>rollback, possibly a timeout");
>
>              try
>              {
>
>                  mutex.acquire();
>
>                  // Get context
>                  ctx = cache.get(key);
>
>                  // Do we have a running transaction with the context
>                  Transaction tx = ctx.getTransaction();
>                  if (tx != null &&
>                      // And are we trying to enter with another 
>transaction
>                      !tx.equals(mi.getTransaction()))
>                  {
>                      // Let's put the thread to sleep a lock release 
>will wake the thread
>                      // Possible deadlock
>                      if (!waitingOnTransaction)
>                      {
>                          Logger.debug("LOCKING-WAITING (TRANSACTION) 
>for id "+ctx.getId()+" ctx.hash "+ctx.hashCode()+" tx:"+((tx == null) ? 
>"null" : tx.toString()));
>                          waitingOnTransaction = true;
>                      }
>
>                      // Try your luck again
>                      ctx = null;
>                      continue;
>                  }
>                  else
>                  {
>                      if (waitingOnTransaction)
>                      {
>                          Logger.debug("FINISHED-LOCKING-WAITING 
>(TRANSACTION) for id "+ctx.getId()+" ctx.hash "+ctx.hashCode()+" 
>tx:"+((tx == null) ? "null" : tx.toString()));
>                          waitingOnTransaction = false;
>                      }
>                      // If we get here it's the right tx, or no tx
>                      if (!ctx.isLocked())
>                      {
>                          //take it!
>                          ctx.lock();
>                      }
>                      else
>                      {
>                          if (!isCallAllowed(mi)) {
>
>                              // Go to sleep and wait for the lock to be
>
>released
>                              // This is not one of the "home calls" so 
>we need to wait for the lock
>
>                              // Possible deadlock
>                              if (!waitingOnContext) {
>                                  Logger.debug("LOCKING-WAITING (CTX) 
>for id "+ctx.getId()+" ctx.hash "+ctx.hashCode());
>                                  waitingOnContext = true;
>                              }
>
>                              // Try your luck again
>                              ctx = null;
>                              continue;
>                              // Not allowed reentrant call
>                              //throw new RemoteException("Reentrant 
>call");
>                          }
>                          else
>                          {
>                              if (waitingOnContext) {
>                                  Logger.debug("FINISHED-LOCKING-WAITING
>
>(CTX) for id "+ctx.getId()+" ctx.hash "+ctx.hashCode());
>                                  waitingOnContext = false;
>                              }
>                              //We are in a home call so take the lock, 
>take it!
>                              ctx.lock();
>                          }
>                      }
>                  }
>              }
>              catch (InterruptedException ignored) {}
>              finally
>              {
>                  mutex.release();
>              }
>
>          } while (ctx == null);
>
>          // Set context on the method invocation
>          mi.setEnterpriseContext(ctx);
>
>          // Go on, you won
>          return getNext().invoke(mi);
>
>      }
>      catch (RemoteException e)
>      {
>          // Discard instance
>          // EJB 1.1 spec 12.3.1
>          cache.remove(key);
>
>          throw e;
>      } catch (RuntimeException e)
>      {
>          // Discard instance
>          // EJB 1.1 spec 12.3.1
>          cache.remove(key);
>
>          throw e;
>      } catch (Error e)
>      {
>          // Discard instance
>          // EJB 1.1 spec 12.3.1
>          cache.remove(key);
>
>          throw e;
>      } finally
>      {
>          // Logger.debug("Release instance for "+id);
>
>          // ctx can be null if cache.get throws an Exception, for
>          // example when activating a bean.
>          if (ctx != null)
>          {
>              try
>              {
>                  mutex.acquire();
>
>                  // unlock the context
>                  ctx.unlock();
>
>                  if (ctx.getId() == null)
>                  {
>
>                      // Work only if no transaction was encapsulating 
>this remove()
>                      if (ctx.getTransaction() == null)
>                      {
>                          // Here we arrive if the bean has been removed
>
>and no
>                          // transaction was associated with the remove,
>
>or if
>                          // the bean has been passivated
>
>                          // Remove from cache
>                          cache.remove(key);
>
>                          // It has been removed -> send to the pool
>                          container.getInstancePool().free(ctx);
>                      }
>                      else
>                      {
>                          // We want to remove the bean, but it has a Tx
>
>associated with
>                          // the remove() method. We remove it from the 
>cache, to avoid
>                          // that a successive insertion with same pk 
>will break the
>                          // cache. Anyway we don't free the context, 
>since the tx must
>                          // finish. The EnterpriseContext instance will
>
>be GC and not
>                          // recycled.
>                          cache.remove(key);
>                      }
>                  }
>                  else
>                  {
>                      // Yeah, do nothing
>                  }
>              }
>              catch (InterruptedException ignored) {}
>              finally
>              {
>                  mutex.release();
>              }
>          }
>      }
>  }


_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to