You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by Mahler Thomas <th...@itellium.com> on 2003/06/26 13:22:44 UTC

RE: PATCH for deadlocking issues with LoadedObjectsRegistry use o f WeakHashMap

Hi Galvin,

Joe already posted his patch. I'll review it in the next few days.
thanks for your help!

Thomas

> -----Original Message-----
> From: Galvin Hsiu [mailto:gkh4w@yahoo.com]
> Sent: Thursday, June 26, 2003 8:43 AM
> To: ojb-dev@db.apache.org
> Cc: jfe@pobox.com
> Subject: PATCH for deadlocking issues with 
> LoadedObjectsRegistry use of
> WeakHashMap
> 
> 
> Hi Thomas,
> 
> Both Joe Elliott and I did encounter this issue and
> investigated it at length by examining the source code
> to the WeakHashMap.  What we discovered was a resource
> contention issue in the WeakHashMap implementation on
> JDK 1.4.1_03 (not sure if this was fixed in the 
> previous JDK versions or versions after) - but
> whenever puts are getting called concurrently on the
> same WeakHashMap, the while loop in the put function
> call of the Map interface gets stuck since the said
> iterator is modified by another thread.  Let me know
> if you want further explanation and I will try to post
> up the said code snippet.
> 
> The patch is as follows - synchronize using the weak
> hash map on puts, remove and clears, but not on the
> gets. These critical sections will ensure only 1
> thread can modify this weak hash map at a time; I
> personally think the performance impact on this is
> minimal since the LoadedObjectRegistry seems to be
> utilized PRIMARILY (aka explicit lookups) for the
> frameworks utilizing the OTM layer (JDO, ODMG) as
> opposed to the PB layer, which we are using right now.
> Regardless, I'd rather trade a little performance hit
> as opposed to ballooning CPU usage / thrashing due to
> this interesting bug.
> 
> // BEGIN PATCHED FILE
> 
> package org.apache.ojb.broker.core;
> 
> /*
> ====================================================================
>  * The Apache Software License, Version 1.1
>  *
>  * Copyright (c) 2001 The Apache Software Foundation. 
> All rights
>  * reserved.
>  *
>  * Redistribution and use in source and binary forms,
> with or without
>  * modification, are permitted provided that the
> following conditions
>  * are met:
>  *
>  * 1. Redistributions of source code must retain the
> above copyright
>  *    notice, this list of conditions and the
> following disclaimer.
>  *
>  * 2. Redistributions in binary form must reproduce
> the above copyright
>  *    notice, this list of conditions and the
> following disclaimer in
>  *    the documentation and/or other materials
> provided with the
>  *    distribution.
>  *
>  * 3. The end-user documentation included with the
> redistribution,
>  *    if any, must include the following
> acknowledgment:
>  *       "This product includes software developed by
> the
>  *        Apache Software Foundation
> (http://www.apache.org/)."
>  *    Alternately, this acknowledgment may appear in
> the software itself,
>  *    if and wherever such third-party acknowledgments
> normally appear.
>  *
>  * 4. The names "Apache" and "Apache Software
> Foundation" and
>  *    "Apache ObjectRelationalBridge" must not be used
> to endorse or promote products
>  *    derived from this software without prior written
> permission. For
>  *    written permission, please contact
> apache@apache.org.
>  *
>  * 5. Products derived from this software may not be
> called "Apache",
>  *    "Apache ObjectRelationalBridge", nor may
> "Apache" appear in their name, without
>  *    prior written permission of the Apache Software
> Foundation.
>  *
>  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY
> EXPRESSED OR IMPLIED
>  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> IMPLIED WARRANTIES
>  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE ARE
>  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE
> FOUNDATION OR
>  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
> INDIRECT, INCIDENTAL,
>  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> (INCLUDING, BUT NOT
>  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> SERVICES; LOSS OF
>  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> HOWEVER CAUSED AND
>  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> STRICT LIABILITY,
>  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
> IN ANY WAY OUT
>  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> POSSIBILITY OF
>  * SUCH DAMAGE.
>  *
> ====================================================================
>  *
>  * This software consists of voluntary contributions
> made by many
>  * individuals on behalf of the Apache Software
> Foundation.  For more
>  * information on the Apache Software Foundation,
> please see
>  * <http://www.apache.org/>.
>  */
> 
> import java.util.WeakHashMap;
> 
> /**
>  * This is a helper class which registers all objects
> loaded
>  * from database. It is used by ODMG layer to
> determine the state of
>  * objects: if an object was not loaded from database
> then it is new.
>  * Note: objects remain registered even after they are
> deleted. This
>  * is necessary to prevent creation of deleted objects
> by another
>  * thread, see <a
> href="http://archives.apache.org/eyebrowse/ReadMsg?listId=106&
> msgNo=1382">this<a>
>  * for details.
>  *
>  * @author <a href="mailto:olegnitz@apache.org">Oleg
> Nitz<a>
>  * @version $Id: LoadedObjectsRegistry.java,v 1.1
> 2003/04/26 23:18:25 arminw Exp $
>  */
> public class LoadedObjectsRegistry
> {
>     private static WeakHashMap registry = new
> WeakHashMap();
> 
>     private static final Object DUMMY = new Object();
> 
>     public static void register(Object object)
>     {
>         // Patch: critical section on the put of the
> registry
>         synchronized(registry)
>         {
>         registry.put(object, DUMMY);
>         }
>     }
> 
>     public static boolean isRegistered(Object object)
>     {
>         return (registry.get(object) != null);
>     }
> 
>     public static void clear()
>     {
>         // Patch: critical section on the clear of the
> registry
>         synchronized(registry)
>         {
>         registry.clear();
>         }
>     }
> 
>     public static void remove(Object object)
>     {
>         if(object != null)
>         {
>         // Patch: critical section on the remove of
> the registry
>             synchronized(registry)
>             {
>             registry.remove(object);
>             }
>         }
>     }
> }
> 
> 
> 
> Hi Joseph,
> 
> To include your changes into the codebase please post
> your patch (or 
> patched files).
> YOu can post it as a zipped file either to the list or
> directly to me.
> Of course we want to get OJB free of such issues!
> 
> cheers,
> Thomas
> 
> Joseph Elliott wrote:
> > has anybody else encountered deadlocking issues
> under load with the ojb
> > library?  we started seeing frequent situations with
> pegged cpu usage and
> > stuck threads testing a large web application
> (running under tomcat on duel
> > cpu linux boxes)  a thread dump showed numerous
> threads all stuck in the
> > WeakHashMap.put's called from
> LoadedObjectsRegistry.java
> > 
> > adding synchronize blocks around the
> LoadedObjectsRegistry.java put and
> > clear calls has seemed to have stabilized things. 
> does any body have any
> > opinions about the performance impact of this and if
> there are any other
> > alternatives to making the system safe under highly
> concurrent usage?
> > 
> > we're currently working with a patched version of
> ojb for our application,
> > but it would be nice if this could be addressed in
> the official code base
> > for the next rc.
> > 
> > thanks much,
> >  - joe
> 
> 
> 
> 
> 
> __________________________________
> Do you Yahoo!?
> SBC Yahoo! DSL - Now only $29.95 per month!
> http://sbc.yahoo.com
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-dev-help@db.apache.org
> 
>