title: Does Hazelcast support this 3 node network partition?
body: <p>I'm using hazelcast 3.11 and testing the following network situation.</p>
  
  <pre><code>  A
   / \
  B   C
  </code></pre>
  
  <p>Where A and B are connected in both directions, A and C are connected in both directions, and B and C are disconnected. Normally all the nodes are connected, so I programatically configure each IP for each node using the TcpIp config.</p>
  
  <p>When I introduce the network failure, node B suspects node C because it has not sent any heartbeats, then immediately after it suspects node A for reason "explicit suspicion".</p>
  
  <p>Node C suspects node B because it has not sent any heartbeats. It stays in the same cluster as node A.
  Is the "explicit suspicion" Hazelcast's way of creating 2 completely connected partitions instead of 1 that is not completely connected? Is there way to configure Hazelcast to have this type of network failure and keep A connected to both A and C?</p>
  
  <p>As a side note, I'm only interested in using the ReplicatedMap and distributed event APIs.</p>
  
  <p>Edit: The following code is run once on each of the 3 servers which are named A, B, and C. They are running once instance of hazelcast each.</p>
  
  <pre><code>public HazelcastInstance getHazelcastInstance() {
      Config config = new Config();
      config
          .getGroupConfig( )
          .setName( localFacility.getName() )
          .setPassword( clusterPassword );
  
      NetworkConfig networkConfig = config.getNetworkConfig();              
  
      //Disable multicast
      JoinConfig joinConfig = networkConfig.getJoin();
      joinConfig
          .getMulticastConfig()
          .setEnabled( false );
  
      // Interface config
      InterfacesConfig interfaceConfig = networkConfig.getInterfaces();
      IntraFacilityProperties intrafacilityProperties = facilityPropertiesUtil.getCurrentIntrafacilityProperties();
      String primaryHostname = intrafacilityProperties.getHostname();
      String secondaryHostname = intrafacilityProperties.getBackupHostname();
  
      try {
  
          InetAddress primaryIp = InetAddress.getByName( primaryHostname );
          InetAddress secondaryIp = InetAddress.getByName( secondaryHostname );
  
          // Specify which network interfaces to use based on the configured hostnames
          interfaceConfig
              .setEnabled( true )
              .addInterface( primaryIp.getHostAddress() )
              .addInterface( secondaryIp.getHostAddress() );
  
      } catch ( UnknownHostException e ) {
  
          if ( logger.isErrorEnabled() ) {
              logger.error( "Caught UnknownHostException", e );
          }
  
          throw new HazelcastInstantiationException( e.getMessage() );
      }
  
  
      //Enable the tcp ip config.
      TcpIpConfig ipConfig = joinConfig.getTcpIpConfig();
      ipConfig.setEnabled( true );
  
      try{ 
          // Loops through all servers regardless of which server this is.
          for( IntraFacilityProperties member : facilityPropertiesUtil.getIntraFacilityProperties() ) {
              ipConfig.addMember( InetAddress.getByName( member.getHostname() ).getHostAddress() );
              ipConfig.addMember( InetAddress.getByName( member.getBackupHostname() ).getHostAddress() );
          }
      } catch( UnknownHostException e ) {
          if ( logger.isErrorEnabled() ) {
              logger.error( "Caught UnknownHostException", e );
          }
  
          throw new HazelcastInstantiationException( e.getMessage() );
      }
  
      ReplicatedMapConfig repMapCfg = new ReplicatedMapConfig();
      repMapCfg.setName( "default" )
               .setMergePolicyConfig( new MergePolicyConfig()
               .setPolicy( "LatestAccessMergePolicy" ) );
      config.addReplicatedMapConfig( repMapCfg );
  
      config.setProperty( "hazelcast.heartbeat.failuredetector.type", "deadline" );
      config.setProperty( "hazelcast.heartbeat.interval.seconds", hzHeartbeatInterval );
      config.setProperty( "hazelcast.max.no.heartbeat.seconds", hzHeartbeatTimeout );
      config.setProperty( "hazelcast.merge.first.run.delay.seconds", hzMergeFirstDelay );
      config.setProperty( "hazelcast.merge.next.run.delay.seconds", hzMergeNextDelay );
      return Hazelcast.newHazelcastInstance( config );
  }
  </code></pre>