directory-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Emmanuel Lecharny (JIRA)" <>
Subject [jira] Commented: (DIRLDAP-71) CachingNormalizer exhibits concurrency flaw under load.
Date Sun, 20 Nov 2005 22:45:25 GMT
    [ ] 

Emmanuel Lecharny commented on DIRLDAP-71:

It seems that there is a double flaw in this piece of code :
1) The cache.get( value ) does a cache.containsKey itself. The code should be :

        Object result = cache.get( value ) ;
        if ( result != null )
            return result ;
2) The cache is an instance of LRUMap, which is not synchronized, and which relies on a not
synchronized HashMap. This LRUMap must be synchronized using Collection.synchronizedMap(...)

The containsKey method is not iterating over all keys, because the LRUMap is backed by a HashMap.

The Normalizer.normalize() will behave correctly when receiving a null value.

> CachingNormalizer exhibits concurrency flaw under load.
> -------------------------------------------------------
>          Key: DIRLDAP-71
>          URL:
>      Project: Directory LDAP
>         Type: Bug
>   Components: Common
>     Versions: 0.9.3
>     Reporter: Jacob S. Barrett
>  Attachments: CachingNormalizer-Concurrency.patch
> CachingNormalizer doesn't have it's cache protected from concurrent modifications.  Under
load a state is reached where cache.containsKey(key) is true but the result of cache.get(key)
results in an unexpected null value and thus a NullPointerException.  This is really only
reached when you have more than threads than the max cache size and therefore items in the
cache are being purged.  The attached path synchronizes the cache.  It would be better to
use a R/W lock from JSR 166 backport or something similar.

This message is automatically generated by JIRA.
If you think it was sent incorrectly contact one of the administrators:
For more information on JIRA, see:

View raw message