Val, When a bean is requested by type/class, which is how SpringResource injection is done, Spring walks through all *bean definitions* and tries to figure out a suitable bean by calling to getSingleton method and thus trying to acquire exactly the same lock. So, any bean could be the reason of this deadlock. That's why I think that's the best we can do to solve the problem without drastic changes in the code.
Kind regards, Alex. On Sat, Oct 21, 2017 at 2:14 AM, Valentin Kulichenko < valentin.kuliche...@gmail.com> wrote: > Alex, > > I tried to investigate this scenario and it looks it is reproduced only if: > - Injected bean is a singleton > - Injected bean is created *after* IgniteSpringBean > > Do you know if there is a way to verify that required singleton is already > created before injecting it, without acquiring the same global lock? If > yes, then I would do this and just throw an exception if bean is not ready, > explaining how to fix it (e.g. using 'depends-on' attribute). This way we > will not change current semantics and will avoid deadlocks. > > What do you think? > > -Val > > On Wed, Oct 18, 2017 at 12:57 PM, Alexander Fedotov < > alexander.fedot...@gmail.com> wrote: > > > Hi Val, > > > > SmartInitializingSingleton#afterSingletonsInstantiated is invoked right > at > > the end of the singleton pre-instantiation phase, *with a guarantee that > > all regular singleton beans have been created already*. > > This behavior allows avoiding the deadlock case described in the first > > message. > > InitializingBean#afterPropertiesSet method is called when a lock on the > > Spring's internal collection of singleton beans is being held (due to a > > singleton bean instantiation) > > and not all singleton beans have been initialized. > > > > With SmartInitializingSingleton approach it won't be possible to call > > Ignite instance methods inside any kind of init methods of other beans. > > For example, it won't be possible to call any operation on the Ignite > > instance inside @PostConstruct annotated methods because the Ignite > > instance won't be started by that time. > > > > Kind regards, > > Alex. > > > > On Wed, Oct 18, 2017 at 8:50 PM, Valentin Kulichenko < > > valentin.kuliche...@gmail.com> wrote: > > > > > Hi Alex, > > > > > > This indeed has to be fixed, I've seen this issue multiple times. > > > > > > Can you please clarify the difference between > SmartInitializingSingleton > > > and InitializingBean? And what exactly will not work if we switch? Can > > you > > > give an example? > > > > > > -Val > > > > > > On Wed, Oct 18, 2017 at 8:56 AM, Alexander Fedotov < > > > alexander.fedot...@gmail.com> wrote: > > > > > > > Hi Igniters, > > > > > > > > There is an issue that IgniteSpringBean deadlocks when there is > > > CacheStore, > > > > Service, you name it with @SpringResource annotated fields > > > > https://issues.apache.org/jira/browse/IGNITE-6555. The issue > appeared > > > > after > > > > moving the logic for starting statically configured caches to operate > > in > > > > the same way as for dynamic ones: from GridDhtPartitionsExchangeFutur > > e. > > > > Deadlock occurs because IgniteSpringBean having acquired internal > > Spring > > > > lock waits for a GridDhtPartitionsExchangeFuture which is executed > in > > a > > > > separate thread and which in turn tries to inject @SpringResource > > > annotated > > > > fields using the passed Spring application context what leads to an > > > attempt > > > > to acquire the same internal Spring lock that is already being held > by > > > the > > > > main thread. > > > > > > > > A possible solution is to remove IgniteSpringBean# > afterPropertiesSet, > > > make > > > > IgniteSpringBean implement SmartInitializingSingleton and start > Ignite > > > > instance inside afterSingletonsInstantiated. > > > > The only possible problem here is that an Ignite bean cannot be > > > > referenced from init-like methods: afterPropertiesSet, @PostConstruct > > > etc. > > > > > > > > Any thoughts? Suggestions? > > > > > > > > Kind regards, > > > > Alex. > > > > > > > > > >