Skip to content

Commit 2a4de14

Browse files
authored
HDDS-12772. Configure initial heartbeat and first election time for quicker MiniOzoneCluster startup (#8235)
1 parent 0f5b590 commit 2a4de14

File tree

14 files changed

+109
-5
lines changed

14 files changed

+109
-5
lines changed

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsConfigKeys.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,18 @@ public final class HddsConfigKeys {
2727
"hdds.heartbeat.interval";
2828
public static final String HDDS_HEARTBEAT_INTERVAL_DEFAULT =
2929
"30s";
30+
public static final String HDDS_INITIAL_HEARTBEAT_INTERVAL =
31+
"hdds.initial.heartbeat.interval";
32+
public static final String HDDS_INITIAL_HEARTBEAT_INTERVAL_DEFAULT =
33+
"2s";
3034
public static final String HDDS_RECON_HEARTBEAT_INTERVAL =
3135
"hdds.recon.heartbeat.interval";
3236
public static final String HDDS_RECON_HEARTBEAT_INTERVAL_DEFAULT =
3337
"60s";
38+
public static final String HDDS_RECON_INITIAL_HEARTBEAT_INTERVAL =
39+
"hdds.recon.initial.heartbeat.interval";
40+
public static final String HDDS_RECON_INITIAL_HEARTBEAT_INTERVAL_DEFAULT =
41+
"2s";
3442
public static final String HDDS_NODE_REPORT_INTERVAL =
3543
"hdds.node.report.interval";
3644
public static final String HDDS_NODE_REPORT_INTERVAL_DEFAULT =

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/ratis/RatisHelper.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.List;
3131
import java.util.Map;
3232
import java.util.UUID;
33+
import java.util.concurrent.TimeUnit;
3334
import java.util.function.BiFunction;
3435
import java.util.function.BooleanSupplier;
3536
import java.util.stream.Collectors;
@@ -66,6 +67,7 @@
6667
import org.apache.ratis.retry.RetryPolicy;
6768
import org.apache.ratis.rpc.RpcType;
6869
import org.apache.ratis.rpc.SupportedRpcType;
70+
import org.apache.ratis.server.RaftServerConfigKeys;
6971
import org.apache.ratis.thirdparty.com.google.protobuf.ByteString;
7072
import org.apache.ratis.thirdparty.io.netty.buffer.ByteBuf;
7173
import org.apache.ratis.util.JavaUtils;
@@ -645,4 +647,16 @@ public static int calculateAttempts(Duration pollInterval, Duration maxDuration)
645647
return (int) (max / interval);
646648
}
647649

650+
651+
public static void setFirstElectionTimeoutDuration(
652+
ConfigurationSource conf, RaftProperties properties, String configKey) {
653+
long firstElectionTimeout = conf.getTimeDuration(configKey, -1, TimeUnit.MILLISECONDS);
654+
if (firstElectionTimeout > 0) {
655+
RaftServerConfigKeys.Rpc.setFirstElectionTimeoutMin(
656+
properties, TimeDuration.valueOf(firstElectionTimeout, TimeUnit.MILLISECONDS));
657+
RaftServerConfigKeys.Rpc.setFirstElectionTimeoutMax(
658+
properties, TimeDuration.valueOf(firstElectionTimeout + 200, TimeUnit.MILLISECONDS));
659+
}
660+
}
661+
648662
}

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,10 @@ public final class ScmConfigKeys {
635635
public static final String HDDS_CONTAINER_RATIS_STATEMACHINE_WRITE_WAIT_INTERVAL
636636
= "hdds.container.ratis.statemachine.write.wait.interval";
637637
public static final long HDDS_CONTAINER_RATIS_STATEMACHINE_WRITE_WAIT_INTERVAL_NS_DEFAULT = 10 * 60 * 1000_000_000L;
638+
639+
public static final String OZONE_SCM_HA_RATIS_SERVER_RPC_FIRST_ELECTION_TIMEOUT
640+
= "ozone.scm.ha.raft.server.rpc.first-election.timeout";
641+
638642
/**
639643
* Never constructed.
640644
*/

hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,8 @@ public final class OzoneConfigKeys {
415415
ScmConfigKeys.HDDS_RATIS_SNAPSHOT_THRESHOLD_KEY;
416416
public static final long HDDS_RATIS_SNAPSHOT_THRESHOLD_DEFAULT =
417417
ScmConfigKeys.HDDS_RATIS_SNAPSHOT_THRESHOLD_DEFAULT;
418+
public static final String HDDS_RATIS_LEADER_FIRST_ELECTION_MINIMUM_TIMEOUT_DURATION_KEY =
419+
"hdds.ratis.leader.first.election.minimum.timeout.duration";
418420

419421
public static final String HDDS_DATANODE_PLUGINS_KEY =
420422
"hdds.datanode.plugins";

hadoop-hdds/common/src/main/resources/ozone-default.xml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,14 @@
347347
Default is 5s.
348348
</description>
349349
</property>
350+
<property>
351+
<name>hdds.ratis.leader.first.election.minimum.timeout.duration</name>
352+
<value/>
353+
<tag>OZONE, RATIS, MANAGEMENT</tag>
354+
<description>ratis Minimum timeout for the first election of a leader.
355+
If not configured, fallback to hdds.ratis.leader.election.minimum.timeout.duration.
356+
</description>
357+
</property>
350358
<property>
351359
<name>hdds.node.report.interval</name>
352360
<value>60000ms</value>
@@ -1154,6 +1162,14 @@
11541162
if the default value for this config is not used.
11551163
</description>
11561164
</property>
1165+
<property>
1166+
<name>hdds.initial.heartbeat.interval</name>
1167+
<value>2s</value>
1168+
<tag>OZONE, MANAGEMENT</tag>
1169+
<description>
1170+
Heartbeat interval used during Datanode initialization for SCM.
1171+
</description>
1172+
</property>
11571173
<property>
11581174
<name>hdds.recon.heartbeat.interval</name>
11591175
<value>60s</value>
@@ -1162,6 +1178,14 @@
11621178
The heartbeat interval from a Datanode to Recon.
11631179
</description>
11641180
</property>
1181+
<property>
1182+
<name>hdds.recon.initial.heartbeat.interval</name>
1183+
<value>60s</value>
1184+
<tag>OZONE, MANAGEMENT, RECON</tag>
1185+
<description>
1186+
Heartbeat interval used during Datanode initialization for Recon.
1187+
</description>
1188+
</property>
11651189
<property>
11661190
<name>ozone.scm.heartbeat.log.warn.interval.count</name>
11671191
<value>10</value>
@@ -3834,6 +3858,13 @@
38343858
election. Default is 1s.</description>
38353859
</property>
38363860
<property>
3861+
<name>ozone.scm.ha.raft.server.rpc.first-election.timeout</name>
3862+
<value/>
3863+
<tag>SCM, OZONE, HA, RATIS</tag>
3864+
<description>ratis timeout for the first election of a leader.
3865+
If not configured, fallback to ozone.scm.ha.ratis.leader.election.timeout.
3866+
</description>
3867+
</property><property>
38373868
<name>ozone.scm.ha.ratis.server.leaderelection.pre-vote</name>
38383869
<value>true</value>
38393870
<tag>SCM, OZONE, HA, RATIS</tag>

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/StateContext.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
package org.apache.hadoop.ozone.container.common.statemachine;
1919

2020
import static java.lang.Math.min;
21+
import static org.apache.hadoop.hdds.utils.HddsServerUtil.getInitialReconHeartbeatInterval;
2122
import static org.apache.hadoop.hdds.utils.HddsServerUtil.getLogWarnInterval;
2223
import static org.apache.hadoop.hdds.utils.HddsServerUtil.getReconHeartbeatInterval;
2324
import static org.apache.hadoop.hdds.utils.HddsServerUtil.getScmHeartbeatInterval;
25+
import static org.apache.hadoop.hdds.utils.HddsServerUtil.getScmInitialHeartbeatInterval;
2426

2527
import com.google.common.annotations.VisibleForTesting;
2628
import com.google.common.base.Preconditions;
@@ -149,9 +151,9 @@ public class StateContext {
149151
* real HB frequency after scm registration. With this method the
150152
* initial registration could be significant faster.
151153
*/
152-
private final AtomicLong heartbeatFrequency = new AtomicLong(2000);
154+
private final AtomicLong heartbeatFrequency;
153155

154-
private final AtomicLong reconHeartbeatFrequency = new AtomicLong(2000);
156+
private final AtomicLong reconHeartbeatFrequency;
155157

156158
private final int maxCommandQueueLimit;
157159

@@ -192,6 +194,8 @@ public StateContext(ConfigurationSource conf,
192194
fullReportTypeList = new ArrayList<>();
193195
type2Reports = new HashMap<>();
194196
this.threadNamePrefix = threadNamePrefix;
197+
heartbeatFrequency = new AtomicLong(getScmInitialHeartbeatInterval(conf));
198+
reconHeartbeatFrequency = new AtomicLong(getInitialReconHeartbeatInterval(conf));
195199
initReportTypeCollection();
196200
}
197201

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/XceiverServerRatis.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static org.apache.hadoop.ozone.OzoneConfigKeys.HDDS_CONTAINER_RATIS_LOG_APPENDER_QUEUE_NUM_ELEMENTS_DEFAULT;
2525
import static org.apache.hadoop.ozone.OzoneConfigKeys.HDDS_CONTAINER_RATIS_SEGMENT_SIZE_DEFAULT;
2626
import static org.apache.hadoop.ozone.OzoneConfigKeys.HDDS_CONTAINER_RATIS_SEGMENT_SIZE_KEY;
27+
import static org.apache.hadoop.ozone.OzoneConfigKeys.HDDS_RATIS_LEADER_FIRST_ELECTION_MINIMUM_TIMEOUT_DURATION_KEY;
2728
import static org.apache.ratis.util.Preconditions.assertTrue;
2829

2930
import com.google.common.annotations.VisibleForTesting;
@@ -387,6 +388,8 @@ private void setRatisLeaderElectionTimeout(RaftProperties properties) {
387388
leaderElectionMinTimeout.toLong(TimeUnit.MILLISECONDS) + 200;
388389
RaftServerConfigKeys.Rpc.setTimeoutMax(properties,
389390
TimeDuration.valueOf(leaderElectionMaxTimeout, TimeUnit.MILLISECONDS));
391+
RatisHelper.setFirstElectionTimeoutDuration(
392+
conf, properties, HDDS_RATIS_LEADER_FIRST_ELECTION_MINIMUM_TIMEOUT_DURATION_KEY);
390393
}
391394

392395
private void setTimeoutForRetryCache(RaftProperties properties) {

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/HddsServerUtil.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@
1919

2020
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_HEARTBEAT_INTERVAL;
2121
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_HEARTBEAT_INTERVAL_DEFAULT;
22+
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_INITIAL_HEARTBEAT_INTERVAL;
23+
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_INITIAL_HEARTBEAT_INTERVAL_DEFAULT;
2224
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_RECON_HEARTBEAT_INTERVAL;
2325
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_RECON_HEARTBEAT_INTERVAL_DEFAULT;
26+
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_RECON_INITIAL_HEARTBEAT_INTERVAL;
27+
import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_RECON_INITIAL_HEARTBEAT_INTERVAL_DEFAULT;
2428
import static org.apache.hadoop.hdds.HddsUtils.getHostNameFromConfigKeys;
2529
import static org.apache.hadoop.hdds.HddsUtils.getPortNumberFromConfigKeys;
2630
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_KEY;
@@ -266,6 +270,19 @@ public static long getScmHeartbeatInterval(ConfigurationSource conf) {
266270
HDDS_HEARTBEAT_INTERVAL_DEFAULT, TimeUnit.MILLISECONDS);
267271
}
268272

273+
274+
/**
275+
* Heartbeat Interval - Defines the initial heartbeat frequency from a datanode to
276+
* SCM.
277+
*
278+
* @param conf - Ozone Config
279+
* @return - HB interval in milli seconds.
280+
*/
281+
public static long getScmInitialHeartbeatInterval(ConfigurationSource conf) {
282+
return conf.getTimeDuration(HDDS_INITIAL_HEARTBEAT_INTERVAL,
283+
HDDS_INITIAL_HEARTBEAT_INTERVAL_DEFAULT, TimeUnit.MILLISECONDS);
284+
}
285+
269286
/**
270287
* Heartbeat Interval - Defines the heartbeat frequency from a datanode to
271288
* Recon.
@@ -278,6 +295,18 @@ public static long getReconHeartbeatInterval(ConfigurationSource conf) {
278295
HDDS_RECON_HEARTBEAT_INTERVAL_DEFAULT, TimeUnit.MILLISECONDS);
279296
}
280297

298+
/**
299+
* Heartbeat Interval - Defines the initial heartbeat frequency from a datanode to
300+
* Recon.
301+
*
302+
* @param conf - Ozone Config
303+
* @return - HB interval in milli seconds.
304+
*/
305+
public static long getInitialReconHeartbeatInterval(ConfigurationSource conf) {
306+
return conf.getTimeDuration(HDDS_RECON_INITIAL_HEARTBEAT_INTERVAL,
307+
HDDS_RECON_INITIAL_HEARTBEAT_INTERVAL_DEFAULT, TimeUnit.MILLISECONDS);
308+
}
309+
281310
/**
282311
* Get the Stale Node interval, which is used by SCM to flag a datanode as
283312
* stale, if the heartbeat from that node has been missing for this duration.

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/RatisUtil.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ private static void setRaftRpcProperties(final RaftProperties properties,
138138
OZONE_SCM_HA_RATIS_NODE_FAILURE_TIMEOUT_DEFAULT,
139139
TimeUnit.MILLISECONDS),
140140
TimeUnit.MILLISECONDS));
141+
RatisHelper.setFirstElectionTimeoutDuration(
142+
ozoneConf, properties, ScmConfigKeys.OZONE_SCM_HA_RATIS_SERVER_RPC_FIRST_ELECTION_TIMEOUT);
141143
}
142144

143145
/**

hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmHAFinalization.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public void init(OzoneConfiguration conf,
8888
configurator.setUpgradeFinalizationExecutor(executor);
8989

9090
conf.setInt(HDDS_SCM_INIT_DEFAULT_LAYOUT_VERSION, HDDSLayoutFeature.INITIAL_VERSION.layoutVersion());
91+
conf.set(ScmConfigKeys.OZONE_SCM_HA_RATIS_SERVER_RPC_FIRST_ELECTION_TIMEOUT, "5s");
9192

9293
MiniOzoneHAClusterImpl.Builder clusterBuilder = MiniOzoneCluster.newHABuilder(conf);
9394
clusterBuilder.setNumOfStorageContainerManagers(NUM_SCMS)

0 commit comments

Comments
 (0)