Francois Valdy created FELIX-3500:
-------------------------------------
Summary: InstanceManager concurrency issue: "A methodID cannot be
associated with a method from the POJO class"
Key: FELIX-3500
URL: https://issues.apache.org/jira/browse/FELIX-3500
Project: Felix
Issue Type: Bug
Components: iPOJO
Affects Versions: ipojo-core-1.8.2
Reporter: Francois Valdy
InstanceManager.getMethodByID(String) claims to be thread-safe (or not to
require synchronization) but is not.
It results in random messages "A methodID cannot be associated with a method
from the POJO class" (which were downgraded from ERROR to INFO), but has
unknown side effect bugs (as it returns null for valid methods when that
happens).
If 2 threads call this method with the same parameter:
- both won't find it in the cache (m_methods.get(methodId) == null)
- one will register it: !m_methods.containsValue(mets[i]) is true
- second thread will NOT register it (because the first one did, hence the
vamue is in the map), and will return null <-- bug
Other issues may occur from the fact that an HashMap (unsafe) is used without
synchronization, for instance a well-known infinite loop.
I think one fix (to keep the same method semantics) under J2SE 1.3 would be to:
- use Hashtable instead of HashMap (safe as the value is never null)
- replace the code within the loop by:
if (m_methods.containsValue(mets[i]))
{
method = (Method) m_methods.get(methodId);
if (method != null)
{
return method;
}
}
else if
(MethodMetadata.computeMethodId(mets[i]).equals(methodId))
{
// Store the new methodId
m_methods.put(methodId, mets[i]);
return mets[i];
}
However I'm not sure about the purpose of the containsValue check purpose
(which is also very expensive as it traverses the entire map).
Thanks.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira