]
Dan Berindei commented on ISPN-9127:
------------------------------------
Rough plan: keep track of dependencies based on {{@Inject}} annotations, add an
{{@InjectLazy}} annotation for braking cycles, and change
{{GlobalInboundInvocationHandler}} to have per-cache invocation handlers register during
their startup instead of dispatching via the component registry.
Remote commands can access components before they are started
-------------------------------------------------------------
Key: ISPN-9127
URL:
https://issues.jboss.org/browse/ISPN-9127
Project: Infinispan
Issue Type: Bug
Components: Core
Affects Versions: 9.2.2.Final, 9.3.0.Alpha1
Reporter: Dan Berindei
Assignee: Dan Berindei
Labels: testsuite_stability
Fix For: 9.3.0.Beta1
{{PerCacheInboundInvocationHandler.handle()}} may be called before the component was
started, because {{GlobalInboundInvocationHandler}} fetches it from the component registry
without any checks. {{CommandsFactoryImpl.initializeReplicableCommand()}} doesn't wait
for the components that it injects into remote commands to be started, either.
This started causing random test failures in {{ConcurrentStartForkChannelTest}} after
ISPN-8515, which moved most initialization work from {{init()}} methods to {{start()}}
methods. Because {{StateProviderImpl}} starts after {{StateTransferManagerImpl}}, it's
possible for a node to receive a {{StateRequestCommand}} before {{StateProviderImpl}} has
initialized:
{noformat}
16:15:09,549 TRACE (remote-thread-Test-NodeB-p51957-t2:[org.infinispan.CONFIG])
[StateProviderImpl] Starting outbound transfer to node Test-NodeA for cache null, topology
id 2, segments {0-255}
16:15:09,551 WARN (remote-thread-Test-NodeB-p51957-t2:[])
[NonTotalOrderPerCacheInboundInvocationHandler] ISPN000071: Caught exception when handling
command StateRequestCommand{cache=org.infinispan.CONFIG, origin=Test-NodeA,
type=START_STATE_TRANSFER, topologyId=2, segments={0-255}}
java.lang.IllegalArgumentException: chunkSize must be greater than 0
at
org.infinispan.statetransfer.OutboundTransferTask.<init>(OutboundTransferTask.java:114)
~[classes/:?]
at
org.infinispan.statetransfer.StateProviderImpl.startOutboundTransfer(StateProviderImpl.java:273)
~[classes/:?]
at
org.infinispan.statetransfer.StateRequestCommand.invokeAsync(StateRequestCommand.java:101)
~[classes/:?]
at
org.infinispan.remoting.inboundhandler.BasePerCacheInboundInvocationHandler.invokeCommand(BasePerCacheInboundInvocationHandler.java:94)
~[classes/:?]
{noformat}