blob: 8c7b926e504c0968720701768bd4253992f00d17 [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.je.rep.impl;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.StringTokenizer;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.config.BooleanConfigParam;
import com.sleepycat.je.config.ConfigParam;
import com.sleepycat.je.config.DurationConfigParam;
import com.sleepycat.je.config.EnvironmentParams;
import com.sleepycat.je.config.IntConfigParam;
import com.sleepycat.je.config.LongConfigParam;
import com.sleepycat.je.rep.NodeType;
import com.sleepycat.je.rep.ReplicationConfig;
import com.sleepycat.je.rep.ReplicationMutableConfig;
import com.sleepycat.je.rep.ReplicationNetworkConfig;
import com.sleepycat.je.rep.ReplicationSSLConfig;
import com.sleepycat.je.rep.util.DbResetRepGroup;
import com.sleepycat.je.rep.utilint.RepUtils;
import com.sleepycat.je.rep.utilint.net.SSLChannelFactory;
public class RepParams {
/*
* Note: all replicated parameters should start with
* EnvironmentParams.REP_PARAM_PREFIX, which is "je.rep.",
* see SR [#19080].
*/
/**
* @hidden
* Name of a java System property (boolean) which can be turned on in order
* to avoid input validation checks on node names. This is undocumented.
* <p>
* Generally users should not skip validation, because there are a few
* kinds of punctuation characters that would cause problems if they were
* allowed in node names. But in the past users might have inadvertantly
* created node names that do not conform to the new, stricter rules. In
* that case they would not be able to upgrade to the newer version of JE
* that now includes this checking.
* <p>
* This flag actually applies to the group name too. But for group names
* the new rules are actually less strict than they used to be, so there
* should be no problem.
*/
public static final String SKIP_NODENAME_VALIDATION =
"je.rep.skipNodenameValidation";
/**
* @hidden
* Name of a java System property (boolean) which can be turned on in order
* to avoid hostname resolution checks on helper host values.
* This is undocumented.
* <p>
* Generally users should not skip validation, because having valid helper
* hosts is an important path to let this node find the master in a
* replication group when its group membership db is not
* sufficient. Disabling the check should only be done in unusual cases,
* such as in the face of intermittent DNS failures. In that case, a
* hostname which seems to be invalid may actually be a transient problem,
* rather than a permanent configuration issue. Skipping the resolution
* check at config setting time may supply some degree of resilience in
* this unusual case.
*/
public static final String SKIP_HELPER_HOST_RESOLUTION =
"je.rep.skipHelperHostResolution";
/**
* A JE/HA configuration parameter describing an Identifier name.
*/
static public class IdentifierConfigParam extends ConfigParam {
private static final String DEBUG_NAME =
IdentifierConfigParam.class.getName();
public IdentifierConfigParam(String configName,
String defaultValue,
boolean mutable,
boolean forReplication) {
super(configName, defaultValue, mutable, forReplication);
}
@Override
public void validateValue(String value) {
if (Boolean.getBoolean(SKIP_NODENAME_VALIDATION)) {
return;
}
if ((value == null) || (value.length() == 0)) {
throw new IllegalArgumentException
(DEBUG_NAME + ": a value is required");
}
for (char c : value.toCharArray()) {
if (!isValid(c)) {
throw new IllegalArgumentException
(DEBUG_NAME + ": " + name + ", must consist of " +
"letters, digits, hyphen, underscore, period.");
}
}
}
private boolean isValid(char c) {
if (Character.isLetterOrDigit(c) ||
c == '-' ||
c == '_' ||
c == '.') {
return true;
}
return false;
}
}
/*
* Replication group-wide properties. These properties are candidates for
* consistency checking whenever there is a handshake between a master and
* replica.
*/
/** Names the Replication group. */
public static final ConfigParam GROUP_NAME =
new IdentifierConfigParam(ReplicationConfig.GROUP_NAME,
"DefaultGroup", // default
false, // mutable
true); // forReplication
/**
* @deprecated see {@link ReplicationConfig#REP_STREAM_TIMEOUT}
*/
public static final DurationConfigParam REP_STREAM_TIMEOUT =
new DurationConfigParam(ReplicationConfig.REP_STREAM_TIMEOUT,
null, // min
null, // max
"30 min", // default
false, // mutable
true);
/**
* MIN_RETAINED_VLSNS was never exposed in the public API, although we
* did ask several users to configure it in the past, so we shouldn't
* delete the param definition.
*
* @deprecated and no longer used as of JE 7.5. Reserved files are now
* retained based on available disk space -- see
* {@link EnvironmentConfig#MAX_DISK} and
* {@link EnvironmentConfig#FREE_DISK} should be used instead.
* However, this param is still used when some, but not all, nodes in a
* group have been upgraded to 7.5 or later.
*/
public static final IntConfigParam MIN_RETAINED_VLSNS =
new IntConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"minRetainedVLSNs",
0, // min
null, // max
0, // default
false, // mutable
true); // forReplication
/**
* Unpublished (for now at least) parameter describing the minimum size
* of the VLSNIndex as a number of VLSNs. Once the index grows to this
* size, it will not get smaller due to head truncation by the cleaner.
*
* <p>When a disk limit is violated we will have already deleted as many
* reserved files as possible. If space is made available and write
* operations can resume, we need to ensure that each node has a large
* enough VLSNIndex to perform syncup, etc.</p>
*
* <p>This limit is enforced on both master and replicas. It is
* particularly important on replicas because feeders will not prevent
* VLSN index head truncation.</p>
*/
public static final IntConfigParam MIN_VLSN_INDEX_SIZE =
new IntConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"minVLSNIndexSize",
0, // min
null, // max
1000, // default
false, // mutable
true); // forReplication
/**
* Can be used by tests to prevent the GlobalCBVLSN from being defunct,
* even when all nodes are DEFUNCT_JE_VERSION or higher.
*/
public static final BooleanConfigParam TEST_CBVLSN =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"testCBVLSN",
false, // default
false, // mutable
true);
/**
* @see ReplicationConfig#REPLICA_RECEIVE_BUFFER_SIZE
*/
public static final IntConfigParam REPLICA_RECEIVE_BUFFER_SIZE =
new IntConfigParam(ReplicationConfig.REPLICA_RECEIVE_BUFFER_SIZE,
0, // min
null, // max
1048576, // default
false, // mutable
true); // forReplication
/**
* The size of the message queue used for communication between the thread
* reading the replication stream and the thread doing the replay. The
* default buffer size has been chosen to hold 500 single operation
* transactions (the ln + commit record) assuming 1K sized LN record.
* <p>
* Larger values of buffer size may result in higher peak memory
* utilization, due to a larger number of LNs sitting in the queue. The
* size of the queue itself is unlikely to be an issue, since it's tiny
* relative to cache sizes. At 1000, 1kbyte LNs it raises the peak
* utilization by 1MB which for most apps is an insignificant rise in the
* peak.
*
* Note that the parameter is lazily mutable, that is, the change will take
* effect the next time the node transitions to a replica state.
*/
public static final IntConfigParam REPLICA_MESSAGE_QUEUE_SIZE =
new IntConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"replicaMessageQueueSize",
1, // min
null, // max
1000, // default
true, // mutable
true); // forReplication
/**
* The lock timeout for replay transactions.
*/
public static final DurationConfigParam REPLAY_TXN_LOCK_TIMEOUT =
new DurationConfigParam(ReplicationConfig.REPLAY_TXN_LOCK_TIMEOUT,
"1 ms", // min
"75 min", // max
"500 ms", // default
false, // mutable
true); // forReplication
/**
* @see ReplicationConfig#ENV_SETUP_TIMEOUT
*/
public static final DurationConfigParam ENV_SETUP_TIMEOUT =
new DurationConfigParam
(ReplicationConfig.ENV_SETUP_TIMEOUT,
null, // min
null, // max
"10 h", // default 10 hrs
false, // mutable
true);
/**
* @see ReplicationConfig#ENV_CONSISTENCY_TIMEOUT
*/
public static final DurationConfigParam
ENV_CONSISTENCY_TIMEOUT =
new DurationConfigParam(ReplicationConfig.ENV_CONSISTENCY_TIMEOUT,
"10 ms", // min
null, // max
"5 min", // default
false, // mutable
true);
/**
* @see ReplicationConfig#ENV_UNKNOWN_STATE_TIMEOUT
*/
public static final DurationConfigParam ENV_UNKNOWN_STATE_TIMEOUT =
new DurationConfigParam
(ReplicationConfig.ENV_UNKNOWN_STATE_TIMEOUT,
null, // min
null, // max
"0 s", // default
false, // mutable
true);
/**
* @see ReplicationConfig#REPLICA_ACK_TIMEOUT
*/
public static final DurationConfigParam REPLICA_ACK_TIMEOUT =
new DurationConfigParam(ReplicationConfig.REPLICA_ACK_TIMEOUT,
"10 ms", // min
null, // max
"5 s", // default
false, // mutable
true); // forReplication
/**
* @see ReplicationConfig#INSUFFICIENT_REPLICAS_TIMEOUT
*/
public static final DurationConfigParam INSUFFICIENT_REPLICAS_TIMEOUT =
new DurationConfigParam(ReplicationConfig.INSUFFICIENT_REPLICAS_TIMEOUT,
"10 ms", // min
null, // max
"10 s", // default
false, // mutable
true); // forReplication
/**
* @hidden
* @see ReplicationConfig#ARBITER_ACK_TIMEOUT
*/
public static final DurationConfigParam ARBITER_ACK_TIMEOUT =
new DurationConfigParam(ReplicationConfig.ARBITER_ACK_TIMEOUT,
"10 ms", // min
null, // max
"2 s", // default
false, // mutable
true); // forReplication
/**
* Internal parameter enable use of the group ack message. It's on by
* default since protocol version 6.
*/
public static final BooleanConfigParam ENABLE_GROUP_ACKS =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"enableGroupAcks",
true, // default
false, // mutable
true);
/**
* The maximum message size which will be accepted by a node (to prevent
* DOS attacks). While the default shown here is 0, it dynamically
* calculated when the node is created and is set to the half of the
* environment cache size. The cache size is mutable, but changing the
* cache size at run time (after environment initialization) will not
* change the value of this parameter. If a value other than cache size /
* 2 is desired, this non-mutable parameter should be specified at
* initialization time.
*/
public static final LongConfigParam MAX_MESSAGE_SIZE =
new LongConfigParam(ReplicationConfig.MAX_MESSAGE_SIZE,
Long.valueOf(1 << 18), // min (256KB)
Long.valueOf(Long.MAX_VALUE), // max
Long.valueOf(0), // default (cachesize / 2)
false, // mutable
true); // forReplication
/**
* Identifies the default consistency policy used by a replica. Only two
* policies are meaningful as properties denoting environment level default
* policies: NoConsistencyRequiredPolicy and TimeConsistencyPolicy. They
* can be specified as: NoConsistencyRequiredPolicy or
* TimeConsistencyPolicy(<i>permissibleLag</i>,<i>timeout</i>). For
* example, a time based consistency policy with a lag of 1 second and a
* timeout of 1 hour is denoted by the string:
* TimeConsistencyPolicy(1000,3600000)
*/
public static final ConfigParam CONSISTENCY_POLICY =
new ConfigParam(ReplicationConfig.CONSISTENCY_POLICY,
// Default lag of 1 sec, and timeout of 1 hour
"TimeConsistencyPolicy(1 s,1 h)",
false, // mutable
true) { // for Replication
@Override
public void validateValue(String propertyValue)
throws IllegalArgumentException {
/* Evaluate for the checking side-effect. */
RepUtils.getReplicaConsistencyPolicy(propertyValue);
}
};
/* The ports used by a replication group */
/**
* The port used for replication.
*/
public static final IntConfigParam DEFAULT_PORT =
new IntConfigParam(ReplicationConfig.DEFAULT_PORT,
Integer.valueOf(1024), // min
Integer.valueOf(Short.MAX_VALUE), // max
Integer.valueOf(5001), // default
false, // mutable
true); // forReplication
/**
* Names the host (or interface) and port associated with the node in the
* replication group, e.g. je.rep.nodeHostPort=foo.com:5001
*/
public static final ConfigParam NODE_HOST_PORT =
new ConfigParam(ReplicationConfig.NODE_HOST_PORT,
"localhost", // default
false, // mutable
true) { // forReplication
@Override
public void validateValue(String hostAndPort)
throws IllegalArgumentException {
if ((hostAndPort == null) || (hostAndPort.length() == 0)) {
throw new IllegalArgumentException
("The value cannot be null or zero length: " + name);
}
int colonToken = hostAndPort.indexOf(":");
String hostName = (colonToken >= 0) ?
hostAndPort.substring(0, colonToken) :
hostAndPort;
ServerSocket testSocket = null;
try {
testSocket = new ServerSocket();
/* The bind will fail if the hostName does not name this m/c.*/
testSocket.bind(new InetSocketAddress(hostName, 0));
testSocket.close();
} catch (UnknownHostException e) {
throw new IllegalArgumentException
("Property: " + name +
" Invalid hostname: " + hostName, e);
} catch (IOException e) {
/*
* Server socket could not be bound to any port. Hostname is
* not associated with this m/c.
*/
throw new IllegalArgumentException
("Property: " + name +
" Invalid hostname: " + hostName, e);
}
if (colonToken >= 0) {
validatePort(hostAndPort.substring(colonToken + 1));
}
}
};
/*
* The Name uniquely identifies this node within the replication group.
*/
public static final ConfigParam NODE_NAME =
new IdentifierConfigParam(ReplicationConfig.NODE_NAME,
"DefaultRepNodeName",// default
false, // mutable
true); // forReplication
/*
* Identifies the type of the node.
*/
public static final EnumConfigParam<NodeType> NODE_TYPE =
new EnumConfigParam<>(ReplicationConfig.NODE_TYPE,
NodeType.ELECTABLE, // default
false, // mutable
true,
NodeType.class);
/*
* Associated a priority with this node. The priority is used during
* elections to favor one node over another. All other considerations being
* equal, the priority is used as a tie-breaker; the node with the higher
* priority is selected as the master.
*/
public static final IntConfigParam NODE_PRIORITY =
new IntConfigParam(ReplicationMutableConfig.NODE_PRIORITY,
Integer.valueOf(0), // min
Integer.valueOf(Integer.MAX_VALUE), // max
Integer.valueOf(1), // default
true, // mutable
true); // forReplication
/*
* Allow for Arbiter to provide Acks.
*/
public static final BooleanConfigParam ALLOW_ARBITER_ACK =
new BooleanConfigParam(ReplicationMutableConfig.ALLOW_ARBITER_ACK,
true, // default
true, // mutable
true);
public static final IntConfigParam ARBITER_OUTPUT_QUEUE_SIZE =
new IntConfigParam(ReplicationConfig.ARBITER_OUTPUT_QUEUE_SIZE,
Integer.valueOf(128), // min
null, // max
Integer.valueOf(4096), // default
false, // mutable
false); // forReplication
/*
* Identifies the Primary node in a two node group.
*/
public static final BooleanConfigParam DESIGNATED_PRIMARY =
new BooleanConfigParam(ReplicationMutableConfig.DESIGNATED_PRIMARY,
false, // default
true, // mutable
true);
/*
* An internal option used to control the use of Nagle's algorithm
* on feeder connections. A value of true disables use of Nagle's algorithm
* and causes output to be sent immediately without delay.
*/
public static final BooleanConfigParam FEEDER_TCP_NO_DELAY =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"feederTcpNoDelay",
true, // default
false, // mutable
true);
/**
* The time interval in nanoseconds during which records from a feeder may
* be batched before being written to the network.
*
* Larger values can result in fewer network packets and lower interrupt
* processing overheads. Since the grouping is only done when the feeder
* knows that the replica is not completely in sync, it's unlikely to have
* an adverse impact on overall throughput. Consequently this parameter is
* retained as an internal tuning knob.
*
* The HEARTBEAT_INTERVAL parameter serves as a ceiling on this time
* interval. Parameter values larger than HEARTBEAT_INTERVAL are truncated
* to HEARTBEAT_INTERVAL.
*/
public static final IntConfigParam FEEDER_BATCH_NS =
new IntConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"feederBatchNs",
Integer.valueOf(0), // min
Integer.valueOf(Integer.MAX_VALUE),// max
Integer.valueOf(1000000), // default 1 ms
true, // mutable
true); // forReplication
/**
* The size in KB used to batch outgoing feeder records. Upon overflow the
* existing buffer contents are written to the network and a new batch is
* initiated. The default value is 64K to take advantage of networks that
* support jumbo frames.
*/
public static final IntConfigParam FEEDER_BATCH_BUFF_KB =
new IntConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"feederBatchBuffKb",
Integer.valueOf(4), // min
Integer.valueOf(Integer.MAX_VALUE),// max
Integer.valueOf(64), // default 64K
true, // mutable
true); // forReplication
/**
* @see ReplicationMutableConfig#ELECTABLE_GROUP_SIZE_OVERRIDE
*/
public static final IntConfigParam ELECTABLE_GROUP_SIZE_OVERRIDE =
new IntConfigParam(ReplicationMutableConfig.
ELECTABLE_GROUP_SIZE_OVERRIDE,
Integer.valueOf(0), // min
Integer.valueOf(Integer.MAX_VALUE),// max
Integer.valueOf(0), // default
true, // mutable
true); // forReplication
/**
* An internal option, accessed only via the utility
* {@link DbResetRepGroup} utility, to reset a replication group to a
* single new member when the replicated environment is opened.
*/
public static final BooleanConfigParam RESET_REP_GROUP =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"resetRepGroup",
false, // default
false, // mutable
true);
/**
* An internal option, used with {@link #RESET_REP_GROUP}, that causes the
* reset of the replication group to retain the original group UUID and to
* not truncate the VLSN index. Use this option when converting a
* SECONDARY node to an ELECTABLE node when recovering a replication group.
*/
public static final BooleanConfigParam RESET_REP_GROUP_RETAIN_UUID =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"resetRepGroupRetainUUID",
false, // default
false, // mutable
true);
/**
* An internal option to allow converting an ELECTABLE node to a SECONDARY
* node by ignoring the electable node ID stored in the local rep group
* DB.
*/
public static final BooleanConfigParam IGNORE_SECONDARY_NODE_ID =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"ignoreSecondaryNodeId",
false, // default
false, // mutable
true);
/*
* Sets the maximum allowable skew between a Feeder and its replica. The
* clock skew is checked as part of the handshake when the Replica
* establishes a connection to its Feeder.
*/
public static final DurationConfigParam MAX_CLOCK_DELTA =
new DurationConfigParam(ReplicationConfig.MAX_CLOCK_DELTA,
null, // min
"1 min", // max
"2 s", // default
false, // mutable
true); // forReplication
/*
* The list of helper node and port pairs.
*/
public static final ConfigParam HELPER_HOSTS =
new ConfigParam(ReplicationConfig.HELPER_HOSTS,
"", // default
true, // mutable
true) { // forReplication
@Override
public void validateValue(String hostPortPairs)
throws IllegalArgumentException {
if ((hostPortPairs == null) || (hostPortPairs.length() == 0)) {
return;
}
HashSet<String> hostPortSet = new HashSet<>();
for (StringTokenizer tokenizer =
new StringTokenizer(hostPortPairs, ",");
tokenizer.hasMoreTokens();) {
try {
String hostPortPair = tokenizer.nextToken();
if (!hostPortSet.add(hostPortPair)) {
throw new IllegalArgumentException
("Property: " + name +
" Duplicate specification: " + hostPortPair);
}
validateHostAndPort(
hostPortPair,
Boolean.getBoolean(SKIP_HELPER_HOST_RESOLUTION));
} catch (IllegalArgumentException iae) {
throw new IllegalArgumentException
("Property: " + name + "Error: " + iae.getMessage(),
iae);
}
}
}
};
/* Heartbeat interval in milliseconds. */
public static final IntConfigParam HEARTBEAT_INTERVAL =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "heartbeatInterval",
Integer.valueOf(100), // min
null, // max
Integer.valueOf(1000),// default
false, // mutable
true); // forReplication
/*
* Security check interval in milliseconds. This parameter controls how
* frequently the feeder checks that stream consumers authenticated and
* authorized to stream the requested tables.
*/
public static final IntConfigParam SECURITY_CHECK_INTERVAL =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "securityCheckInterval",
Integer.valueOf(1), // min
null, // max
Integer.valueOf(1000),// default
false, // mutable
true); // forReplication
/* Replay Op Count after which we clear the DbTree cache. */
public static final IntConfigParam DBTREE_CACHE_CLEAR_COUNT =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "dbIdCacheOpCount",
Integer.valueOf(1), // min
null, // max
Integer.valueOf(5000), // default
false, // mutable
true); // forReplication
public static final IntConfigParam VLSN_STRIDE =
new IntConfigParam(EnvironmentParams.REP_PARAM_PREFIX + "vlsn.stride",
Integer.valueOf(1), // min
null, // max
Integer.valueOf(10), // default
false, // mutable
true); // forReplication
public static final IntConfigParam VLSN_MAX_MAP =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "vlsn.mappings",
Integer.valueOf(1), // min
null, // max
Integer.valueOf(1000), // default
false, // mutable
true); // forReplication
public static final IntConfigParam VLSN_MAX_DIST =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "vlsn.distance",
Integer.valueOf(1), // min
null, // max
Integer.valueOf(100000), // default
false, // mutable
true); // forReplication
/*
* Internal testing use only: Simulate a delay in the replica loop for test
* purposes. The value is the delay in milliseconds.
*/
public static final IntConfigParam TEST_REPLICA_DELAY =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "test.replicaDelay",
Integer.valueOf(0), // min
Integer.valueOf(Integer.MAX_VALUE), // max
Integer.valueOf(0), // default
false, // mutable
true); // forReplication
/*
* Sets the VLSNIndex cache holding recent log items in support of the
* feeders. The size must be a power of two.
*/
public static final IntConfigParam VLSN_LOG_CACHE_SIZE =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "vlsn.logCacheSize",
Integer.valueOf(0), // min
Integer.valueOf(1<<10), // max
Integer.valueOf(32), // default
false, // mutable
true); // forReplication
/*
* The socket timeout value used by a Replica when it opens a new
* connection to establish a replication stream with a feeder.
*/
public static final DurationConfigParam REPSTREAM_OPEN_TIMEOUT =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "repstreamOpenTimeout",
null, // min
"5 min", // max
"5 s", // default
false, // mutable
true); // forReplication
/*
* The socket timeout value used by Elections agents when they open
* sockets to communicate with each other using the Elections protocol.
*/
public static final DurationConfigParam ELECTIONS_OPEN_TIMEOUT =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "electionsOpenTimeout",
null, // min
"1 min", // max
"10 s", // default
false, // mutable
true); // forReplication
/*
* The maximum amount of time a Learner or Acceptor agent will wait for
* input on a network connection, while listening for a message before
* timing out. This timeout applies to the Elections protocol.
*/
public static final DurationConfigParam ELECTIONS_READ_TIMEOUT =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "electionsReadTimeout",
null, // min
"1 min", // max
"10 s", // default
false, // mutable
true); // forReplication
/**
* The master re-broadcasts the results of an election with this period.
*/
public static final DurationConfigParam
ELECTIONS_REBROADCAST_PERIOD =
new DurationConfigParam
(ReplicationConfig.ELECTIONS_REBROADCAST_PERIOD,
null, // min
null, // max
"1 min", // default
false, // mutable
true);
/**
* @see ReplicationConfig#ELECTIONS_PRIMARY_RETRIES
*/
public static final IntConfigParam ELECTIONS_PRIMARY_RETRIES =
new IntConfigParam(ReplicationConfig.ELECTIONS_PRIMARY_RETRIES,
0,
Integer.MAX_VALUE,
2,
false,
true);
/*
* Socket open timeout for use with the RepGroupProtocol.
*/
public static final DurationConfigParam REP_GROUP_OPEN_TIMEOUT =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "repGroupOpenTimeout",
null, // min
"1 min", // max
"10 s", // default
false, // mutable
true); // forReplication
/*
* Socket read timeout for use with the RepGroupProtocol.
*/
public static final DurationConfigParam REP_GROUP_READ_TIMEOUT =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "repGroupReadTimeout",
null, // min
"1 min", // max
"10 s", // default
false, // mutable
true); // forReplication
/*
* Socket open timeout for use with the Monitor Protocol.
*/
public static final DurationConfigParam MONITOR_OPEN_TIMEOUT =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "monitorOpenTimeout",
null, // min
"1 min", // max
"10 s", // default
false, // mutable
true); // forReplication
/*
* Socket read timeout for use with the MonitorProtocol.
*/
public static final DurationConfigParam MONITOR_READ_TIMEOUT =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "monitorReadTimeout",
null, // min
"1 min", // max
"10 s", // default
false, // mutable
true); // forReplication
/**
* @see ReplicationConfig#REPLICA_TIMEOUT
*/
public static final DurationConfigParam REPLICA_TIMEOUT =
new DurationConfigParam(ReplicationConfig.REPLICA_TIMEOUT,
"1 s", // min
null, // max
"30 s", // default
false, // mutable
true); // forReplication
/* @see ReplicationConfig#REPLAY_MAX_OPEN_DB_HANDLES */
public static final IntConfigParam REPLAY_MAX_OPEN_DB_HANDLES =
new IntConfigParam(ReplicationMutableConfig.REPLAY_MAX_OPEN_DB_HANDLES,
Integer.valueOf(1), // min
Integer.valueOf(Integer.MAX_VALUE), // max
Integer.valueOf(10), // default
true, // mutable
true); // forReplication
/* @see ReplicationConfig#REPLAY_DB_HANDLE_TIMEOUT */
public static final DurationConfigParam REPLAY_DB_HANDLE_TIMEOUT =
new DurationConfigParam(ReplicationConfig.REPLAY_DB_HANDLE_TIMEOUT,
"1 s", // min
null, // max
"30 s", // default
true, // mutable
true); // forReplication
/* @see ReplicationConfig#REPLICA_MAX_GROUP_COMMIT */
public static final IntConfigParam REPLICA_MAX_GROUP_COMMIT =
new IntConfigParam(ReplicationConfig.REPLICA_MAX_GROUP_COMMIT,
Integer.valueOf(0), // min
null, // max
Integer.valueOf(200), // default
false, // mutable
true); // forReplication
/* @see ReplicationConfig#REPLICA_GROUP_COMMIT_INTERVAL */
public static final DurationConfigParam REPLICA_GROUP_COMMIT_INTERVAL =
new DurationConfigParam(ReplicationConfig.REPLICA_GROUP_COMMIT_INTERVAL,
"0 ms", // min
null, // max
"3 ms", // default
false, // mutable
true); // forReplication
/**
* Used to force setting of SO_REUSEADDR to true on the HA server socket
* when it binds to its port.
*
* Note that the default is false, meaning that the socket has the
* system-specific default setting associated with it. We set it to true
* primarily in unit tests where the interacting HA processes are all on
* the same machine and use of this option is safe.
*
* This option is currently intended just for internal test use.
*/
public static final BooleanConfigParam SO_REUSEADDR =
new BooleanConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "soReuseAddr",
false, // default
false, // mutable
true);
/**
* This option was motivated by the BDA. The BDA uses IB for intra-rack
* node communications and 10gigE for inter-rack node communications. DNS
* is used to map the hostname to different IP addresses depending on
* whether the hostname was resolved from within the rack or outside it.
* The host thus gets HA traffic on both the IB and 10gigE interfaces and
* therefore needs to listen on both interfaces. It does so binding its
* socket using a wild card address when this option iks turned on.
*
* @see ReplicationConfig#BIND_INADDR_ANY
*/
public static final BooleanConfigParam BIND_INADDR_ANY =
new BooleanConfigParam
(ReplicationConfig.BIND_INADDR_ANY,
false, // default
false, // mutable
true);
/**
* Determines how long to wait for a bound socket to come free. This option
* can be useful when dealing with sockets in the TIME_WAIT state to come
* free so they can be reused. Attempts are made to retry binding to this
* period at intervals of 1 second until the port is bound successfully, or
* this wait period is exceeded.
*
* A value of zero means that there are no retries. It does not make sense
* to wait too much longer than the 2 min TIME_WAIT period, but we allow
* waiting as long as 2.5 min to account for race conditions.
*
* This option is currently intended just for internal test use.
*/
public static final IntConfigParam SO_BIND_WAIT_MS =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "retrySocketBind",
Integer.valueOf(0), // min
Integer.valueOf(150 * 1000), // max
Integer.valueOf(0), // default
false, // mutable
true);
/**
* Internal parameter used to determine the poll timeout used when
* accepting incoming feeder connections. This timeout also determines
* the frequency of various housekeeping tasks, e.g. detection of a
* master to replica change, etc.
*/
public static final DurationConfigParam FEEDER_MANAGER_POLL_TIMEOUT =
new DurationConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"feederManagerPollTimeout",
"100 ms", // min
null, // max
"1 s", // default
false, // mutable
true); // forReplication
/**
* @see ReplicationConfig#FEEDER_TIMEOUT
*/
public static final DurationConfigParam FEEDER_TIMEOUT =
new DurationConfigParam(ReplicationConfig.FEEDER_TIMEOUT,
"1 s", // min
null, // max
"30 s", // default
false, // mutable
true); // forReplication
/**
* Used to log an info message when a commit log record exceeds this
* time interval from the time it was created, to the time it was written
* out to the network.
*/
public static final DurationConfigParam TRANSFER_LOGGING_THRESHOLD =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "transferLoggingThreshold",
"1 ms", // min
null, // max
"5 s", // default
false, // mutable
true); // forReplication
/**
* Used to log an info message when the time taken to replay a single log
* entry at a replica exceeds this threshold.
*/
public static final DurationConfigParam REPLAY_LOGGING_THRESHOLD =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "replayLoggingThreshold",
"1 ms", // min
null, // max
"5 s", // default
false, // mutable
true); // forReplication
/**
* Changes the notion of an ack. When set to true, a replica is considered
* to have acknowledged a commit as soon as the feeder has written the
* commit record to the network. That is, it does not wait for the replica
* to actually acknowledge the commit via a return message. This permits
* the master to operate in a more async manner relative to the replica
* provide for higher throughput.
*
* This config parameter is internal.
*/
public static final BooleanConfigParam COMMIT_TO_NETWORK =
new BooleanConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "commitToNetwork",
false, // default
false, // mutable
true);
public static final DurationConfigParam PRE_HEARTBEAT_TIMEOUT =
new DurationConfigParam
(EnvironmentParams.REP_PARAM_PREFIX + "preHeartbeatTimeoutMs",
"1 s", // min
null, // max
"60 s", // default
false, // mutable
true);
/**
* Verifies that the port is a reasonable number. The port must be outside
* the range of "Well Known Ports" (zero through 1024).
*
* @param portString the string representing the port.
*/
private static void validatePort(String portString)
throws IllegalArgumentException {
try {
int port = Integer.parseInt(portString);
if ((port <= 0) || (port > 0xffff)) {
throw new IllegalArgumentException
("Invalid port number: " + portString);
}
if (port <= 1023) {
throw new IllegalArgumentException
("Port number " + port +
" is invalid because the port must be "+
"outside the range of \"well known\" ports");
}
} catch (NumberFormatException e) {
throw new IllegalArgumentException
("Invalid port number: " + portString);
}
}
/**
* Validates that the hostPort is a string of the form:
*
* hostName[:port]
*
* @param hostAndPort
* @param skipHostnameResolution if true, don't bother checking that the
* hostname resolves
* @throws IllegalArgumentException
*/
private static void validateHostAndPort(String hostAndPort,
boolean skipHostnameResolution)
throws IllegalArgumentException {
int colonToken = hostAndPort.indexOf(":");
String hostName = (colonToken >= 0) ?
hostAndPort.substring(0, colonToken) :
hostAndPort;
if ("".equals(hostName)) {
throw new IllegalArgumentException("missing hostname");
}
if (!skipHostnameResolution) {
try {
InetAddress.getByName(hostName);
} catch (UnknownHostException e) {
throw new IllegalArgumentException
("Invalid hostname: " + e.getMessage());
}
}
if (colonToken >= 0) {
validatePort(hostAndPort.substring(colonToken + 1));
}
}
/**
* @see ReplicationConfig#TXN_ROLLBACK_LIMIT
*/
public static final IntConfigParam TXN_ROLLBACK_LIMIT =
new IntConfigParam(ReplicationConfig.
TXN_ROLLBACK_LIMIT,
Integer.valueOf(0), // min
Integer.valueOf(Integer.MAX_VALUE),// max
Integer.valueOf(10), // default
false, // mutable
true); // forReplication
/**
* @see ReplicationConfig#TXN_ROLLBACK_DISABLED
*/
public static final BooleanConfigParam TXN_ROLLBACK_DISABLED =
new BooleanConfigParam(ReplicationConfig.TXN_ROLLBACK_DISABLED,
false, // default
false, // mutable
true); // forReplication
/**
* @see ReplicationConfig#ALLOW_UNKNOWN_STATE_ENV_OPEN
*/
@SuppressWarnings({ "javadoc", "deprecation" })
public static final BooleanConfigParam ALLOW_UNKNOWN_STATE_ENV_OPEN =
new BooleanConfigParam(ReplicationConfig.ALLOW_UNKNOWN_STATE_ENV_OPEN,
false, // default
false, // mutable
true);
/**
* If true, the replica runs with this property will not join the
* replication group.
*/
public static final BooleanConfigParam DONT_JOIN_REP_GROUP =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"dontJoinRepGroup",
false,
false,
true);
/**
* Internal parameter used by the Arbiter.
*/
public static final BooleanConfigParam ARBITER_USE =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"arbiterUse",
false,
false,
true);
/**
* Internal parameter used by the Subscriber.
*
* If true, the node is a replica that operates as a subscriber.
*/
public static final BooleanConfigParam SUBSCRIBER_USE =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"subscriberUse",
false,
false,
true);
/**
* Internal parameter used by network backups.
*
* If true, the node is used to support network backups and operates in
* read only mode, with various daemons disabled.
*
* TODO: would be nice to combine ARBITER_USE, SUBSCRIBER_USE and this into
* one concept.
*/
public static final BooleanConfigParam NETWORKBACKUP_USE =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"networkBackupUse",
false,
false,
true);
/**
* Internal parameter used by network backups.
*
* See 'Algorithm' in {@link com.sleepycat.je.rep.NetworkRestore}.
* Is currently 50k, which represents less than 1s of replay time.
*/
public static final IntConfigParam NETWORKBACKUP_MAX_LAG =
new IntConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"networkBackupMaxLag",
0, // min
null, // max
50 * 1000, // default
false, // mutable
true); // forReplication
/**
* Internal parameter to preserve record version (VLSN). Is immutable
* forever, i.e., it may not be changed after the environment has been
* created. It has the following impacts:
*
* . The VLSN is stored with the LN in the Btree and is available via the
* CursorImpl API.
* . The VLSN is included when migrating an LN during log cleaning.
*
* FUTURE: Expose this in ReplicationConfig and improve doc if we make
* record versions part of the public API.
*/
public static final BooleanConfigParam PRESERVE_RECORD_VERSION =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"preserveRecordVersion",
false, // default
false, // mutable
true); // forReplication
/**
* Whether to cache the VLSN in the BIN after the LN has been stripped by
* eviction, unless caching is explicitly disabled using the
* CACHE_RECORD_VERSION setting.
*
* This setting has no impact if PRESERVE_RECORD_VERSION is not also
* enabled.
*
* FUTURE: Expose this in ReplicationConfig and improve doc if we make
* record versions part of the public API.
*/
public static final BooleanConfigParam CACHE_RECORD_VERSION =
new BooleanConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"cacheRecordVersion",
true, // default
false, // mutable
true); // forReplication
/**
* @see ReplicationConfig#PROTOCOL_OLD_STRING_ENCODING
* TODO: Change default to false in JE 5.1.
*/
public static final BooleanConfigParam PROTOCOL_OLD_STRING_ENCODING =
new BooleanConfigParam(ReplicationConfig.PROTOCOL_OLD_STRING_ENCODING,
true, // default
false, // mutable
true); // forReplication
/**
* A JE/HA configuration parameter specifying a data channel type
*/
static public class ChannelTypeConfigParam extends ConfigParam {
public static final String BASIC = "basic";
public static final String SSL = "ssl";
public static final String CUSTOM = "custom";
private static final String DEBUG_NAME =
ChannelTypeConfigParam.class.getName();
public ChannelTypeConfigParam(String configName,
String defaultValue,
boolean mutable,
boolean forReplication) {
super(configName, defaultValue, mutable, forReplication);
}
@Override
public void validateValue(String value) {
if (value == null) {
throw new IllegalArgumentException
(DEBUG_NAME + ": a value is required");
}
if (!(BASIC.equals(value) ||
SSL.equals(value) ||
CUSTOM.equals(value))) {
throw new IllegalArgumentException
(DEBUG_NAME + ": " + value + " a not a valid value");
}
}
}
/**
* Replication data channel factory configuration
* @see ReplicationNetworkConfig#CHANNEL_TYPE
*/
public static final ConfigParam CHANNEL_TYPE =
new ChannelTypeConfigParam(
ReplicationNetworkConfig.CHANNEL_TYPE,
ChannelTypeConfigParam.BASIC, // default
false, // mutable
true); // forReplication
/**
* Replication data channel logging identifier.
* @see ReplicationNetworkConfig#CHANNEL_LOG_NAME
*/
public static final ConfigParam CHANNEL_LOG_NAME =
new ConfigParam(
ReplicationNetworkConfig.CHANNEL_LOG_NAME,
"", // default
false, // mutable
true); // forReplication
/**
* Data channel factory class
* @see ReplicationNetworkConfig#CHANNEL_FACTORY_CLASS
*/
public static final ConfigParam CHANNEL_FACTORY_CLASS =
new ConfigParam(ReplicationNetworkConfig.CHANNEL_FACTORY_CLASS,
"", // default
false, // mutable
true); // forReplication
/**
* Data channel factory parameters
* @see ReplicationNetworkConfig#CHANNEL_FACTORY_PARAMS
*/
public static final ConfigParam CHANNEL_FACTORY_PARAMS =
new ConfigParam(ReplicationNetworkConfig.CHANNEL_FACTORY_PARAMS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL KeyStore file
* @see ReplicationSSLConfig#SSL_KEYSTORE_FILE
*/
public static final ConfigParam SSL_KEYSTORE_FILE =
new ConfigParam(ReplicationSSLConfig.SSL_KEYSTORE_FILE,
"", // default
false, // mutable
true); // forReplication
/**
* SSL KeyStore password
* @see ReplicationSSLConfig#SSL_KEYSTORE_PASSWORD
*/
public static final ConfigParam SSL_KEYSTORE_PASSWORD =
new ConfigParam(ReplicationSSLConfig.SSL_KEYSTORE_PASSWORD,
"", // default
false, // mutable
true); // forReplication
/**
* SSL KeyStore password source class
* @see ReplicationSSLConfig#SSL_KEYSTORE_PASSWORD_CLASS
*/
public static final ConfigParam SSL_KEYSTORE_PASSWORD_CLASS =
new ConfigParam(ReplicationSSLConfig.SSL_KEYSTORE_PASSWORD_CLASS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL KeyStore password source constructor parameters
* @see ReplicationSSLConfig#SSL_KEYSTORE_PASSWORD_PARAMS
*/
public static final ConfigParam SSL_KEYSTORE_PASSWORD_PARAMS =
new ConfigParam(ReplicationSSLConfig.SSL_KEYSTORE_PASSWORD_PARAMS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL KeyStore type
* @see ReplicationSSLConfig#SSL_KEYSTORE_TYPE
*/
public static final ConfigParam SSL_KEYSTORE_TYPE =
new ConfigParam(ReplicationSSLConfig.SSL_KEYSTORE_TYPE,
"", // default
false, // mutable
true); // forReplication
/**
* SSL server key alias
* @see ReplicationSSLConfig#SSL_SERVER_KEY_ALIAS
*/
public static final ConfigParam SSL_SERVER_KEY_ALIAS =
new ConfigParam(ReplicationSSLConfig.SSL_SERVER_KEY_ALIAS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL client key alias
* @see ReplicationSSLConfig#SSL_CLIENT_KEY_ALIAS
*/
public static final ConfigParam SSL_CLIENT_KEY_ALIAS =
new ConfigParam(ReplicationSSLConfig.SSL_CLIENT_KEY_ALIAS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL TrustStore file
* @see ReplicationSSLConfig#SSL_TRUSTSTORE_FILE
*/
public static final ConfigParam SSL_TRUSTSTORE_FILE =
new ConfigParam(ReplicationSSLConfig.SSL_TRUSTSTORE_FILE,
"", // default
false, // mutable
true); // forReplication
/**
* SSL TrustStore type
* @see ReplicationSSLConfig#SSL_TRUSTSTORE_TYPE
*/
public static final ConfigParam SSL_TRUSTSTORE_TYPE =
new ConfigParam(ReplicationSSLConfig.SSL_TRUSTSTORE_TYPE,
"", // default
false, // mutable
true); // forReplication
/**
* SSL cipher suites
* @see ReplicationSSLConfig#SSL_CIPHER_SUITES
*/
public static final ConfigParam SSL_CIPHER_SUITES =
new ConfigParam(ReplicationSSLConfig.SSL_CIPHER_SUITES,
"", // default
false, // mutable
true); // forReplication
/**
* SSL protocols
* @see ReplicationSSLConfig#SSL_PROTOCOLS
*/
public static final ConfigParam SSL_PROTOCOLS =
new ConfigParam(ReplicationSSLConfig.SSL_PROTOCOLS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL Authenticator
* @see ReplicationSSLConfig#SSL_AUTHENTICATOR
*/
public static final ConfigParam SSL_AUTHENTICATOR =
new ConfigParam(ReplicationSSLConfig.SSL_AUTHENTICATOR,
"", // default
false, // mutable
true) { // forReplication
@Override
public void validateValue(String value) {
if (value == null) {
throw new IllegalArgumentException
("a value is required");
}
if (!SSLChannelFactory.isValidAuthenticator(value)) {
throw new IllegalArgumentException
(value + " a not a valid value");
}
}
};
/**
* SSL Authenticator class
* @see ReplicationSSLConfig#SSL_AUTHENTICATOR_CLASS
*/
public static final ConfigParam SSL_AUTHENTICATOR_CLASS =
new ConfigParam(ReplicationSSLConfig.SSL_AUTHENTICATOR_CLASS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL Authenticator parameters
* @see ReplicationSSLConfig#SSL_AUTHENTICATOR_PARAMS
*/
public static final ConfigParam SSL_AUTHENTICATOR_PARAMS =
new ConfigParam(ReplicationSSLConfig.SSL_AUTHENTICATOR_PARAMS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL Host Verifier
* @see ReplicationSSLConfig#SSL_HOST_VERIFIER
*/
public static final ConfigParam SSL_HOST_VERIFIER =
new ConfigParam(ReplicationSSLConfig.SSL_HOST_VERIFIER,
"", // default
false, // mutable
true) { // forReplication
@Override
public void validateValue(String value) {
if (value == null) {
throw new IllegalArgumentException
("a value is required");
}
if (!SSLChannelFactory.isValidHostVerifier(value)) {
throw new IllegalArgumentException
(value + " a not a valid value");
}
}
};
/**
* SSL Host Verifier class
* @see ReplicationSSLConfig#SSL_HOST_VERIFIER_CLASS
*/
public static final ConfigParam SSL_HOST_VERIFIER_CLASS =
new ConfigParam(ReplicationSSLConfig.SSL_HOST_VERIFIER_CLASS,
"", // default
false, // mutable
true); // forReplication
/**
* SSL Host Verifier parameters
* @see ReplicationSSLConfig#SSL_HOST_VERIFIER_PARAMS
*/
public static final ConfigParam SSL_HOST_VERIFIER_PARAMS =
new ConfigParam(ReplicationSSLConfig.SSL_HOST_VERIFIER_PARAMS,
"", // default
false, // mutable
true); // forReplication
/**
* Override the current JE version, for testing only.
*/
public static final ConfigParam TEST_JE_VERSION = new ConfigParam(
EnvironmentParams.REP_PARAM_PREFIX + "test.jeVersion",
"", // default
false, // mutable
true); // forReplication
/**
* @deprecated see {@link ReplicationConfig#REPLAY_COST_PERCENT}
*/
public static final IntConfigParam REPLAY_COST_PERCENT =
new IntConfigParam(ReplicationConfig.REPLAY_COST_PERCENT,
0, // min
1000, // max
150, // default
false, // mutable
true); // forReplication
/**
* @see ReplicationConfig#REPLAY_FREE_DISK_PERCENT
*/
public static final IntConfigParam REPLAY_FREE_DISK_PERCENT =
new IntConfigParam(ReplicationConfig.REPLAY_FREE_DISK_PERCENT,
0, // min
99, // max
0, // default
false, // mutable
true); // forReplication
/**
* The subscription queue poll interval.
*/
public static final DurationConfigParam SUBSCRIPTION_POLL_INTERVAL =
new DurationConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"subscriptionPollInterval",
"10 ms", // min
null, // max
"1 s", // default
false, // not mutable
true); // forReplication
/**
* The subscription queue poll timeout.
*/
public static final DurationConfigParam SUBSCRIPTION_POLL_TIMEOUT =
new DurationConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"subscriptionPollTimeout",
"100 ms", // min
null, // max
"30 s", // default
false, // not mutable
true); // forReplication
/**
* The maximum number of times to retry failed subscription connections.
*/
public static final IntConfigParam SUBSCRIPTION_MAX_CONNECT_RETRIES =
new IntConfigParam
(EnvironmentParams.REP_PARAM_PREFIX +
"subscriptionMaxConnectRetries",
Integer.valueOf(1), // min
null, // max
Integer.valueOf(3), // default
false, // not mutable
true); // forReplication
/**
* The amount of time that the subscription thread should sleep time before
* retrying a failed connection.
*/
public static final DurationConfigParam SUBSCRIPTION_SLEEP_BEFORE_RETRY =
new DurationConfigParam(EnvironmentParams.REP_PARAM_PREFIX +
"subscriptionSleepBeforeRetry",
"1 s", // min
null, // max
"3 s", // default
false, // not mutable
true); // forReplication
}