You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/10/19 12:18:03 UTC

[iotdb] branch master updated: [IOTDB-4690] Add new configs for RatisConsensus (2.4.0)

This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new fd8ced4f07 [IOTDB-4690] Add new configs for RatisConsensus (2.4.0)
fd8ced4f07 is described below

commit fd8ced4f0714ae004eb16255dd24963f82ff682f
Author: William Song <48...@users.noreply.github.com>
AuthorDate: Wed Oct 19 20:17:57 2022 +0800

    [IOTDB-4690] Add new configs for RatisConsensus (2.4.0)
---
 .../resources/conf/iotdb-confignode.properties     |  9 ++++
 .../iotdb/confignode/conf/ConfigNodeConfig.java    | 50 ++++++++++++++++++++
 .../confignode/conf/ConfigNodeDescriptor.java      | 30 ++++++++++++
 .../iotdb/confignode/manager/ConsensusManager.java |  8 ++++
 .../iotdb/confignode/manager/node/NodeManager.java |  6 +++
 .../apache/iotdb/consensus/config/RatisConfig.java | 55 +++++++++++++++++++++-
 .../iotdb/consensus/ratis/RatisConsensus.java      |  2 -
 .../org/apache/iotdb/consensus/ratis/Utils.java    |  6 +++
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 38 +++++++++++++++
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |  6 +++
 .../db/consensus/DataRegionConsensusImpl.java      | 10 ++++
 .../db/consensus/SchemaRegionConsensusImpl.java    | 10 ++++
 .../src/main/thrift/confignode.thrift              |  6 +++
 13 files changed, 232 insertions(+), 4 deletions(-)

diff --git a/confignode/src/assembly/resources/conf/iotdb-confignode.properties b/confignode/src/assembly/resources/conf/iotdb-confignode.properties
index ceaf44cb7c..22d1906a65 100644
--- a/confignode/src/assembly/resources/conf/iotdb-confignode.properties
+++ b/confignode/src/assembly/resources/conf/iotdb-confignode.properties
@@ -392,6 +392,15 @@ target_config_nodes=127.0.0.1:22277
 # data_region_ratis_initial_sleep_time_ms = 100
 # data_region_ratis_max_sleep_time_ms = 10000
 
+# preserve certain logs when take snapshot and purge
+# partition_region_ratis_preserve_logs_num_when_purge = 1000
+# schema_region_ratis_preserve_logs_num_when_purge = 1000
+# data_region_ratis_preserve_logs_num_when_purge = 1000
+
+# first election timeout
+# ratis_first_election_timeout_min_ms = 50
+# ratis_first_election_timeout_max_ms = 150
+
 ####################
 ### Disk Monitor
 ####################
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfig.java b/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfig.java
index 23cb095567..9ebb791180 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfig.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfig.java
@@ -208,6 +208,14 @@ public class ConfigNodeConfig {
   private long schemaRegionRatisInitialSleepTimeMs = 100;
   private long schemaRegionRatisMaxSleepTimeMs = 10000;
 
+  private long partitionRegionRatisPreserveLogsWhenPurge = 1000;
+  private long schemaRegionRatisPreserveLogsWhenPurge = 1000;
+  private long dataRegionRatisPreserveLogsWhenPurge = 1000;
+
+  /* first election timeout shares between 3 regions */
+  private long ratisFirstElectionTimeoutMinMs = 50;
+  private long ratisFirstElectionTimeoutMaxMs = 150;
+
   public ConfigNodeConfig() {
     // empty constructor
   }
@@ -812,4 +820,46 @@ public class ConfigNodeConfig {
   public void setSchemaRegionRatisMaxSleepTimeMs(long schemaRegionRatisMaxSleepTimeMs) {
     this.schemaRegionRatisMaxSleepTimeMs = schemaRegionRatisMaxSleepTimeMs;
   }
+
+  public long getPartitionRegionRatisPreserveLogsWhenPurge() {
+    return partitionRegionRatisPreserveLogsWhenPurge;
+  }
+
+  public void setPartitionRegionRatisPreserveLogsWhenPurge(
+      long partitionRegionRatisPreserveLogsWhenPurge) {
+    this.partitionRegionRatisPreserveLogsWhenPurge = partitionRegionRatisPreserveLogsWhenPurge;
+  }
+
+  public long getSchemaRegionRatisPreserveLogsWhenPurge() {
+    return schemaRegionRatisPreserveLogsWhenPurge;
+  }
+
+  public void setSchemaRegionRatisPreserveLogsWhenPurge(
+      long schemaRegionRatisPreserveLogsWhenPurge) {
+    this.schemaRegionRatisPreserveLogsWhenPurge = schemaRegionRatisPreserveLogsWhenPurge;
+  }
+
+  public long getDataRegionRatisPreserveLogsWhenPurge() {
+    return dataRegionRatisPreserveLogsWhenPurge;
+  }
+
+  public void setDataRegionRatisPreserveLogsWhenPurge(long dataRegionRatisPreserveLogsWhenPurge) {
+    this.dataRegionRatisPreserveLogsWhenPurge = dataRegionRatisPreserveLogsWhenPurge;
+  }
+
+  public long getRatisFirstElectionTimeoutMinMs() {
+    return ratisFirstElectionTimeoutMinMs;
+  }
+
+  public void setRatisFirstElectionTimeoutMinMs(long ratisFirstElectionTimeoutMinMs) {
+    this.ratisFirstElectionTimeoutMinMs = ratisFirstElectionTimeoutMinMs;
+  }
+
+  public long getRatisFirstElectionTimeoutMaxMs() {
+    return ratisFirstElectionTimeoutMaxMs;
+  }
+
+  public void setRatisFirstElectionTimeoutMaxMs(long ratisFirstElectionTimeoutMaxMs) {
+    this.ratisFirstElectionTimeoutMaxMs = ratisFirstElectionTimeoutMaxMs;
+  }
 }
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java b/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
index c5c7d913a4..f2a57d462a 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
@@ -473,6 +473,36 @@ public class ConfigNodeDescriptor {
             properties.getProperty(
                 "schema_region_ratis_max_sleep_time_ms",
                 String.valueOf(conf.getSchemaRegionRatisMaxSleepTimeMs()))));
+
+    conf.setPartitionRegionRatisPreserveLogsWhenPurge(
+        Long.parseLong(
+            properties.getProperty(
+                "partition_region_ratis_preserve_logs_num_when_purge",
+                String.valueOf(conf.getPartitionRegionRatisPreserveLogsWhenPurge()))));
+
+    conf.setSchemaRegionRatisPreserveLogsWhenPurge(
+        Long.parseLong(
+            properties.getProperty(
+                "schema_region_ratis_preserve_logs_num_when_purge",
+                String.valueOf(conf.getSchemaRegionRatisPreserveLogsWhenPurge()))));
+
+    conf.setDataRegionRatisPreserveLogsWhenPurge(
+        Long.parseLong(
+            properties.getProperty(
+                "data_region_ratis_preserve_logs_num_when_purge",
+                String.valueOf(conf.getDataRegionRatisPreserveLogsWhenPurge()))));
+
+    conf.setRatisFirstElectionTimeoutMinMs(
+        Long.parseLong(
+            properties.getProperty(
+                "ratis_first_election_timeout_min_ms",
+                String.valueOf(conf.getRatisFirstElectionTimeoutMinMs()))));
+
+    conf.setRatisFirstElectionTimeoutMaxMs(
+        Long.parseLong(
+            properties.getProperty(
+                "ratis_first_election_timeout_max_ms",
+                String.valueOf(conf.getRatisFirstElectionTimeoutMaxMs()))));
   }
 
   /**
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConsensusManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConsensusManager.java
index 7b9979034a..bc266bd89e 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConsensusManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConsensusManager.java
@@ -129,6 +129,14 @@ public class ConsensusManager {
                                         TimeDuration.valueOf(
                                             CONF.getPartitionRegionRatisRequestTimeoutMs(),
                                             TimeUnit.MILLISECONDS))
+                                    .setFirstElectionTimeoutMin(
+                                        TimeDuration.valueOf(
+                                            CONF.getRatisFirstElectionTimeoutMinMs(),
+                                            TimeUnit.MILLISECONDS))
+                                    .setFirstElectionTimeoutMax(
+                                        TimeDuration.valueOf(
+                                            CONF.getRatisFirstElectionTimeoutMaxMs(),
+                                            TimeUnit.MILLISECONDS))
                                     .build())
                             .setRatisConsensus(
                                 RatisConfig.RatisConsensus.newBuilder()
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
index 6b36fa8035..7162762a87 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
@@ -197,6 +197,12 @@ public class NodeManager {
     ratisConfig.setSchemaInitialSleepTime(conf.getSchemaRegionRatisInitialSleepTimeMs());
     ratisConfig.setSchemaMaxSleepTime(conf.getSchemaRegionRatisMaxSleepTimeMs());
 
+    ratisConfig.setSchemaPreserveWhenPurge(conf.getPartitionRegionRatisPreserveLogsWhenPurge());
+    ratisConfig.setDataPreserveWhenPurge(conf.getDataRegionRatisPreserveLogsWhenPurge());
+
+    ratisConfig.setFirstElectionTimeoutMin(conf.getRatisFirstElectionTimeoutMinMs());
+    ratisConfig.setFirstElectionTimeoutMax(conf.getRatisFirstElectionTimeoutMaxMs());
+
     dataSet.setRatisConfig(ratisConfig);
   }
 
diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/config/RatisConfig.java b/consensus/src/main/java/org/apache/iotdb/consensus/config/RatisConfig.java
index ef64563a4d..9677b82098 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/config/RatisConfig.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/config/RatisConfig.java
@@ -162,18 +162,24 @@ public class RatisConfig {
     private final TimeDuration requestTimeout;
     private final TimeDuration sleepTime;
     private final TimeDuration slownessTimeout;
+    private final TimeDuration firstElectionTimeoutMin;
+    private final TimeDuration firstElectionTimeoutMax;
 
     private Rpc(
         TimeDuration timeoutMin,
         TimeDuration timeoutMax,
         TimeDuration requestTimeout,
         TimeDuration sleepTime,
-        TimeDuration slownessTimeout) {
+        TimeDuration slownessTimeout,
+        TimeDuration firstElectionTimeoutMin,
+        TimeDuration firstElectionTimeoutMax) {
       this.timeoutMin = timeoutMin;
       this.timeoutMax = timeoutMax;
       this.requestTimeout = requestTimeout;
       this.sleepTime = sleepTime;
       this.slownessTimeout = slownessTimeout;
+      this.firstElectionTimeoutMin = firstElectionTimeoutMin;
+      this.firstElectionTimeoutMax = firstElectionTimeoutMax;
     }
 
     public TimeDuration getTimeoutMin() {
@@ -196,6 +202,14 @@ public class RatisConfig {
       return slownessTimeout;
     }
 
+    public TimeDuration getFirstElectionTimeoutMin() {
+      return firstElectionTimeoutMin;
+    }
+
+    public TimeDuration getFirstElectionTimeoutMax() {
+      return firstElectionTimeoutMax;
+    }
+
     public static Rpc.Builder newBuilder() {
       return new Rpc.Builder();
     }
@@ -207,8 +221,21 @@ public class RatisConfig {
       private TimeDuration sleepTime = TimeDuration.valueOf(1, TimeUnit.SECONDS);
       private TimeDuration slownessTimeout = TimeDuration.valueOf(10, TimeUnit.MINUTES);
 
+      private TimeDuration firstElectionTimeoutMin =
+          TimeDuration.valueOf(50, TimeUnit.MILLISECONDS);
+
+      private TimeDuration firstElectionTimeoutMax =
+          TimeDuration.valueOf(150, TimeUnit.MILLISECONDS);
+
       public Rpc build() {
-        return new Rpc(timeoutMin, timeoutMax, requestTimeout, sleepTime, slownessTimeout);
+        return new Rpc(
+            timeoutMin,
+            timeoutMax,
+            requestTimeout,
+            sleepTime,
+            slownessTimeout,
+            firstElectionTimeoutMin,
+            firstElectionTimeoutMax);
       }
 
       public Rpc.Builder setTimeoutMin(TimeDuration timeoutMin) {
@@ -235,6 +262,16 @@ public class RatisConfig {
         this.slownessTimeout = slownessTimeout;
         return this;
       }
+
+      public Rpc.Builder setFirstElectionTimeoutMax(TimeDuration firstElectionTimeoutMax) {
+        this.firstElectionTimeoutMax = firstElectionTimeoutMax;
+        return this;
+      }
+
+      public Rpc.Builder setFirstElectionTimeoutMin(TimeDuration firstElectionTimeoutMin) {
+        this.firstElectionTimeoutMin = firstElectionTimeoutMin;
+        return this;
+      }
     }
   }
 
@@ -454,6 +491,7 @@ public class RatisConfig {
     private final SizeInBytes queueByteLimit;
     private final int purgeGap;
     private final boolean purgeUptoSnapshotIndex;
+    private final long preserveNumsWhenPurge;
     private final SizeInBytes segmentSizeMax;
     private final int segmentCacheNumMax;
     private final SizeInBytes segmentCacheSizeMax;
@@ -468,6 +506,7 @@ public class RatisConfig {
         SizeInBytes queueByteLimit,
         int purgeGap,
         boolean purgeUptoSnapshotIndex,
+        long preserveNumsWhenPurge,
         SizeInBytes segmentSizeMax,
         int segmentCacheNumMax,
         SizeInBytes segmentCacheSizeMax,
@@ -480,6 +519,7 @@ public class RatisConfig {
       this.queueByteLimit = queueByteLimit;
       this.purgeGap = purgeGap;
       this.purgeUptoSnapshotIndex = purgeUptoSnapshotIndex;
+      this.preserveNumsWhenPurge = preserveNumsWhenPurge;
       this.segmentSizeMax = segmentSizeMax;
       this.segmentCacheNumMax = segmentCacheNumMax;
       this.segmentCacheSizeMax = segmentCacheSizeMax;
@@ -537,6 +577,10 @@ public class RatisConfig {
       return unsafeFlushEnabled;
     }
 
+    public long getPreserveNumsWhenPurge() {
+      return preserveNumsWhenPurge;
+    }
+
     public static Log.Builder newBuilder() {
       return new Log.Builder();
     }
@@ -547,6 +591,7 @@ public class RatisConfig {
       private SizeInBytes queueByteLimit = SizeInBytes.valueOf("64MB");
       private int purgeGap = 1024;
       private boolean purgeUptoSnapshotIndex = true;
+      private long preserveNumsWhenPurge = 1000;
       private SizeInBytes segmentSizeMax = SizeInBytes.valueOf("24MB");
       private int segmentCacheNumMax = 2;
       private SizeInBytes segmentCacheSizeMax = SizeInBytes.valueOf("200MB");
@@ -562,6 +607,7 @@ public class RatisConfig {
             queueByteLimit,
             purgeGap,
             purgeUptoSnapshotIndex,
+            preserveNumsWhenPurge,
             segmentSizeMax,
             segmentCacheNumMax,
             segmentCacheSizeMax,
@@ -596,6 +642,11 @@ public class RatisConfig {
         return this;
       }
 
+      public Log.Builder setPreserveNumsWhenPurge(long preserveNumsWhenPurge) {
+        this.preserveNumsWhenPurge = preserveNumsWhenPurge;
+        return this;
+      }
+
       public Log.Builder setSegmentSizeMax(SizeInBytes segmentSizeMax) {
         this.segmentSizeMax = segmentSizeMax;
         return this;
diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java
index f8191cdbfc..76479cd74c 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/RatisConsensus.java
@@ -123,8 +123,6 @@ class RatisConsensus implements IConsensus {
         Utils.fromNodeInfoAndPriorityToRaftPeer(
             config.getThisNodeId(), config.getThisNodeEndPoint(), DEFAULT_PRIORITY);
 
-    System.setProperty(
-        "org.apache.ratis.thirdparty.io.netty.allocator.useCacheForAllThreads", "false");
     RaftServerConfigKeys.setStorageDir(
         properties, Collections.singletonList(new File(config.getStorageDir())));
     GrpcConfigKeys.Server.setPort(properties, config.getThisNodeEndPoint().getPort());
diff --git a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/Utils.java b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/Utils.java
index f7d1cbb66a..455b763437 100644
--- a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/Utils.java
+++ b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/Utils.java
@@ -188,6 +188,10 @@ public class Utils {
     RaftServerConfigKeys.Rpc.setTimeoutMin(properties, config.getRpc().getTimeoutMin());
     RaftServerConfigKeys.Rpc.setTimeoutMax(properties, config.getRpc().getTimeoutMax());
     RaftServerConfigKeys.Rpc.setSleepTime(properties, config.getRpc().getSleepTime());
+    RaftServerConfigKeys.Rpc.setFirstElectionTimeoutMin(
+        properties, config.getRpc().getFirstElectionTimeoutMin());
+    RaftServerConfigKeys.Rpc.setFirstElectionTimeoutMax(
+        properties, config.getRpc().getFirstElectionTimeoutMax());
     RaftClientConfigKeys.Rpc.setRequestTimeout(properties, config.getRpc().getRequestTimeout());
 
     RaftServerConfigKeys.LeaderElection.setLeaderStepDownWaitTime(
@@ -222,6 +226,8 @@ public class Utils {
     RaftServerConfigKeys.Log.setPurgeGap(properties, config.getLog().getPurgeGap());
     RaftServerConfigKeys.Log.setPurgeUptoSnapshotIndex(
         properties, config.getLog().isPurgeUptoSnapshotIndex());
+    RaftServerConfigKeys.Log.setPurgePreservationLogNum(
+        properties, config.getLog().getPreserveNumsWhenPurge());
     RaftServerConfigKeys.Log.setSegmentSizeMax(properties, config.getLog().getSegmentSizeMax());
     RaftServerConfigKeys.Log.setSegmentCacheNumMax(
         properties, config.getLog().getSegmentCacheNumMax());
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 5df7d0ef19..ac75d8512a 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -1051,6 +1051,12 @@ public class IoTDBConfig {
   private long dataRatisConsensusMaxSleepTimeMs = 10000L;
   private long schemaRatisConsensusMaxSleepTimeMs = 10000L;
 
+  private long dataRatisConsensusPreserveWhenPurge = 1000L;
+  private long schemaRatisConsensusPreserveWhenPurge = 1000L;
+
+  private long ratisFirstElectionTimeoutMinMs = 50L;
+  private long ratisFirstElectionTimeoutMaxMs = 150L;
+
   IoTDBConfig() {}
 
   public float getUdfMemoryBudgetInMB() {
@@ -3525,4 +3531,36 @@ public class IoTDBConfig {
   public void setSchemaRatisConsensusMaxSleepTimeMs(long schemaRatisConsensusMaxSleepTimeMs) {
     this.schemaRatisConsensusMaxSleepTimeMs = schemaRatisConsensusMaxSleepTimeMs;
   }
+
+  public long getDataRatisConsensusPreserveWhenPurge() {
+    return dataRatisConsensusPreserveWhenPurge;
+  }
+
+  public void setDataRatisConsensusPreserveWhenPurge(long dataRatisConsensusPreserveWhenPurge) {
+    this.dataRatisConsensusPreserveWhenPurge = dataRatisConsensusPreserveWhenPurge;
+  }
+
+  public long getSchemaRatisConsensusPreserveWhenPurge() {
+    return schemaRatisConsensusPreserveWhenPurge;
+  }
+
+  public void setSchemaRatisConsensusPreserveWhenPurge(long schemaRatisConsensusPreserveWhenPurge) {
+    this.schemaRatisConsensusPreserveWhenPurge = schemaRatisConsensusPreserveWhenPurge;
+  }
+
+  public long getRatisFirstElectionTimeoutMinMs() {
+    return ratisFirstElectionTimeoutMinMs;
+  }
+
+  public void setRatisFirstElectionTimeoutMinMs(long ratisFirstElectionTimeoutMinMs) {
+    this.ratisFirstElectionTimeoutMinMs = ratisFirstElectionTimeoutMinMs;
+  }
+
+  public long getRatisFirstElectionTimeoutMaxMs() {
+    return ratisFirstElectionTimeoutMaxMs;
+  }
+
+  public void setRatisFirstElectionTimeoutMaxMs(long ratisFirstElectionTimeoutMaxMs) {
+    this.ratisFirstElectionTimeoutMaxMs = ratisFirstElectionTimeoutMaxMs;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index 2fc236ebfb..c17ea193c3 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -1974,6 +1974,12 @@ public class IoTDBDescriptor {
     conf.setSchemaRatisConsensusMaxRetryAttempts(ratisConfig.getSchemaMaxRetryAttempts());
     conf.setSchemaRatisConsensusInitialSleepTimeMs(ratisConfig.getSchemaInitialSleepTime());
     conf.setSchemaRatisConsensusMaxSleepTimeMs(ratisConfig.getSchemaMaxSleepTime());
+
+    conf.setDataRatisConsensusPreserveWhenPurge(ratisConfig.getDataPreserveWhenPurge());
+    conf.setSchemaRatisConsensusPreserveWhenPurge(ratisConfig.getSchemaPreserveWhenPurge());
+
+    conf.setRatisFirstElectionTimeoutMinMs(ratisConfig.getFirstElectionTimeoutMin());
+    conf.setRatisFirstElectionTimeoutMaxMs(ratisConfig.getFirstElectionTimeoutMax());
   }
 
   public void reclaimConsensusMemory() {
diff --git a/server/src/main/java/org/apache/iotdb/db/consensus/DataRegionConsensusImpl.java b/server/src/main/java/org/apache/iotdb/db/consensus/DataRegionConsensusImpl.java
index a4005c9081..1364c5ccd6 100644
--- a/server/src/main/java/org/apache/iotdb/db/consensus/DataRegionConsensusImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/consensus/DataRegionConsensusImpl.java
@@ -108,6 +108,8 @@ public class DataRegionConsensusImpl {
                                       .setSegmentSizeMax(
                                           SizeInBytes.valueOf(
                                               conf.getDataRatisConsensusLogSegmentSizeMax()))
+                                      .setPreserveNumsWhenPurge(
+                                          conf.getDataRatisConsensusPreserveWhenPurge())
                                       .build())
                               .setGrpc(
                                   RatisConfig.Grpc.newBuilder()
@@ -131,6 +133,14 @@ public class DataRegionConsensusImpl {
                                           TimeDuration.valueOf(
                                               conf.getDataRatisConsensusRequestTimeoutMs(),
                                               TimeUnit.MILLISECONDS))
+                                      .setFirstElectionTimeoutMin(
+                                          TimeDuration.valueOf(
+                                              conf.getRatisFirstElectionTimeoutMinMs(),
+                                              TimeUnit.MILLISECONDS))
+                                      .setFirstElectionTimeoutMax(
+                                          TimeDuration.valueOf(
+                                              conf.getRatisFirstElectionTimeoutMaxMs(),
+                                              TimeUnit.MILLISECONDS))
                                       .build())
                               .setLeaderLogAppender(
                                   RatisConfig.LeaderLogAppender.newBuilder()
diff --git a/server/src/main/java/org/apache/iotdb/db/consensus/SchemaRegionConsensusImpl.java b/server/src/main/java/org/apache/iotdb/db/consensus/SchemaRegionConsensusImpl.java
index 14703a6e72..59e9b066d3 100644
--- a/server/src/main/java/org/apache/iotdb/db/consensus/SchemaRegionConsensusImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/consensus/SchemaRegionConsensusImpl.java
@@ -76,6 +76,8 @@ public class SchemaRegionConsensusImpl {
                                       .setSegmentSizeMax(
                                           SizeInBytes.valueOf(
                                               conf.getSchemaRatisConsensusLogSegmentSizeMax()))
+                                      .setPreserveNumsWhenPurge(
+                                          conf.getSchemaRatisConsensusPreserveWhenPurge())
                                       .build())
                               .setGrpc(
                                   RatisConfig.Grpc.newBuilder()
@@ -99,6 +101,14 @@ public class SchemaRegionConsensusImpl {
                                           TimeDuration.valueOf(
                                               conf.getSchemaRatisConsensusRequestTimeoutMs(),
                                               TimeUnit.MILLISECONDS))
+                                      .setFirstElectionTimeoutMin(
+                                          TimeDuration.valueOf(
+                                              conf.getRatisFirstElectionTimeoutMinMs(),
+                                              TimeUnit.MILLISECONDS))
+                                      .setFirstElectionTimeoutMax(
+                                          TimeDuration.valueOf(
+                                              conf.getRatisFirstElectionTimeoutMaxMs(),
+                                              TimeUnit.MILLISECONDS))
                                       .build())
                               .setLeaderLogAppender(
                                   RatisConfig.LeaderLogAppender.newBuilder()
diff --git a/thrift-confignode/src/main/thrift/confignode.thrift b/thrift-confignode/src/main/thrift/confignode.thrift
index 6c87d06b5f..21591ddcab 100644
--- a/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/thrift-confignode/src/main/thrift/confignode.thrift
@@ -80,6 +80,12 @@ struct TRatisConfig {
   20: required i64 dataInitialSleepTime
   21: required i64 schemaMaxSleepTime
   22: required i64 dataMaxSleepTime
+
+  23: required i64 schemaPreserveWhenPurge
+  24: required i64 dataPreserveWhenPurge
+
+  25: required i64 firstElectionTimeoutMin
+  26: required i64 firstElectionTimeoutMax
 }
 
 struct TDataNodeRemoveReq {