Anil and I were hoping that adding line 4 below would remove the race, but it doesn't. CacheServer.isRunning() returns true as soon as AcceptorImpl is non-null which is still before ServerSocket.accept() has been invoked. The race still exists with this...
1: CacheServer cacheServer = getCache().addCacheServer(); 2: cacheServer.setPort(0); 3: cacheServer.start(); *4: await().atMost(1, MINUTES).until(() -> cacheServer.isRunning());* 5: return cacheServer.getPort(); I think we would have to change the implementation of CacheServer.isRunning() to check ServerSocket.isBound(): CacheServer.isRunning: public boolean isRunning() { return this.acceptor != null && this.acceptor.isRunning(); } AcceptorImpl.isRunning: public boolean isRunning() { return !this.shutdownStarted; } Would need to change to something like this: public boolean isRunning() { return !this.shutdownStarted *&& serverSock.isBound();* } Any opinions or alternatives? If I add "*&& serverSock.isBound();*" am I going to break isRunning? On Thu, May 3, 2018 at 9:33 AM, Kirk Lund <kl...@apache.org> wrote: > I have a test which starts a server and then starts a client. But the > client intermittently fails with NoSubscriptionServersAvailableException > (see full stack below). > > Seems like there must be something asynchronous in the startup of a > CacheServer that I need to wait for. Any ideas what I need to test for to > avoid NoSubscriptionServersAvailableException? > > org.apache.geode.internal.cache.InitializedDiskRegionWithIoExceptionRegressionTest > > cacheServerPersistWithIOExceptionShouldShutdown FAILED > org.apache.geode.test.dunit.RMIException: While invoking > org.apache.geode.internal.cache.InitializedDiskRegionWithIoExc > eptionRegressionTest$$Lambda$23/1222369873.run in VM 1 running on Host > 0b1780a0efc9 with 4 VMs > at org.apache.geode.test.dunit.VM.invoke(VM.java:436) > at org.apache.geode.test.dunit.VM.invoke(VM.java:405) > at org.apache.geode.test.dunit.VM.invoke(VM.java:348) > at org.apache.geode.internal.cache.InitializedDiskRegionWithIoExc > eptionRegressionTest.cacheServerPersistWithIOExceptionShouldShutdown( > InitializedDiskRegionWithIoExceptionRegressionTest.java:113) > > Caused by: > org.apache.geode.cache.NoSubscriptionServersAvailableException: > org.apache.geode.cache.NoSubscriptionServersAvailableException: Could not > initialize a primary queue on startup. No queue servers available. > at org.apache.geode.cache.client.internal.QueueManagerImpl. > getAllConnections(QueueManagerImpl.java:187) > at org.apache.geode.cache.client.internal.OpExecutorImpl. > executeOnQueuesAndReturnPrimaryResult(OpExecutorImpl.java:539) > at org.apache.geode.cache.client.internal.PoolImpl. > executeOnQueuesAndReturnPrimaryResult(PoolImpl.java:850) > at org.apache.geode.cache.client.internal.RegisterInterestOp. > execute(RegisterInterestOp.java:58) > at org.apache.geode.cache.client.internal.ServerRegionProxy. > registerInterest(ServerRegionProxy.java:356) > at org.apache.geode.internal.cache.LocalRegion.processSingleInterest( > LocalRegion.java:3749) > at org.apache.geode.internal.cache.LocalRegion. > registerInterest(LocalRegion.java:3840) > at org.apache.geode.internal.cache.LocalRegion. > registerInterest(LocalRegion.java:3638) > at org.apache.geode.internal.cache.LocalRegion. > registerInterest(LocalRegion.java:3633) > at org.apache.geode.internal.cache.LocalRegion. > registerInterest(LocalRegion.java:3628) > at org.apache.geode.internal.cache.InitializedDiskRegionWithIoExc > eptionRegressionTest.createClientCache(InitializedDiskRegionWithIoExc > eptionRegressionTest.java:172) > at org.apache.geode.internal.cache.InitializedDiskRegionWithIoExc > eptionRegressionTest.lambda$cacheServerPersistWithIOExcept > ionShouldShutdown$2c6907a2$1(InitializedDiskRegionWithIoExc > eptionRegressionTest.java:113) > > Caused by: > org.apache.geode.cache.NoSubscriptionServersAvailableException: Could not > initialize a primary queue on startup. No queue servers available. > at org.apache.geode.cache.client.internal.QueueManagerImpl. > initializeConnections(QueueManagerImpl.java:585) > at org.apache.geode.cache.client.internal.QueueManagerImpl. > start(QueueManagerImpl.java:296) > at org.apache.geode.cache.client.internal.PoolImpl.start( > PoolImpl.java:347) > at org.apache.geode.cache.client.internal.PoolImpl. > finishCreate(PoolImpl.java:172) > at org.apache.geode.cache.client.internal.PoolImpl.create( > PoolImpl.java:158) > at org.apache.geode.internal.cache.PoolFactoryImpl.create( > PoolFactoryImpl.java:346) > at org.apache.geode.internal.cache.InitializedDiskRegionWithIoExc > eptionRegressionTest.createClientCache(InitializedDiskRegionWithIoExc > eptionRegressionTest.java:164) > ... 1 more > >