private AddressDefinition getPublicAddressByPortSearch() throws IOException { boolean bindAny = hazelcastProperties.getBoolean(GroupProperty.SOCKET_SERVER_BIND_ANY); AddressDefinition bindAddressDef = pickAddressDef(); int port = createServerSocketChannel(bindAddressDef.inetAddress, bindAddressDef.port, bindAny); bindAddress = createAddress(bindAddressDef, port); logger.info("Picked " + bindAddress + ", using socket " + getServerSocketChannel().socket() + ", bind any local is " + bindAny); return getPublicAddress(port); }
AddressDefinition pickMatchingAddress(Collection<InterfaceDefinition> interfaces) throws SocketException { Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); boolean preferIPv4Stack = preferIPv4Stack(); boolean preferIPv6Addresses = preferIPv6Addresses(); AddressDefinition matchingAddress = null; if (isEmpty(interfaces) && skipInterface(ni)) { continue; AddressDefinition address = getMatchingAddress(interfaces, inetAddress); if (address == null) { continue;
@Override public void pickAddress() throws Exception { if (publicAddress != null || bindAddress != null) { return; } try { AddressDefinition publicAddressDef = getPublicAddressByPortSearch(); if (publicAddressDef != null) { publicAddress = createAddress(publicAddressDef, publicAddressDef.port); logger.info("Using public address: " + publicAddress); } else { publicAddress = bindAddress; logger.finest("Using public address the same as the bind address: " + publicAddress); } } catch (Exception e) { ServerSocketChannel serverSocketChannel = getServerSocketChannel(); if (serverSocketChannel != null) { serverSocketChannel.close(); } logger.severe(e); throw e; } }
private AddressDefinition pickInterfaceAddressDef() throws UnknownHostException, SocketException { Collection<InterfaceDefinition> interfaces = getInterfaces(); if (interfaces.contains(new InterfaceDefinition("localhost", "127.0.0.1"))) { return pickLoopbackAddress("localhost"); } if (interfaces.contains(new InterfaceDefinition("127.0.0.1"))) { return pickLoopbackAddress(null); } logger.info("Prefer IPv4 stack is " + preferIPv4Stack() + ", prefer IPv6 addresses is " + preferIPv6Addresses()); if (interfaces.size() > 0) { AddressDefinition addressDef = pickMatchingAddress(interfaces); if (addressDef != null) { return addressDef; } } NetworkConfig networkConfig = config.getNetworkConfig(); if (networkConfig.getInterfaces().isEnabled()) { String msg = "Hazelcast CANNOT start on this node. No matching network interface found.\n" + "Interface matching must be either disabled or updated in the hazelcast.xml config file."; logger.severe(msg); throw new RuntimeException(msg); } if (networkConfig.getJoin().getTcpIpConfig().isEnabled()) { logger.warning("Could not find a matching address to start with! Picking one of non-loopback addresses."); } return pickMatchingAddress(null); }
private List<InterfaceDefinition> getInterfaces() { NetworkConfig networkConfig = config.getNetworkConfig(); TcpIpConfig tcpIpConfig = networkConfig.getJoin().getTcpIpConfig(); // address -> domain Map<String, String> addressDomainMap = createAddressToDomainMap(tcpIpConfig); // must preserve insertion order List<InterfaceDefinition> interfaceDefs = new ArrayList<InterfaceDefinition>(); if (networkConfig.getInterfaces().isEnabled()) { Collection<String> configInterfaces = networkConfig.getInterfaces().getInterfaces(); for (String configInterface : configInterfaces) { if (!AddressUtil.isIpAddress(configInterface)) { logger.warning("'" + configInterface + "' is not an IP address! Removing from interface list."); continue; } // add interfaces matching to members in TcpIpConfig appendMatchingInterfaces(interfaceDefs, addressDomainMap, configInterface); // add default interface definition interfaceDefs.add(new InterfaceDefinition(null, configInterface)); } logger.info("Interfaces is enabled, trying to pick one address matching to one of: " + interfaceDefs); } else if (tcpIpConfig.isEnabled()) { for (Entry<String, String> entry : addressDomainMap.entrySet()) { interfaceDefs.add(new InterfaceDefinition(entry.getValue(), entry.getKey())); } logger.info("Interfaces is disabled, trying to pick one address from TCP-IP config addresses: " + interfaceDefs); } return interfaceDefs; }
@Override public AddressPicker createAddressPicker(Node node) { Config config = node.getConfig(); MemberAddressProviderConfig memberAddressProviderConfig = config.getNetworkConfig().getMemberAddressProviderConfig(); final ILogger addressPickerLogger = node.getLogger(AddressPicker.class); if (!memberAddressProviderConfig.isEnabled()) { return new DefaultAddressPicker(config, addressPickerLogger); } MemberAddressProvider implementation = memberAddressProviderConfig.getImplementation(); if (implementation != null) { return new DelegatingAddressPicker(implementation, config.getNetworkConfig(), addressPickerLogger); } ClassLoader classLoader = config.getClassLoader(); String classname = memberAddressProviderConfig.getClassName(); Class<?> clazz = loadMemberAddressProviderClass(classLoader, classname); Constructor<?> constructor = findMemberAddressProviderConstructor(clazz); Properties properties = memberAddressProviderConfig.getProperties(); MemberAddressProvider memberAddressProvider = newMemberAddressProviderInstance(constructor, properties); return new DelegatingAddressPicker(memberAddressProvider, config.getNetworkConfig(), addressPickerLogger); }
private AddressDefinition pickInterfaceAddressDef() throws UnknownHostException, SocketException { Collection<InterfaceDefinition> interfaces = getInterfaces(); if (interfaces.contains(new InterfaceDefinition("localhost", "127.0.0.1"))) { return pickLoopbackAddress("localhost"); } if (interfaces.contains(new InterfaceDefinition("127.0.0.1"))) { return pickLoopbackAddress(null); } logger.info("Prefer IPv4 stack is " + preferIPv4Stack() + ", prefer IPv6 addresses is " + preferIPv6Addresses()); if (interfaces.size() > 0) { AddressDefinition addressDef = pickMatchingAddress(interfaces); if (addressDef != null) { return addressDef; } } NetworkConfig networkConfig = config.getNetworkConfig(); if (networkConfig.getInterfaces().isEnabled()) { String msg = "Hazelcast CANNOT start on this node. No matching network interface found.\n" + "Interface matching must be either disabled or updated in the hazelcast.xml config file."; logger.severe(msg); throw new RuntimeException(msg); } if (networkConfig.getJoin().getTcpIpConfig().isEnabled()) { logger.warning("Could not find a matching address to start with! Picking one of non-loopback addresses."); } return pickMatchingAddress(null); }
private List<InterfaceDefinition> getInterfaces() { NetworkConfig networkConfig = config.getNetworkConfig(); TcpIpConfig tcpIpConfig = networkConfig.getJoin().getTcpIpConfig(); // address -> domain Map<String, String> addressDomainMap = createAddressToDomainMap(tcpIpConfig); // must preserve insertion order List<InterfaceDefinition> interfaceDefs = new ArrayList<InterfaceDefinition>(); if (networkConfig.getInterfaces().isEnabled()) { Collection<String> configInterfaces = networkConfig.getInterfaces().getInterfaces(); for (String configInterface : configInterfaces) { if (!AddressUtil.isIpAddress(configInterface)) { logger.warning("'" + configInterface + "' is not an IP address! Removing from interface list."); continue; } // add interfaces matching to members in TcpIpConfig appendMatchingInterfaces(interfaceDefs, addressDomainMap, configInterface); // add default interface definition interfaceDefs.add(new InterfaceDefinition(null, configInterface)); } logger.info("Interfaces is enabled, trying to pick one address matching to one of: " + interfaceDefs); } else if (tcpIpConfig.isEnabled()) { for (Entry<String, String> entry : addressDomainMap.entrySet()) { interfaceDefs.add(new InterfaceDefinition(entry.getValue(), entry.getKey())); } logger.info("Interfaces is disabled, trying to pick one address from TCP-IP config addresses: " + interfaceDefs); } return interfaceDefs; }
@Override public AddressPicker createAddressPicker(Node node) { Config config = node.getConfig(); MemberAddressProviderConfig memberAddressProviderConfig = config.getNetworkConfig().getMemberAddressProviderConfig(); final ILogger addressPickerLogger = node.getLogger(AddressPicker.class); if (!memberAddressProviderConfig.isEnabled()) { return new DefaultAddressPicker(config, addressPickerLogger); } MemberAddressProvider implementation = memberAddressProviderConfig.getImplementation(); if (implementation != null) { return new DelegatingAddressPicker(implementation, config.getNetworkConfig(), addressPickerLogger); } ClassLoader classLoader = config.getClassLoader(); String classname = memberAddressProviderConfig.getClassName(); Class<? extends MemberAddressProvider> clazz = loadMemberAddressProviderClass(classLoader, classname); ILogger memberAddressProviderLogger = node.getLogger(clazz); Properties properties = memberAddressProviderConfig.getProperties(); MemberAddressProvider memberAddressProvider = newMemberAddressProviderInstance(clazz, memberAddressProviderLogger, properties); return new DelegatingAddressPicker(memberAddressProvider, config.getNetworkConfig(), addressPickerLogger); }
private AddressDefinition getPublicAddressByPortSearch() throws IOException { boolean bindAny = hazelcastProperties.getBoolean(GroupProperty.SOCKET_SERVER_BIND_ANY); AddressDefinition bindAddressDef = pickAddressDef(); int port = createServerSocketChannel(bindAddressDef.inetAddress, bindAddressDef.port, bindAny); bindAddress = createAddress(bindAddressDef, port); logger.info("Picked " + bindAddress + ", using socket " + getServerSocketChannel().socket() + ", bind any local is " + bindAny); return getPublicAddress(port); }
AddressDefinition pickMatchingAddress(Collection<InterfaceDefinition> interfaces) throws SocketException { Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); boolean preferIPv4Stack = preferIPv4Stack(); boolean preferIPv6Addresses = preferIPv6Addresses(); AddressDefinition matchingAddress = null; if (isEmpty(interfaces) && skipInterface(ni)) { continue; AddressDefinition address = getMatchingAddress(interfaces, inetAddress); if (address == null) { continue;
@Override public void pickAddress() throws Exception { if (publicAddress != null || bindAddress != null) { return; } try { AddressDefinition publicAddressDef = getPublicAddressByPortSearch(); if (publicAddressDef != null) { publicAddress = createAddress(publicAddressDef, publicAddressDef.port); logger.info("Using public address: " + publicAddress); } else { publicAddress = bindAddress; logger.finest("Using public address the same as the bind address: " + publicAddress); } } catch (Exception e) { ServerSocketChannel serverSocketChannel = getServerSocketChannel(); if (serverSocketChannel != null) { serverSocketChannel.close(); } logger.severe(e); throw e; } }