/*
* 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.Activation;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
import org.apache.activemq.artemis.core.server.impl.SharedNothingBackupActivation;
public class ReplicaPolicy extends BackupPolicy {
private String clusterName;
private int maxSavedReplicatedJournalsSize = ActiveMQDefaultConfiguration.getDefaultMaxSavedReplicatedJournalsSize();
private String groupName = null;
private boolean restartBackup = ActiveMQDefaultConfiguration.isDefaultRestartBackup();
//used if we create a replicated policy for when we become live.
private boolean allowFailback = ActiveMQDefaultConfiguration.isDefaultAllowAutoFailback();
private long initialReplicationSyncTimeout = ActiveMQDefaultConfiguration.getDefaultInitialReplicationSyncTimeout();
/*
* what quorum size to use for voting
* */
private int quorumSize;
/*
* whether or not this live broker should vote to remain live
* */
private boolean voteOnReplicationFailure;
private ReplicatedPolicy replicatedPolicy;
private final NetworkHealthCheck networkHealthCheck;
public ReplicaPolicy(final NetworkHealthCheck networkHealthCheck) {
this.networkHealthCheck = networkHealthCheck;
}
public ReplicaPolicy(final NetworkHealthCheck networkHealthCheck,
ReplicatedPolicy replicatedPolicy) {
this.networkHealthCheck = networkHealthCheck;
this.replicatedPolicy = replicatedPolicy;
}
public ReplicaPolicy(String clusterName,
int maxSavedReplicatedJournalsSize,
String groupName,
boolean restartBackup,
boolean allowFailback,
long initialReplicationSyncTimeout,
ScaleDownPolicy scaleDownPolicy,
NetworkHealthCheck networkHealthCheck,
boolean voteOnReplicationFailure,
int quorumSize) {
this.clusterName = clusterName;
this.maxSavedReplicatedJournalsSize = maxSavedReplicatedJournalsSize;
this.groupName = groupName;
this.restartBackup = restartBackup;
this.allowFailback = allowFailback;
this.initialReplicationSyncTimeout = initialReplicationSyncTimeout;
this.quorumSize = quorumSize;
this.scaleDownPolicy = scaleDownPolicy;
this.networkHealthCheck = networkHealthCheck;
this.voteOnReplicationFailure = voteOnReplicationFailure;
}
public ReplicaPolicy(String clusterName,
int maxSavedReplicatedJournalsSize,
String groupName,
ReplicatedPolicy replicatedPolicy,
NetworkHealthCheck networkHealthCheck) {
this.clusterName = clusterName;
this.maxSavedReplicatedJournalsSize = maxSavedReplicatedJournalsSize;
this.groupName = groupName;
this.replicatedPolicy = replicatedPolicy;
this.networkHealthCheck = networkHealthCheck;
}
public String getClusterName() {
return clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public int getMaxSavedReplicatedJournalsSize() {
return maxSavedReplicatedJournalsSize;
}
public void setMaxSavedReplicatedJournalsSize(int maxSavedReplicatedJournalsSize) {
this.maxSavedReplicatedJournalsSize = maxSavedReplicatedJournalsSize;
}
public ReplicatedPolicy getReplicatedPolicy() {
if (replicatedPolicy == null) {
replicatedPolicy = new ReplicatedPolicy(false, allowFailback, initialReplicationSyncTimeout, groupName, clusterName, this, networkHealthCheck, voteOnReplicationFailure, quorumSize);
}
return replicatedPolicy;
}
public void setReplicatedPolicy(ReplicatedPolicy replicatedPolicy) {
this.replicatedPolicy = replicatedPolicy;
}
/*
* 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;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
@Override
public boolean isRestartBackup() {
return restartBackup;
}
@Override
public void setRestartBackup(boolean restartBackup) {
this.restartBackup = restartBackup;
}
@Override
public boolean isSharedStore() {
return false;
}
@Override
public boolean canScaleDown() {
return scaleDownPolicy != null;
}
public boolean isAllowFailback() {
return allowFailback;
}
public void setAllowFailback(boolean allowFailback) {
this.allowFailback = allowFailback;
}
@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;
}
@Override
public Activation createActivation(ActiveMQServerImpl server,
boolean wasLive,
Map<String, Object> activationParams,
ActiveMQServerImpl.ShutdownOnCriticalErrorListener shutdownOnCriticalIO) throws Exception {
SharedNothingBackupActivation backupActivation = new SharedNothingBackupActivation(server, wasLive, activationParams, shutdownOnCriticalIO, this, networkHealthCheck);
backupActivation.init();
return backupActivation;
}
public void setQuorumSize(int quorumSize) {
this.quorumSize = quorumSize;
}
public int getQuorumSize() {
return quorumSize;
}
public void setVoteOnReplicationFailure(boolean voteOnReplicationFailure) {
this.voteOnReplicationFailure = voteOnReplicationFailure;
}
public boolean isVoteOnReplicationFailure() {
return voteOnReplicationFailure;
}
}