private Address findMasterWithMulticast() {
   try {
     final String ip = System.getProperty("join.ip");
     if (ip == null) {
       JoinInfo joinInfo = node.createJoinInfo();
       for (; node.isActive() && currentTryCount.incrementAndGet() <= maxTryCount.get(); ) {
         joinInfo.setTryCount(currentTryCount.get());
         node.multicastService.send(joinInfo);
         if (node.getMasterAddress() == null) {
           //noinspection BusyWait
           Thread.sleep(10);
         } else {
           return node.getMasterAddress();
         }
       }
     } else {
       logger.log(Level.FINEST, "RETURNING join.ip");
       return new Address(ip, config.getNetworkConfig().getPort());
     }
   } catch (final Exception e) {
     if (logger != null) {
       logger.log(Level.WARNING, e.getMessage(), e);
     }
   } finally {
     this.currentTryCount.set(0);
   }
   return null;
 }
 public void onReceivedJoinInfo(JoinInfo joinInfo) {
   if (joinInfo.getTryCount() > this.currentTryCount.get() + 20) {
     int timeoutSeconds =
         (config.getNetworkConfig().getJoin().getMulticastConfig().getMulticastTimeoutSeconds()
                 + 4)
             * 100;
     this.maxTryCount.set(timeoutSeconds);
   }
 }
 public void searchForOtherClusters(SplitBrainHandler splitBrainHandler) {
   final BlockingQueue q = new LinkedBlockingQueue();
   MulticastListener listener =
       new MulticastListener() {
         public void onMessage(Object msg) {
           systemLogService.logJoin("MulticastListener onMessage " + msg);
           if (msg != null && msg instanceof JoinInfo) {
             JoinInfo joinInfo = (JoinInfo) msg;
             if (node.address != null && !node.address.equals(joinInfo.address)) {
               q.offer(msg);
             }
           }
         }
       };
   node.multicastService.addMulticastListener(listener);
   node.multicastService.send(node.createJoinInfo());
   systemLogService.logJoin("Sent multicast join request");
   try {
     JoinInfo joinInfo = (JoinInfo) q.poll(3, TimeUnit.SECONDS);
     if (joinInfo != null) {
       if (joinInfo.getMemberCount() == 1) {
         // if the other cluster has just single member, that may be a newly starting node
         // instead of a split node.
         // Wait 2 times 'WAIT_SECONDS_BEFORE_JOIN' seconds before processing merge JoinInfo.
         Thread.sleep(node.groupProperties.WAIT_SECONDS_BEFORE_JOIN.getInteger() * 1000L * 2);
       }
       if (shouldMerge(joinInfo)) {
         logger.log(
             Level.WARNING, node.address + " is merging [multicast] to " + joinInfo.address);
         targetAddress = joinInfo.address;
         node.clusterManager.sendClusterMergeToOthers(targetAddress);
         splitBrainHandler.restart();
         return;
       }
     }
   } catch (InterruptedException ignored) {
   } catch (Exception e) {
     if (logger != null) {
       logger.log(Level.WARNING, e.getMessage(), e);
     }
   } finally {
     node.multicastService.removeMulticastListener(listener);
   }
 }