Darrel Schneider created GEODE-6863:
---------------------------------------

             Summary: CI failure: A cache server's bind address is only 
available if it has been started
                 Key: GEODE-6863
                 URL: https://issues.apache.org/jira/browse/GEODE-6863
             Project: Geode
          Issue Type: Bug
          Components: core
            Reporter: Darrel Schneider


This looks like an existing issue that has a very small window of time in which 
it can fail.
It should not be hard to fix.
See: http://hydradb.gemfire.pivotal.io/hdb/testresult/5751289

I think the place to fix this is in 
org.apache.geode.internal.cache.BucketAdvisor.instantiateProfile(InternalDistributedMember,
 int)
It does a test if the server is running and then calls getExternalAddress 
twice. If the server is stopped after the isRunning check but before 
getExternalAddress is called then getExternalAddress will throw the 
IllegalStateException. The following "if" block could be put in a try/catch 
that catches IllegalStateException and ignores and skips that server if it is 
no longer running.
Another possible fix would be to call getExternalAddress(false) which does not 
throw IllegalStateException and then right before adding to serverLocations do 
a check that the server is running. Here is the code that needs to be fixed:

{code:java}
      for (CacheServer cacheServer : servers) {
        CacheServerImpl server = (CacheServerImpl) cacheServer;
        if (server.isRunning() && (server.getExternalAddress() != null)) {
          BucketServerLocation66 location = new 
BucketServerLocation66(getBucket().getId(),
              server.getPort(), server.getExternalAddress(), 
getBucket().isPrimary(),
              Integer.valueOf(version).byteValue(), server.getCombinedGroups());
          serverLocations.add(location);
        }
      }
{code}


{noformat}
Found suspect string in log4j at line 4995

    [error 2019/06/13 18:35:08.681 GMT <Pooled Waiting Message Processor 1> 
tid=62] A cache server's bind address is only available if it has been started
    java.lang.IllegalStateException: A cache server's bind address is only 
available if it has been started
      at 
org.apache.geode.internal.cache.CacheServerImpl.getExternalAddress(CacheServerImpl.java:435)
      at 
org.apache.geode.internal.cache.CacheServerImpl.getExternalAddress(CacheServerImpl.java:427)
      at 
org.apache.geode.internal.cache.BucketAdvisor.instantiateProfile(BucketAdvisor.java:1611)
      at 
org.apache.geode.distributed.internal.DistributionAdvisor.createProfile(DistributionAdvisor.java:1008)
      at 
org.apache.geode.internal.cache.BucketAdvisor.sendProfileUpdate(BucketAdvisor.java:1576)
      at 
org.apache.geode.internal.cache.BucketAdvisor.acquiredPrimaryLock(BucketAdvisor.java:1160)
      at 
org.apache.geode.internal.cache.BucketAdvisor.access$300(BucketAdvisor.java:77)
      at 
org.apache.geode.internal.cache.BucketAdvisor$VolunteeringDelegate.doVolunteerForPrimary(BucketAdvisor.java:2471)
      at 
org.apache.geode.internal.cache.BucketAdvisor$VolunteeringDelegate.lambda$consumeQueue$0(BucketAdvisor.java:2680)
      at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at 
org.apache.geode.distributed.internal.ClusterDistributionManager.runUntilShutdown(ClusterDistributionManager.java:959)
      at 
org.apache.geode.distributed.internal.ClusterDistributionManager.doWaitingThread(ClusterDistributionManager.java:849)
      at 
org.apache.geode.internal.logging.LoggingThreadFactory.lambda$newThread$0(LoggingThreadFactory.java:121)
      at java.lang.Thread.run(Thread.java:748)
{noformat}




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to