blob: 6fca0a038a343229c69f0e29c8ff4bbce4f46a48 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.distributed.internal.membership.gms;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.file.Path;
import org.apache.geode.GemFireConfigException;
import org.apache.geode.SystemConnectException;
import org.apache.geode.distributed.internal.DMStats;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.distributed.internal.DistributionException;
import org.apache.geode.distributed.internal.LocatorStats;
import org.apache.geode.distributed.internal.membership.DistributedMembershipListener;
import org.apache.geode.distributed.internal.membership.MemberAttributes;
import org.apache.geode.distributed.internal.membership.MemberServices;
import org.apache.geode.distributed.internal.membership.MembershipManager;
import org.apache.geode.distributed.internal.membership.NetMember;
import org.apache.geode.distributed.internal.membership.gms.interfaces.Authenticator;
import org.apache.geode.distributed.internal.membership.gms.locator.GMSLocator;
import org.apache.geode.internal.Version;
import org.apache.geode.internal.admin.remote.RemoteTransportConfig;
import org.apache.geode.internal.net.SocketCreator;
import org.apache.geode.internal.tcp.ConnectionException;
import org.apache.geode.security.GemFireSecurityException;
/**
* Create a new Member based on the given inputs.
*
* @see NetMember
*/
public class GMSMemberFactory implements MemberServices {
/**
* Return a new NetMember, possibly for a different host
*
* @param i the name of the host for the specified NetMember, the current host (hopefully) if
* there are any problems.
* @param splitBrainEnabled whether the member has this feature enabled
* @param canBeCoordinator whether the member can be membership coordinator
* @param p the membership port
* @param attr the MemberAttributes
* @return the new NetMember
*/
@Override
public NetMember newNetMember(InetAddress i, int p, boolean splitBrainEnabled,
boolean canBeCoordinator, MemberAttributes attr, short version) {
GMSMember result =
new GMSMember(attr, i, p, splitBrainEnabled, canBeCoordinator, version, 0, 0);
return result;
}
/**
* Return a new NetMember representing current host. This assumes that the member does not have
* network partition detection enabled and can be group coordinator
*
* @param i an InetAddress referring to the current host
* @param p the membership port being used
* @return the new NetMember
*/
@Override
public NetMember newNetMember(InetAddress i, int p) {
return new GMSMember(MemberAttributes.DEFAULT, i, p, false, true, Version.CURRENT_ORDINAL, 0,
0);
}
/**
* Return a new NetMember representing current host. This is used for testing, so we ignore
* host-name lookup localhost inetAddress
*
* @param s a String referring to a host - ignored
* @param p the membership port being used
* @return the new member
*/
@Override
public NetMember newNetMember(String s, int p) {
InetAddress inetAddr = null;
try {
inetAddr = SocketCreator.getLocalHost();
} catch (UnknownHostException e2) {
throw new RuntimeException("Unable to create an identifier for testing for " + s, e2);
}
return newNetMember(inetAddr, p);
}
@Override
public MembershipManager newMembershipManager(
final DistributedMembershipListener listener,
final RemoteTransportConfig transport, DMStats stats,
final Authenticator authenticator,
final DistributionConfig config) throws DistributionException {
Services services = new Services(listener, transport, stats, authenticator, config);
try {
services.init();
services.start();
} catch (ConnectionException e) {
throw new DistributionException(
"Unable to create membership manager",
e);
} catch (GemFireConfigException | SystemConnectException | GemFireSecurityException e) {
throw e;
} catch (RuntimeException e) {
Services.getLogger().error("Unexpected problem starting up membership services", e);
throw new SystemConnectException("Problem starting up membership services", e);
}
return (MembershipManager) services.getManager();
}
@Override
public NetLocator newLocatorHandler(InetAddress bindAddress, String locatorString,
boolean usePreferredCoordinators, boolean networkPartitionDetectionEnabled,
LocatorStats stats, String securityUDPDHAlgo, Path workingDirectory) {
return new GMSLocator(bindAddress, locatorString, usePreferredCoordinators,
networkPartitionDetectionEnabled, stats, securityUDPDHAlgo, workingDirectory);
}
}