Thomas Watson created FELIX-5615:
------------------------------------
Summary: Global lock in BaseMethod.NotResolved::resolve method can
cause deadlock
Key: FELIX-5615
URL: https://issues.apache.org/jira/browse/FELIX-5615
Project: Felix
Issue Type: Bug
Components: Declarative Services (SCR)
Reporter: Thomas Watson
See eclipse bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=515215
org.apache.felix.scr.impl.inject.BaseMethod.NotResolved has a single instance
which is held by the static field NotResolved.INSTANCE
This means that the synchronized method NotResolved::resolve holds the global
lock on this NotResolved.INSTANCE object. It is unclear why this complete
method needs to be synchronized. But is is also unclear why it has to be a
global lock also. Is this by design? or a consequence of some refactoring that
made this method act on a global lock?
This is causing issues because while calling BaseMethod::findMethod reflection
is done which can then trigger additional class loads. These can then result
in lazy activation to be triggered. There is a whole set of deadlock
situations that could happen during lazy activation while this global lock is
being held.
I have not studied the code in detail, but it appears BaseMethod:findMethod is
stateless and it is unclear why we need to hold a lock between calls to
BaseMethod::findMethod and BaseMethod::setMethod (let alone a global lock).
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)