/* * 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.activemq.artemis.core.server.cluster.ha; import java.util.Map; import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration; import org.apache.activemq.artemis.core.server.NetworkHealthCheck; import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl; import org.apache.activemq.artemis.core.server.impl.LiveActivation; import org.apache.activemq.artemis.core.server.impl.SharedNothingLiveActivation; public class ReplicatedPolicy implements HAPolicy<LiveActivation> { private boolean checkForLiveServer = ActiveMQDefaultConfiguration.isDefaultCheckForLiveServer(); private String groupName = null; private String clusterName; private long initialReplicationSyncTimeout = ActiveMQDefaultConfiguration.getDefaultInitialReplicationSyncTimeout(); /* * these are only set by the ReplicaPolicy after failover to decide if the live server can failback, these should not * be exposed in configuration. * */ private boolean allowAutoFailBack = ActiveMQDefaultConfiguration.isDefaultAllowAutoFailback(); /* * whether or not this live broker should vote to remain live * */ private boolean voteOnReplicationFailure; /* * what quorum size to use for voting * */ private int quorumSize; /* * this are only used as the policy when the server is started as a live after a failover * */ private ReplicaPolicy replicaPolicy; private final NetworkHealthCheck networkHealthCheck; public ReplicatedPolicy(NetworkHealthCheck networkHealthCheck) { replicaPolicy = new ReplicaPolicy(networkHealthCheck, this); this.networkHealthCheck = networkHealthCheck; } public ReplicatedPolicy(boolean checkForLiveServer, String groupName, String clusterName, long initialReplicationSyncTimeout, NetworkHealthCheck networkHealthCheck, boolean voteOnReplicationFailure, int quorumSize) { this.checkForLiveServer = checkForLiveServer; this.groupName = groupName; this.clusterName = clusterName; this.initialReplicationSyncTimeout = initialReplicationSyncTimeout; this.networkHealthCheck = networkHealthCheck; this.voteOnReplicationFailure = voteOnReplicationFailure; this.quorumSize = quorumSize; } public ReplicatedPolicy(boolean checkForLiveServer, boolean allowAutoFailBack, long initialReplicationSyncTimeout, String groupName, String clusterName, ReplicaPolicy replicaPolicy, NetworkHealthCheck networkHealthCheck, boolean voteOnReplicationFailure, int quorumSize) { this.checkForLiveServer = checkForLiveServer; this.clusterName = clusterName; this.groupName = groupName; this.allowAutoFailBack = allowAutoFailBack; this.initialReplicationSyncTimeout = initialReplicationSyncTimeout; this.replicaPolicy = replicaPolicy; this.networkHealthCheck = networkHealthCheck; this.voteOnReplicationFailure = voteOnReplicationFailure; this.quorumSize = quorumSize; } public boolean isCheckForLiveServer() { return checkForLiveServer; } public void setCheckForLiveServer(boolean checkForLiveServer) { this.checkForLiveServer = checkForLiveServer; } public boolean isAllowAutoFailBack() { return allowAutoFailBack; } @Deprecated public long getFailbackDelay() { return -1; } @Deprecated public void setFailbackDelay(long failbackDelay) { } public long getInitialReplicationSyncTimeout() { return initialReplicationSyncTimeout; } public void setInitialReplicationSyncTimeout(long initialReplicationSyncTimeout) { this.initialReplicationSyncTimeout = initialReplicationSyncTimeout; } public String getClusterName() { return clusterName; } public void setClusterName(String clusterName) { this.clusterName = clusterName; } public ReplicaPolicy getReplicaPolicy() { if (replicaPolicy == null) { replicaPolicy = new ReplicaPolicy(networkHealthCheck, this); replicaPolicy.setQuorumSize(quorumSize); replicaPolicy.setVoteOnReplicationFailure(voteOnReplicationFailure); if (clusterName != null && clusterName.length() > 0) { replicaPolicy.setClusterName(clusterName); } if (groupName != null && groupName.length() > 0) { replicaPolicy.setGroupName(groupName); } } return replicaPolicy; } public void setReplicaPolicy(ReplicaPolicy replicaPolicy) { this.replicaPolicy = replicaPolicy; } /* * these 2 methods are the same, leaving both as the second is correct but the first is needed until more refactoring is done * */ @Override public String getBackupGroupName() { return groupName; } public String getGroupName() { return groupName; } @Override public String getScaleDownGroupName() { return null; } public void setGroupName(String groupName) { this.groupName = groupName; } @Override public boolean isSharedStore() { return false; } @Override public boolean isBackup() { return false; } @Override public boolean canScaleDown() { return false; } @Override public String getScaleDownClustername() { return null; } public void setAllowAutoFailBack(boolean allowAutoFailBack) { this.allowAutoFailBack = allowAutoFailBack; } public boolean isVoteOnReplicationFailure() { return voteOnReplicationFailure; } @Override public LiveActivation createActivation(ActiveMQServerImpl server, boolean wasLive, Map<String, Object> activationParams, ActiveMQServerImpl.ShutdownOnCriticalErrorListener shutdownOnCriticalIO) { return new SharedNothingLiveActivation(server, this); } public int getQuorumSize() { return quorumSize; } public void setQuorumSize(int quorumSize) { this.quorumSize = quorumSize; } }