test to ensure map types in ProvidersRegistry
---------------------------------------------
Key: WINK-179
URL: https://issues.apache.org/jira/browse/WINK-179
Project: Wink
Issue Type: Wish
Components: Common
Reporter: Mike Rheinheimer
A question came up recently about the necessity for
ProvidersRegistry.MediaTypeMap to use type SimpleConcurrentMap since some lock
protection is already built into the ProvidersRegistry methods:
getContextResolver(), getMessageBodyReader(), or getMessageBodyWriter().
The question is, why not just use a normal HashMap instead of
SimpleConcurrentMap? It could be faster to avoid the extra locking, which
appears unnecessary here.
As it turns out, the extra locking is necessary. From Bryant:
"The reason why there are two protections is that the first protection is in
cases where the providers are dynamically added.
The second protection is for the cache itself which could be written to by two
different threads even if they both were getting a single MessageBodyReader
(i.e. a cache value may be dropped and then two threads come back later and try
to write a new cache value). Due to some weird HashMap properties, this can
blow up in weird ways."
So, my wish is to have a test that ensures the map type is appropriate and
remains appropriate. That way if someone comes along in the future and sees
the same issue, any change they make to the code will be caught in the unittest
and a careful reading the code comments and unittest would show why the
MediaTypeMap is using the types it uses.
The problem is, we need to inspect the instantiated providersCache object, and
there is currently no way to get to that object.
What's your opinion? Since this is a sensitive path, it needs to have a
unittest or two around it. Do we want to change the inner class and field
visibility just to make it testable? This is the easy way to test it; we can
make the MediaTypeMap inner class and providersCache object "protected", then
override the MediaTypeMap class in a test to implement a getProvidersCache
method so we can inspect the object (see attached patch).
I suppose the other way to test it is to build up a multi-threaded test that
dynamically add providers, the way Bryant mentioned. Sounds fun. :)
The attached patch is NOT FINAL. Please review and let's discuss. Consider it
merely a suggestion.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.