You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by ji...@apache.org on 2017/03/10 00:33:09 UTC

incubator-ratis git commit: RATIS-37. Change RaftServerConfigKeys to use SizeInBytes and TimeDuration. Contributed by Tsz Wo Nicholas Sze.

Repository: incubator-ratis
Updated Branches:
  refs/heads/master 615e76724 -> 6a755e66f


RATIS-37. Change RaftServerConfigKeys to use SizeInBytes and TimeDuration. Contributed by Tsz Wo Nicholas Sze.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ratis/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ratis/commit/6a755e66
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ratis/tree/6a755e66
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ratis/diff/6a755e66

Branch: refs/heads/master
Commit: 6a755e66f89a8e100403cb6af5eb08b9ead3c324
Parents: 615e767
Author: Jing Zhao <ji...@apache.org>
Authored: Thu Mar 9 16:33:02 2017 -0800
Committer: Jing Zhao <ji...@apache.org>
Committed: Thu Mar 9 16:33:02 2017 -0800

----------------------------------------------------------------------
 .../org/apache/ratis/util/TimeDuration.java     |   4 +
 .../java/org/apache/ratis/TestBatchAppend.java  |   9 +-
 .../org/apache/ratis/TestRestartRaftPeer.java   |   5 +-
 .../ratis/server/RaftServerConfigKeys.java      | 155 +++++++++----------
 .../apache/ratis/server/impl/LeaderState.java   |  13 +-
 .../apache/ratis/server/impl/LogAppender.java   |   9 +-
 .../ratis/server/impl/RaftServerImpl.java       |   5 +-
 .../apache/ratis/server/impl/ServerState.java   |   2 +-
 .../ratis/server/impl/StateMachineUpdater.java  |   4 +-
 .../ratis/server/storage/LogOutputStream.java   |   6 +-
 .../ratis/server/storage/RaftLogWorker.java     |   2 +-
 .../ratis/server/storage/RaftStorage.java       |   2 +-
 .../ratis/server/storage/SegmentedRaftLog.java  |   2 +-
 .../java/org/apache/ratis/MiniRaftCluster.java  |   8 +-
 .../java/org/apache/ratis/RaftTestUtil.java     |  26 ++--
 .../impl/RaftReconfigurationBaseTest.java       |   2 +-
 .../simulation/SimulatedRequestReply.java       |   7 +-
 .../TestNotLeaderExceptionWithSimulation.java   |   3 -
 .../server/storage/TestRaftLogReadWrite.java    |  12 +-
 .../server/storage/TestRaftLogSegment.java      |  39 +++--
 .../ratis/server/storage/TestRaftStorage.java   |   3 +-
 .../server/storage/TestSegmentedRaftLog.java    |  10 +-
 .../statemachine/RaftSnapshotBaseTest.java      |   4 +-
 .../ratis/statemachine/TestStateMachine.java    |   2 +-
 24 files changed, 160 insertions(+), 174 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java
----------------------------------------------------------------------
diff --git a/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java b/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java
index d57c115..8a3dc18 100644
--- a/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java
+++ b/ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java
@@ -111,6 +111,10 @@ public class TimeDuration implements Comparable<TimeDuration> {
     return targetUnit.convert(duration, unit);
   }
 
+  public int toInt(TimeUnit targetUnit) {
+    return Math.toIntExact(toLong(targetUnit));
+  }
+
   public boolean isNegative() {
     return duration < 0;
   }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-examples/src/test/java/org/apache/ratis/TestBatchAppend.java
----------------------------------------------------------------------
diff --git a/ratis-examples/src/test/java/org/apache/ratis/TestBatchAppend.java b/ratis-examples/src/test/java/org/apache/ratis/TestBatchAppend.java
index c9ee721..cc69984 100644
--- a/ratis-examples/src/test/java/org/apache/ratis/TestBatchAppend.java
+++ b/ratis-examples/src/test/java/org/apache/ratis/TestBatchAppend.java
@@ -21,6 +21,7 @@ import org.apache.log4j.Level;
 import org.apache.ratis.RaftTestUtil.SimpleMessage;
 import org.apache.ratis.client.RaftClient;
 import org.apache.ratis.conf.RaftProperties;
+import org.apache.ratis.util.SizeInBytes;
 import org.apache.ratis.examples.RaftExamplesTestUtil;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServerConfigKeys;
@@ -48,8 +49,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import static org.apache.ratis.server.RaftServerConfigKeys.KB;
-
 /**
  * Enable raft.server.log.appender.batch.enabled and test LogAppender
  */
@@ -67,11 +66,11 @@ public class TestBatchAppend {
     RaftProperties prop = new RaftProperties();
     prop.setClass(MiniRaftCluster.STATEMACHINE_CLASS_KEY,
         SimpleStateMachine4Testing.class, StateMachine.class);
-    RaftServerConfigKeys.Log.setSegmentSizeMax(prop::setLong, 8*KB);
+    RaftServerConfigKeys.Log.setSegmentSizeMax(prop, SizeInBytes.valueOf("8KB"));
     // enable batch appending
-    RaftServerConfigKeys.Log.Appender.setBatchEnabled(prop::setBoolean, true);
+    RaftServerConfigKeys.Log.Appender.setBatchEnabled(prop, true);
     // set batch appending buffer size to 4KB
-    RaftServerConfigKeys.Log.Appender.setBufferCapacity(prop::setInt, 4*KB);
+    RaftServerConfigKeys.Log.Appender.setBufferCapacity(prop, SizeInBytes.valueOf("4KB"));
 
     return RaftExamplesTestUtil.getMiniRaftClusters(prop, 3);
   }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-examples/src/test/java/org/apache/ratis/TestRestartRaftPeer.java
----------------------------------------------------------------------
diff --git a/ratis-examples/src/test/java/org/apache/ratis/TestRestartRaftPeer.java b/ratis-examples/src/test/java/org/apache/ratis/TestRestartRaftPeer.java
index a5b7d69..34aec44 100644
--- a/ratis-examples/src/test/java/org/apache/ratis/TestRestartRaftPeer.java
+++ b/ratis-examples/src/test/java/org/apache/ratis/TestRestartRaftPeer.java
@@ -21,6 +21,7 @@ import org.apache.log4j.Level;
 import org.apache.ratis.RaftTestUtil.SimpleMessage;
 import org.apache.ratis.client.RaftClient;
 import org.apache.ratis.conf.RaftProperties;
+import org.apache.ratis.util.SizeInBytes;
 import org.apache.ratis.examples.RaftExamplesTestUtil;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServerConfigKeys;
@@ -43,8 +44,6 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 
-import static org.apache.ratis.server.RaftServerConfigKeys.KB;
-
 /**
  * Test restarting raft peers.
  */
@@ -63,7 +62,7 @@ public class TestRestartRaftPeer {
     RaftProperties prop = new RaftProperties();
     prop.setClass(MiniRaftCluster.STATEMACHINE_CLASS_KEY,
         SimpleStateMachine4Testing.class, StateMachine.class);
-    RaftServerConfigKeys.Log.setSegmentSizeMax(prop::setLong, 8*KB);
+    RaftServerConfigKeys.Log.setSegmentSizeMax(prop, SizeInBytes.valueOf("8KB"));
     return RaftExamplesTestUtil.getMiniRaftClusters(prop, 3);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java b/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
index 74c56a5..66e06e0 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/RaftServerConfigKeys.java
@@ -17,25 +17,24 @@
  */
 package org.apache.ratis.server;
 
-import org.apache.ratis.conf.ConfUtils;
+import org.apache.ratis.conf.RaftProperties;
+import org.apache.ratis.util.SizeInBytes;
+import org.apache.ratis.util.TimeDuration;
 
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
+import java.util.concurrent.TimeUnit;
 
-import static org.apache.ratis.conf.ConfUtils.requireMin;
+import static org.apache.ratis.conf.ConfUtils.*;
 
 public interface RaftServerConfigKeys {
   String PREFIX = "raft.server";
-  int KB = 1024;
-  int MB = 1024*KB;
 
   String STORAGE_DIR_KEY = PREFIX + ".storage.dir";
   String STORAGE_DIR_DEFAULT = "file:///tmp/raft-server/";
-  static String storageDir(BiFunction<String, String, String> getTrimmed) {
-    return ConfUtils.get(getTrimmed, STORAGE_DIR_KEY, STORAGE_DIR_DEFAULT);
+  static String storageDir(RaftProperties properties) {
+    return get(properties::getTrimmed, STORAGE_DIR_KEY, STORAGE_DIR_DEFAULT);
   }
-  static void setStorageDir(BiConsumer<String, String> setString, String storageDir) {
-    ConfUtils.set(setString, STORAGE_DIR_KEY, storageDir);
+  static void setStorageDir(RaftProperties properties, String storageDir) {
+    set(properties::set, STORAGE_DIR_KEY, storageDir);
   }
 
   /**
@@ -45,12 +44,12 @@ public interface RaftServerConfigKeys {
    */
   String STAGING_CATCHUP_GAP_KEY = PREFIX + ".staging.catchup.gap";
   int STAGING_CATCHUP_GAP_DEFAULT = 1000; // increase this number when write throughput is high
-  static int stagingCatchupGap(BiFunction<String, Integer, Integer> getInt) {
-    return ConfUtils.getInt(getInt,
+  static int stagingCatchupGap(RaftProperties properties) {
+    return getInt(properties::getInt,
         STAGING_CATCHUP_GAP_KEY, STAGING_CATCHUP_GAP_DEFAULT, requireMin(0));
   }
-  static void setStagingCatchupGap(BiConsumer<String, Integer> setInt, int stagingCatchupGap) {
-    ConfUtils.setInt(setInt, STAGING_CATCHUP_GAP_KEY, stagingCatchupGap);
+  static void setStagingCatchupGap(RaftProperties properties, int stagingCatchupGap) {
+    setInt(properties::setInt, STAGING_CATCHUP_GAP_KEY, stagingCatchupGap);
   }
 
   interface Log {
@@ -58,48 +57,47 @@ public interface RaftServerConfigKeys {
 
     String USE_MEMORY_KEY = PREFIX + ".use.memory";
     boolean USE_MEMORY_DEFAULT = false;
-    static boolean useMemory(BiFunction<String, Boolean, Boolean> getBool) {
-      return ConfUtils.getBoolean(getBool, USE_MEMORY_KEY, USE_MEMORY_DEFAULT);
+    static boolean useMemory(RaftProperties properties) {
+      return getBoolean(properties::getBoolean, USE_MEMORY_KEY, USE_MEMORY_DEFAULT);
     }
-    static void setUseMemory(BiConsumer<String, Boolean> setLong, boolean useMemory) {
-      ConfUtils.setBoolean(setLong, USE_MEMORY_KEY, useMemory);
+    static void setUseMemory(RaftProperties properties, boolean useMemory) {
+      setBoolean(properties::setBoolean, USE_MEMORY_KEY, useMemory);
     }
 
     String SEGMENT_SIZE_MAX_KEY = PREFIX + ".segment.size.max";
-    long SEGMENT_SIZE_MAX_DEFAULT = 8*MB;
-    static long segmentSizeMax(BiFunction<String, Long, Long> getLong) {
-      return ConfUtils.getLong(getLong,
-          SEGMENT_SIZE_MAX_KEY, SEGMENT_SIZE_MAX_DEFAULT, requireMin(0L));
+    SizeInBytes SEGMENT_SIZE_MAX_DEFAULT = SizeInBytes.valueOf("8MB");
+    static SizeInBytes segmentSizeMax(RaftProperties properties) {
+      return getSizeInBytes(properties::getSizeInBytes,
+          SEGMENT_SIZE_MAX_KEY, SEGMENT_SIZE_MAX_DEFAULT);
     }
-    static void setSegmentSizeMax(
-        BiConsumer<String, Long> setLong, long segmentSizeMax) {
-      ConfUtils.setLong(setLong, SEGMENT_SIZE_MAX_KEY, segmentSizeMax);
+    static void setSegmentSizeMax(RaftProperties properties, SizeInBytes segmentSizeMax) {
+      setSizeInBytes(properties::set, SEGMENT_SIZE_MAX_KEY, segmentSizeMax);
     }
 
     String PREALLOCATED_SIZE_KEY = PREFIX + ".preallocated.size";
-    int PREALLOCATED_SIZE_DEFAULT = 4*MB;
-    static int preallocatedSize(BiFunction<String, Integer, Integer> getInt) {
-      return ConfUtils.getInt(getInt,
-          PREALLOCATED_SIZE_KEY, PREALLOCATED_SIZE_DEFAULT, requireMin(0));
+    SizeInBytes PREALLOCATED_SIZE_DEFAULT = SizeInBytes.valueOf("4MB");
+    static SizeInBytes preallocatedSize(RaftProperties properties) {
+      return getSizeInBytes(properties::getSizeInBytes,
+          PREALLOCATED_SIZE_KEY, PREALLOCATED_SIZE_DEFAULT);
     }
-    static void setPreallocatedSize(BiConsumer<String, Integer> setInt, int preallocatedSize) {
-      ConfUtils.setInt(setInt, PREALLOCATED_SIZE_KEY, preallocatedSize);
+    static void setPreallocatedSize(RaftProperties properties, SizeInBytes preallocatedSize) {
+      setSizeInBytes(properties::set, PREALLOCATED_SIZE_KEY, preallocatedSize);
     }
 
     String WRITE_BUFFER_SIZE_KEY = PREFIX + ".write.buffer.size";
-    int WRITE_BUFFER_SIZE_DEFAULT = 64*KB;
-    static int writeBufferSize(BiFunction<String, Integer, Integer> getInt) {
-      return ConfUtils.getInt(getInt,
-          WRITE_BUFFER_SIZE_KEY, WRITE_BUFFER_SIZE_DEFAULT, requireMin(0));
+    SizeInBytes WRITE_BUFFER_SIZE_DEFAULT =SizeInBytes.valueOf("64KB");
+    static SizeInBytes writeBufferSize(RaftProperties properties) {
+      return getSizeInBytes(properties::getSizeInBytes,
+          WRITE_BUFFER_SIZE_KEY, WRITE_BUFFER_SIZE_DEFAULT);
     }
-    static void setWriteBufferSize(BiConsumer<String, Integer> setInt, int writeBufferSize) {
-      ConfUtils.setInt(setInt, WRITE_BUFFER_SIZE_KEY, writeBufferSize);
+    static void setWriteBufferSize(RaftProperties properties, SizeInBytes writeBufferSize) {
+      setSizeInBytes(properties::set, WRITE_BUFFER_SIZE_KEY, writeBufferSize);
     }
 
     String FORCE_SYNC_NUM_KEY = PREFIX + ".force.sync.num";
     int FORCE_SYNC_NUM_DEFAULT = 128;
-    static int forceSyncNum(BiFunction<String, Integer, Integer> getInt) {
-      return ConfUtils.getInt(getInt,
+    static int forceSyncNum(RaftProperties properties) {
+      return getInt(properties::getInt,
           FORCE_SYNC_NUM_KEY, FORCE_SYNC_NUM_DEFAULT, requireMin(0));
     }
 
@@ -107,30 +105,29 @@ public interface RaftServerConfigKeys {
       String PREFIX = Log.PREFIX + ".appender";
 
       String BUFFER_CAPACITY_KEY = PREFIX + ".buffer.capacity";
-      int BUFFER_CAPACITY_DEFAULT = 4*MB;
-      static int bufferCapacity(BiFunction<String, Integer, Integer> getInt) {
-        return ConfUtils.getInt(getInt,
-            BUFFER_CAPACITY_KEY, BUFFER_CAPACITY_DEFAULT, requireMin(0));
+      SizeInBytes BUFFER_CAPACITY_DEFAULT =SizeInBytes.valueOf("4MB");
+      static SizeInBytes bufferCapacity(RaftProperties properties) {
+        return getSizeInBytes(properties::getSizeInBytes,
+            BUFFER_CAPACITY_KEY, BUFFER_CAPACITY_DEFAULT);
       }
-      static void setBufferCapacity(BiConsumer<String, Integer> setInt, int bufferCapacity) {
-        ConfUtils.setInt(setInt, BUFFER_CAPACITY_KEY, bufferCapacity);
+      static void setBufferCapacity(RaftProperties properties, SizeInBytes bufferCapacity) {
+        setSizeInBytes(properties::set, BUFFER_CAPACITY_KEY, bufferCapacity);
       }
 
       String BATCH_ENABLED_KEY = PREFIX + ".batch.enabled";
       boolean BATCH_ENABLED_DEFAULT = false;
-      static boolean batchEnabled(BiFunction<String, Boolean, Boolean> getBool) {
-        return ConfUtils.getBoolean(getBool, BATCH_ENABLED_KEY, BATCH_ENABLED_DEFAULT);
+      static boolean batchEnabled(RaftProperties properties) {
+        return getBoolean(properties::getBoolean, BATCH_ENABLED_KEY, BATCH_ENABLED_DEFAULT);
       }
-      static void setBatchEnabled(
-          BiConsumer<String, Boolean> setLong, boolean batchEnabled) {
-        ConfUtils.setBoolean(setLong, BATCH_ENABLED_KEY, batchEnabled);
+      static void setBatchEnabled(RaftProperties properties, boolean batchEnabled) {
+        setBoolean(properties::setBoolean, BATCH_ENABLED_KEY, batchEnabled);
       }
 
       String SNAPSHOT_CHUNK_SIZE_MAX_KEY = PREFIX + ".snapshot.chunk.size.max";
-      int SNAPSHOT_CHUNK_SIZE_MAX_DEFAULT = 16*MB;
-      static int snapshotChunkSizeMax(BiFunction<String, Integer, Integer> getInt) {
-        return ConfUtils.getInt(getInt,
-            SNAPSHOT_CHUNK_SIZE_MAX_KEY, SNAPSHOT_CHUNK_SIZE_MAX_DEFAULT, requireMin(0));
+      SizeInBytes SNAPSHOT_CHUNK_SIZE_MAX_DEFAULT =SizeInBytes.valueOf("16MB");
+      static SizeInBytes snapshotChunkSizeMax(RaftProperties properties) {
+        return getSizeInBytes(properties::getSizeInBytes,
+            SNAPSHOT_CHUNK_SIZE_MAX_KEY, SNAPSHOT_CHUNK_SIZE_MAX_DEFAULT);
       }
     }
   }
@@ -142,25 +139,23 @@ public interface RaftServerConfigKeys {
     String AUTO_TRIGGER_ENABLED_KEY = PREFIX + ".auto.trigger.enabled";
     /** by default let the state machine to decide when to do checkpoint */
     boolean AUTO_TRIGGER_ENABLED_DEFAULT = false;
-    static boolean autoTriggerEnabled(BiFunction<String, Boolean, Boolean> getBool) {
-      return ConfUtils.getBoolean(getBool,
+    static boolean autoTriggerEnabled(RaftProperties properties) {
+      return getBoolean(properties::getBoolean,
           AUTO_TRIGGER_ENABLED_KEY, AUTO_TRIGGER_ENABLED_DEFAULT);
     }
-    static void setAutoTriggerEnabled(
-        BiConsumer<String, Boolean> setLong, boolean autoTriggerThreshold) {
-      ConfUtils.setBoolean(setLong, AUTO_TRIGGER_ENABLED_KEY, autoTriggerThreshold);
+    static void setAutoTriggerEnabled(RaftProperties properties, boolean autoTriggerThreshold) {
+      setBoolean(properties::setBoolean, AUTO_TRIGGER_ENABLED_KEY, autoTriggerThreshold);
     }
 
     /** log size limit (in number of log entries) that triggers the snapshot */
     String AUTO_TRIGGER_THRESHOLD_KEY = PREFIX + ".auto.trigger.threshold";
     long AUTO_TRIGGER_THRESHOLD_DEFAULT = 400000L;
-    static long autoTriggerThreshold(BiFunction<String, Long, Long> getLong) {
-      return ConfUtils.getLong(getLong,
+    static long autoTriggerThreshold(RaftProperties properties) {
+      return getLong(properties::getLong,
           AUTO_TRIGGER_THRESHOLD_KEY, AUTO_TRIGGER_THRESHOLD_DEFAULT, requireMin(0L));
     }
-    static void setAutoTriggerThreshold(
-        BiConsumer<String, Long> setLong, long autoTriggerThreshold) {
-      ConfUtils.setLong(setLong, AUTO_TRIGGER_THRESHOLD_KEY, autoTriggerThreshold);
+    static void setAutoTriggerThreshold(RaftProperties properties, long autoTriggerThreshold) {
+      setLong(properties::setLong, AUTO_TRIGGER_THRESHOLD_KEY, autoTriggerThreshold);
     }
   }
 
@@ -168,29 +163,29 @@ public interface RaftServerConfigKeys {
   interface Rpc {
     String PREFIX = RaftServerConfigKeys.PREFIX + ".rpc";
 
-    String TIMEOUT_MIN_MS_KEY = PREFIX + ".timeout.min.ms";
-    int TIMEOUT_MIN_MS_DEFAULT = 150;
-    static int timeoutMinMs(BiFunction<String, Integer, Integer> getInt) {
-      return ConfUtils.getInt(getInt,
-          TIMEOUT_MIN_MS_KEY, TIMEOUT_MIN_MS_DEFAULT, requireMin(0));
+    String TIMEOUT_MIN_KEY = PREFIX + ".timeout.min";
+    TimeDuration TIMEOUT_MIN_DEFAULT = TimeDuration.valueOf(150, TimeUnit.MILLISECONDS);
+    static TimeDuration timeoutMin(RaftProperties properties) {
+      return getTimeDuration(properties.getTimeDuration(TIMEOUT_MIN_DEFAULT.getUnit()),
+          TIMEOUT_MIN_KEY, TIMEOUT_MIN_DEFAULT);
     }
 
-    String TIMEOUT_MAX_MS_KEY = PREFIX + ".timeout.max.ms";
-    int TIMEOUT_MAX_MS_DEFAULT = 300;
-    static int timeoutMaxMs(BiFunction<String, Integer, Integer> getInt) {
-      return ConfUtils.getInt(getInt,
-          TIMEOUT_MAX_MS_KEY, TIMEOUT_MAX_MS_DEFAULT, requireMin(0));
+    String TIMEOUT_MAX_KEY = PREFIX + ".timeout.max";
+    TimeDuration TIMEOUT_MAX_DEFAULT = TimeDuration.valueOf(300, TimeUnit.MILLISECONDS);
+    static TimeDuration timeoutMax(RaftProperties properties) {
+      return getTimeDuration(properties.getTimeDuration(TIMEOUT_MAX_DEFAULT.getUnit()),
+          TIMEOUT_MAX_KEY, TIMEOUT_MAX_DEFAULT);
     }
 
-    String SLEEP_TIME_MS_KEY = PREFIX + ".sleep.time.ms";
-    int SLEEP_TIME_MS_DEFAULT = 25;
-    static int sleepTimeMs(BiFunction<String, Integer, Integer> getInt) {
-      return ConfUtils.getInt(getInt,
-          SLEEP_TIME_MS_KEY, SLEEP_TIME_MS_DEFAULT, requireMin(0));
+    String SLEEP_TIME_KEY = PREFIX + ".sleep.time";
+    TimeDuration SLEEP_TIME_DEFAULT = TimeDuration.valueOf(25, TimeUnit.MILLISECONDS);
+    static TimeDuration sleepTime(RaftProperties properties) {
+      return getTimeDuration(properties.getTimeDuration(SLEEP_TIME_DEFAULT.getUnit()),
+          SLEEP_TIME_KEY, SLEEP_TIME_DEFAULT);
     }
   }
 
   static void main(String[] args) {
-    ConfUtils.printAll(RaftServerConfigKeys.class);
+    printAll(RaftServerConfigKeys.class);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java
index c5f0060..6f246d8 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java
@@ -25,10 +25,7 @@ import org.apache.ratis.server.storage.RaftLog;
 import org.apache.ratis.shaded.proto.RaftProtos.LeaderNoOp;
 import org.apache.ratis.shaded.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.statemachine.TransactionContext;
-import org.apache.ratis.util.CodeInjectionForTesting;
-import org.apache.ratis.util.Daemon;
-import org.apache.ratis.util.ProtoUtils;
-import org.apache.ratis.util.Timestamp;
+import org.apache.ratis.util.*;
 import org.slf4j.Logger;
 
 import java.io.IOException;
@@ -93,14 +90,14 @@ public class LeaderState {
   private volatile boolean running = true;
 
   private final int stagingCatchupGap;
-  private final int syncInterval;
+  private final TimeDuration syncInterval;
   private final long placeHolderIndex;
 
   LeaderState(RaftServerImpl server, RaftProperties properties) {
     this.server = server;
 
-    stagingCatchupGap = RaftServerConfigKeys.stagingCatchupGap(properties::getInt);
-    syncInterval = RaftServerConfigKeys.Rpc.sleepTimeMs(properties::getInt);
+    stagingCatchupGap = RaftServerConfigKeys.stagingCatchupGap(properties);
+    syncInterval = RaftServerConfigKeys.Rpc.sleepTime(properties);
 
     final ServerState state = server.getState();
     this.raftLog = state.getLog();
@@ -177,7 +174,7 @@ public class LeaderState {
     return currentTerm;
   }
 
-  int getSyncInterval() {
+  TimeDuration getSyncInterval() {
     return syncInterval;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java
index fdab93d..9dbe314 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java
@@ -68,9 +68,10 @@ public class LogAppender extends Daemon {
     this.raftLog = server.getState().getLog();
 
     final RaftProperties properties = server.getProperties();
-    this.maxBufferSize = RaftServerConfigKeys.Log.Appender.bufferCapacity(properties::getInt);
-    this.batchSending = RaftServerConfigKeys.Log.Appender.batchEnabled(properties::getBoolean);
-    this.snapshotChunkMaxSize = RaftServerConfigKeys.Log.Appender.snapshotChunkSizeMax(properties::getInt);
+    this.maxBufferSize = RaftServerConfigKeys.Log.Appender.bufferCapacity(properties).getSizeInt();
+    this.batchSending = RaftServerConfigKeys.Log.Appender.batchEnabled(properties);
+    this.snapshotChunkMaxSize = RaftServerConfigKeys.Log.Appender.snapshotChunkSizeMax(properties).getSizeInt();
+
     this.buffer = new LogEntryBuffer();
     this.leaderTerm = server.getState().getCurrentTerm();
   }
@@ -209,7 +210,7 @@ public class LogAppender extends Daemon {
         LOG.debug(this + ": failed to send appendEntries; retry " + retry++, ioe);
       }
       if (isAppenderRunning()) {
-        Thread.sleep(leaderState.getSyncInterval());
+        leaderState.getSyncInterval().sleep();
       }
     }
     return null;

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
index 98e37e5..e13a0ba 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
@@ -48,6 +48,7 @@ import java.util.List;
 import java.util.OptionalLong;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 
 import static org.apache.ratis.shaded.proto.RaftProtos.AppendEntriesReplyProto.AppendResult.*;
 import static org.apache.ratis.util.LifeCycle.State.*;
@@ -92,8 +93,8 @@ public class RaftServerImpl implements RaftServer {
       RaftConfiguration raftConf, RaftProperties properties, Parameters parameters)
       throws IOException {
     this.lifeCycle = new LifeCycle(id);
-    minTimeoutMs = RaftServerConfigKeys.Rpc.timeoutMinMs(properties::getInt);
-    maxTimeoutMs = RaftServerConfigKeys.Rpc.timeoutMaxMs(properties::getInt);
+    minTimeoutMs = RaftServerConfigKeys.Rpc.timeoutMin(properties).toInt(TimeUnit.MILLISECONDS);
+    maxTimeoutMs = RaftServerConfigKeys.Rpc.timeoutMax(properties).toInt(TimeUnit.MILLISECONDS);
     Preconditions.checkArgument(maxTimeoutMs > minTimeoutMs,
         "max timeout: %s, min timeout: %s", maxTimeoutMs, minTimeoutMs);
     this.properties = properties;

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
index 4ad099d..2e0ea71 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
@@ -124,7 +124,7 @@ public class ServerState implements Closeable {
   private RaftLog initLog(RaftPeerId id, RaftProperties prop,
       RaftServerImpl server, long lastIndexInSnapshot) throws IOException {
     final RaftLog log;
-    if (RaftServerConfigKeys.Log.useMemory(prop::getBoolean)) {
+    if (RaftServerConfigKeys.Log.useMemory(prop)) {
       log = new MemoryRaftLog(id);
     } else {
       log = new SegmentedRaftLog(id, server, this.storage,

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
index fb153cb..3341549 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
@@ -80,8 +80,8 @@ class StateMachineUpdater implements Runnable {
     this.lastAppliedIndex = lastAppliedIndex;
     lastSnapshotIndex = lastAppliedIndex;
 
-    autoSnapshotEnabled = RaftServerConfigKeys.Snapshot.autoTriggerEnabled(properties::getBoolean);
-    autoSnapshotThreshold = RaftServerConfigKeys.Snapshot.autoTriggerThreshold(properties::getLong);
+    autoSnapshotEnabled = RaftServerConfigKeys.Snapshot.autoTriggerEnabled(properties);
+    autoSnapshotThreshold = RaftServerConfigKeys.Snapshot.autoTriggerThreshold(properties);
     updater = new Daemon(this);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/storage/LogOutputStream.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/storage/LogOutputStream.java b/ratis-server/src/main/java/org/apache/ratis/server/storage/LogOutputStream.java
index 6a0f5da..8563549 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/storage/LogOutputStream.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/storage/LogOutputStream.java
@@ -61,14 +61,14 @@ public class LogOutputStream implements Closeable {
       throws IOException {
     this.file = file;
     this.checksum = new PureJavaCrc32C();
-    this.segmentMaxSize = RaftServerConfigKeys.Log.segmentSizeMax(properties::getLong);
-    this.preallocatedSize = RaftServerConfigKeys.Log.preallocatedSize(properties::getInt);
+    this.segmentMaxSize = RaftServerConfigKeys.Log.segmentSizeMax(properties).getSize();
+    this.preallocatedSize = RaftServerConfigKeys.Log.preallocatedSize(properties).getSize();
     RandomAccessFile rp = new RandomAccessFile(file, "rw");
     fc = rp.getChannel();
     fc.position(fc.size());
     preallocatedPos = fc.size();
 
-    final int bufferSize = RaftServerConfigKeys.Log.writeBufferSize(properties::getInt);
+    final int bufferSize = RaftServerConfigKeys.Log.writeBufferSize(properties).getSizeInt();
     out = new BufferedWriteChannel(fc, bufferSize);
 
     if (!append) {

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftLogWorker.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftLogWorker.java b/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftLogWorker.java
index a78d117..0d724e8 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftLogWorker.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftLogWorker.java
@@ -76,7 +76,7 @@ class RaftLogWorker implements Runnable {
     this.raftServer = raftServer;
     this.storage = storage;
     this.properties = properties;
-    this.forceSyncNum = RaftServerConfigKeys.Log.forceSyncNum(properties::getInt);
+    this.forceSyncNum = RaftServerConfigKeys.Log.forceSyncNum(properties);
     workerThread = new Thread(this,
         getClass().getSimpleName() + " for " + storage);
   }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorage.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorage.java b/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorage.java
index 2b73b0a..c86357d 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorage.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorage.java
@@ -44,7 +44,7 @@ public class RaftStorage implements Closeable {
 
   public RaftStorage(RaftProperties prop, RaftServerConstants.StartupOption option)
       throws IOException {
-    final String dir = RaftServerConfigKeys.storageDir(prop::getTrimmed);
+    final String dir = RaftServerConfigKeys.storageDir(prop);
     storageDir = new RaftStorageDirectory(
         new File(FileUtils.stringAsURI(dir).getPath()));
     if (option == RaftServerConstants.StartupOption.FORMAT) {

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java b/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
index 90b5f8d..c31665f 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/storage/SegmentedRaftLog.java
@@ -104,7 +104,7 @@ public class SegmentedRaftLog extends RaftLog {
       throws IOException {
     super(selfId);
     this.storage = storage;
-    this.segmentMaxSize = RaftServerConfigKeys.Log.segmentSizeMax(properties::getLong);
+    this.segmentMaxSize = RaftServerConfigKeys.Log.segmentSizeMax(properties).getSize();
     cache = new RaftLogCache();
     fileLogWorker = new RaftLogWorker(server, storage, properties);
     lastCommitted.set(lastIndexInSnapshot);

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/MiniRaftCluster.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/MiniRaftCluster.java b/ratis-server/src/test/java/org/apache/ratis/MiniRaftCluster.java
index 0f87da1..0944b87 100644
--- a/ratis-server/src/test/java/org/apache/ratis/MiniRaftCluster.java
+++ b/ratis-server/src/test/java/org/apache/ratis/MiniRaftCluster.java
@@ -44,6 +44,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
@@ -197,7 +198,7 @@ public abstract class MiniRaftCluster {
   }
 
   public int getMaxTimeout() {
-    return RaftServerConfigKeys.Rpc.timeoutMaxMs(properties::getInt);
+    return RaftServerConfigKeys.Rpc.timeoutMax(properties).toInt(TimeUnit.MILLISECONDS);
   }
 
   public RaftConfiguration getConf() {
@@ -211,7 +212,7 @@ public abstract class MiniRaftCluster {
         formatDir(dirStr);
       }
       final RaftProperties prop = new RaftProperties(properties);
-      RaftServerConfigKeys.setStorageDir(prop::set, dirStr);
+      RaftServerConfigKeys.setStorageDir(prop, dirStr);
       final StateMachine stateMachine = getStateMachine4Test(properties);
       return newRaftServer(id, stateMachine, conf, prop);
     } catch (IOException e) {
@@ -429,7 +430,8 @@ public abstract class MiniRaftCluster {
     // least ELECTION_TIMEOUT_MIN. In this way when the target leader request a
     // vote, all non-leader servers can grant the vote.
     // Disable the target leader server RPC so that it can request a vote.
-    blockQueueAndSetDelay(leaderId, RaftServerConfigKeys.Rpc.TIMEOUT_MIN_MS_DEFAULT);
+    blockQueueAndSetDelay(leaderId,
+        RaftServerConfigKeys.Rpc.TIMEOUT_MIN_DEFAULT.toInt(TimeUnit.MILLISECONDS));
 
     // Reopen queues so that the vote can make progress.
     blockQueueAndSetDelay(leaderId, 0);

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java b/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
index 3ada880..5166249 100644
--- a/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
+++ b/ratis-server/src/test/java/org/apache/ratis/RaftTestUtil.java
@@ -17,20 +17,9 @@
  */
 package org.apache.ratis;
 
-import static org.apache.ratis.util.ProtoUtils.toByteString;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.function.BooleanSupplier;
-import java.util.function.IntSupplier;
-
+import com.google.common.base.Preconditions;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.ratis.protocol.Message;
-import org.apache.ratis.protocol.RaftPeer;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.BlockRequestHandlingInjection;
@@ -44,7 +33,16 @@ import org.junit.Assert;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Preconditions;
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.function.BooleanSupplier;
+import java.util.function.IntSupplier;
+
+import static org.apache.ratis.util.ProtoUtils.toByteString;
 
 public class RaftTestUtil {
   static final Logger LOG = LoggerFactory.getLogger(RaftTestUtil.class);
@@ -230,7 +228,7 @@ public class RaftTestUtil {
 
   public static void block(BooleanSupplier isBlocked) throws InterruptedException {
     for(; isBlocked.getAsBoolean(); ) {
-      Thread.sleep(RaftServerConfigKeys.Rpc.TIMEOUT_MAX_MS_DEFAULT);
+      RaftServerConfigKeys.Rpc.TIMEOUT_MAX_DEFAULT.sleep();
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java b/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
index 00e12d2..bf7de9f 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/impl/RaftReconfigurationBaseTest.java
@@ -68,7 +68,7 @@ public abstract class RaftReconfigurationBaseTest {
   @BeforeClass
   public static void setup() {
     // set a small gap for tests
-    RaftServerConfigKeys.setStagingCatchupGap(prop::setInt, STAGING_CATCHUP_GAP);
+    RaftServerConfigKeys.setStagingCatchupGap(prop, STAGING_CATCHUP_GAP);
   }
 
   public abstract MiniRaftCluster getCluster(int peerNum) throws IOException;

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/server/simulation/SimulatedRequestReply.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/simulation/SimulatedRequestReply.java b/ratis-server/src/test/java/org/apache/ratis/server/simulation/SimulatedRequestReply.java
index 75e49ea..7fb2c2c 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/simulation/SimulatedRequestReply.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/simulation/SimulatedRequestReply.java
@@ -29,10 +29,7 @@ import org.apache.ratis.util.Timestamp;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -41,7 +38,7 @@ class SimulatedRequestReply<REQUEST extends RaftRpcMessage,
   public static final String SIMULATE_LATENCY_KEY
       = SimulatedRequestReply.class.getName() + ".simulateLatencyMs";
   public static final int SIMULATE_LATENCY_DEFAULT
-      = RaftServerConfigKeys.Rpc.TIMEOUT_MIN_MS_DEFAULT;
+      = RaftServerConfigKeys.Rpc.TIMEOUT_MIN_DEFAULT.toInt(TimeUnit.MILLISECONDS);
   public static final long TIMEOUT = 3000L;
 
   private static class ReplyOrException<REPLY> {

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/server/simulation/TestNotLeaderExceptionWithSimulation.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/simulation/TestNotLeaderExceptionWithSimulation.java b/ratis-server/src/test/java/org/apache/ratis/server/simulation/TestNotLeaderExceptionWithSimulation.java
index 669d4df..c37e2fb 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/simulation/TestNotLeaderExceptionWithSimulation.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/simulation/TestNotLeaderExceptionWithSimulation.java
@@ -19,9 +19,6 @@ package org.apache.ratis.server.simulation;
 
 import org.apache.ratis.MiniRaftCluster;
 import org.apache.ratis.RaftNotLeaderExceptionBaseTest;
-import org.apache.ratis.conf.RaftProperties;
-
-import java.io.IOException;
 
 public class TestNotLeaderExceptionWithSimulation extends RaftNotLeaderExceptionBaseTest {
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogReadWrite.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogReadWrite.java b/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogReadWrite.java
index 026d1c1..3c10815 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogReadWrite.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogReadWrite.java
@@ -20,6 +20,7 @@ package org.apache.ratis.server.storage;
 import org.apache.ratis.RaftTestUtil;
 import org.apache.ratis.RaftTestUtil.SimpleOperation;
 import org.apache.ratis.conf.RaftProperties;
+import org.apache.ratis.util.SizeInBytes;
 import org.apache.ratis.protocol.ChecksumException;
 import org.apache.ratis.protocol.ClientId;
 import org.apache.ratis.server.RaftServerConfigKeys;
@@ -44,8 +45,6 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
-import static org.apache.ratis.server.RaftServerConfigKeys.MB;
-
 /**
  * Test basic functionality of LogReader, LogInputStream, and LogOutputStream.
  */
@@ -62,7 +61,7 @@ public class TestRaftLogReadWrite {
   public void setup() throws Exception {
     storageDir = RaftTestUtil.getTestDir(TestRaftLogReadWrite.class);
     properties = new RaftProperties();
-    RaftServerConfigKeys.setStorageDir(properties::set,
+    RaftServerConfigKeys.setStorageDir(properties,
         FileUtils.fileAsURI(storageDir).toString());
   }
 
@@ -172,7 +171,8 @@ public class TestRaftLogReadWrite {
     out.flush();
 
     // make sure the file contains padding
-    Assert.assertEquals(RaftServerConfigKeys.Log.PREALLOCATED_SIZE_DEFAULT,
+    Assert.assertEquals(
+        RaftServerConfigKeys.Log.PREALLOCATED_SIZE_DEFAULT.getSize(),
         openSegment.length());
 
     // check if the reader can correctly read the log file
@@ -190,8 +190,8 @@ public class TestRaftLogReadWrite {
    */
   @Test
   public void testReadWithCorruptPadding() throws IOException {
-    RaftServerConfigKeys.Log.setPreallocatedSize(properties::setInt, 4*MB);
-    RaftServerConfigKeys.Log.setSegmentSizeMax(properties::setLong, 16*MB);
+    RaftServerConfigKeys.Log.setPreallocatedSize(properties, SizeInBytes.valueOf("4MB"));
+    RaftServerConfigKeys.Log.setSegmentSizeMax(properties, SizeInBytes.valueOf("16MB"));
 
     RaftStorage storage = new RaftStorage(properties, StartupOption.REGULAR);
     File openSegment = storage.getStorageDir().getOpenLogFile(0);

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogSegment.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogSegment.java b/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogSegment.java
index 5ac5db3..f538421 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogSegment.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftLogSegment.java
@@ -17,20 +17,10 @@
  */
 package org.apache.ratis.server.storage;
 
-import static org.apache.ratis.server.RaftServerConfigKeys.KB;
-import static org.apache.ratis.server.RaftServerConfigKeys.MB;
-import static org.apache.ratis.server.impl.RaftServerConstants.INVALID_LOG_INDEX;
-import static org.apache.ratis.server.storage.LogSegment.getEntrySize;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 import org.apache.ratis.RaftTestUtil;
 import org.apache.ratis.RaftTestUtil.SimpleOperation;
 import org.apache.ratis.conf.RaftProperties;
+import org.apache.ratis.util.SizeInBytes;
 import org.apache.ratis.protocol.ClientId;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.RaftServerConstants.StartupOption;
@@ -38,11 +28,21 @@ import org.apache.ratis.shaded.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.shaded.proto.RaftProtos.SMLogEntryProto;
 import org.apache.ratis.util.FileUtils;
 import org.apache.ratis.util.ProtoUtils;
+import org.apache.ratis.util.TraditionalBinaryPrefix;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.apache.ratis.server.impl.RaftServerConstants.INVALID_LOG_INDEX;
+import static org.apache.ratis.server.storage.LogSegment.getEntrySize;
+
 /**
  * Test basic functionality of {@link LogSegment}
  */
@@ -56,8 +56,7 @@ public class TestRaftLogSegment {
   @Before
   public void setup() throws Exception {
     storageDir = RaftTestUtil.getTestDir(TestRaftLogSegment.class);
-    RaftServerConfigKeys.setStorageDir(properties::set,
-        storageDir.getCanonicalPath());
+    RaftServerConfigKeys.setStorageDir(properties, storageDir.getCanonicalPath());
   }
 
   @After
@@ -213,8 +212,8 @@ public class TestRaftLogSegment {
 
   private RaftProperties getProperties(long maxSegmentSize, int preallocatedSize) {
     RaftProperties p = new RaftProperties();
-    RaftServerConfigKeys.Log.setSegmentSizeMax(p::setLong, maxSegmentSize);
-    RaftServerConfigKeys.Log.setPreallocatedSize(p::setInt, preallocatedSize);
+    RaftServerConfigKeys.Log.setSegmentSizeMax(p, SizeInBytes.valueOf(maxSegmentSize));
+    RaftServerConfigKeys.Log.setPreallocatedSize(p, SizeInBytes.valueOf(preallocatedSize));
     return p;
   }
 
@@ -271,10 +270,10 @@ public class TestRaftLogSegment {
    */
   @Test
   public void testPreallocationAndAppend() throws Exception {
-    final long max = 2*MB;
-    RaftServerConfigKeys.Log.setSegmentSizeMax(properties::setLong, max);
-    RaftServerConfigKeys.Log.setPreallocatedSize(properties::setInt, 16*KB);
-    RaftServerConfigKeys.Log.setWriteBufferSize(properties::setInt, 10*KB);
+    final SizeInBytes max = SizeInBytes.valueOf(2, TraditionalBinaryPrefix.MEGA);
+    RaftServerConfigKeys.Log.setSegmentSizeMax(properties, max);
+    RaftServerConfigKeys.Log.setPreallocatedSize(properties, SizeInBytes.valueOf("16KB"));
+    RaftServerConfigKeys.Log.setWriteBufferSize(properties, SizeInBytes.valueOf("10KB"));
     RaftStorage storage = new RaftStorage(properties, StartupOption.REGULAR);
     final File file = storage.getStorageDir().getOpenLogFile(0);
 
@@ -289,7 +288,7 @@ public class TestRaftLogSegment {
     long preallocated = 16 * 1024;
     try (LogOutputStream out = new LogOutputStream(file, false, properties)) {
       Assert.assertEquals(preallocated, file.length());
-      while (totalSize + entrySize < max) {
+      while (totalSize + entrySize < max.getSize()) {
         totalSize += entrySize;
         out.write(entry);
         if (totalSize > preallocated) {

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftStorage.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftStorage.java b/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftStorage.java
index cb375c6..ede9103 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftStorage.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/storage/TestRaftStorage.java
@@ -49,8 +49,7 @@ public class TestRaftStorage {
   @Before
   public void setup() throws Exception {
     storageDir = RaftTestUtil.getTestDir(TestRaftStorage.class);
-    RaftServerConfigKeys.setStorageDir(properties::set,
-        storageDir.getCanonicalPath());
+    RaftServerConfigKeys.setStorageDir(properties, storageDir.getCanonicalPath());
   }
 
   @After

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/server/storage/TestSegmentedRaftLog.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/storage/TestSegmentedRaftLog.java b/ratis-server/src/test/java/org/apache/ratis/server/storage/TestSegmentedRaftLog.java
index fb4fe16..1fcb54b 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/storage/TestSegmentedRaftLog.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/storage/TestSegmentedRaftLog.java
@@ -22,6 +22,7 @@ import org.apache.ratis.MiniRaftCluster;
 import org.apache.ratis.RaftTestUtil;
 import org.apache.ratis.RaftTestUtil.SimpleOperation;
 import org.apache.ratis.conf.RaftProperties;
+import org.apache.ratis.util.SizeInBytes;
 import org.apache.ratis.protocol.ClientId;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServerConfigKeys;
@@ -45,8 +46,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.function.Supplier;
 
-import static org.apache.ratis.server.RaftServerConfigKeys.KB;
-
 public class TestSegmentedRaftLog {
   static {
     RaftUtils.setLogLevel(RaftLogWorker.LOG, Level.DEBUG);
@@ -80,8 +79,7 @@ public class TestSegmentedRaftLog {
   public void setup() throws Exception {
     storageDir = RaftTestUtil.getTestDir(TestSegmentedRaftLog.class);
     properties = new RaftProperties();
-    RaftServerConfigKeys.setStorageDir(properties::set,
-        storageDir.getCanonicalPath());
+    RaftServerConfigKeys.setStorageDir(properties, storageDir.getCanonicalPath());
     storage = new RaftStorage(properties, RaftServerConstants.StartupOption.REGULAR);
   }
 
@@ -190,8 +188,8 @@ public class TestSegmentedRaftLog {
    */
   @Test
   public void testAppendAndRoll() throws Exception {
-    RaftServerConfigKeys.Log.setPreallocatedSize(properties::setInt, 16*KB);
-    RaftServerConfigKeys.Log.setSegmentSizeMax(properties::setLong, 128*KB);
+    RaftServerConfigKeys.Log.setPreallocatedSize(properties, SizeInBytes.valueOf("16KB"));
+    RaftServerConfigKeys.Log.setSegmentSizeMax(properties, SizeInBytes.valueOf("128KB"));
 
     List<SegmentRange> ranges = prepareRanges(1, 1024, 0);
     final byte[] content = new byte[1024];

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java b/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java
index c08931a..68ab8c3 100644
--- a/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java
+++ b/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java
@@ -92,8 +92,8 @@ public abstract class RaftSnapshotBaseTest {
     prop.setClass(MiniRaftCluster.STATEMACHINE_CLASS_KEY,
         SimpleStateMachine4Testing.class, StateMachine.class);
     RaftServerConfigKeys.Snapshot.setAutoTriggerThreshold(
-        prop::setLong, SNAPSHOT_TRIGGER_THRESHOLD);
-    RaftServerConfigKeys.Snapshot.setAutoTriggerEnabled(prop::setBoolean, true);
+        prop, SNAPSHOT_TRIGGER_THRESHOLD);
+    RaftServerConfigKeys.Snapshot.setAutoTriggerEnabled(prop, true);
     this.cluster = getFactory().newCluster(1, prop);
     cluster.start();
   }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/6a755e66/ratis-server/src/test/java/org/apache/ratis/statemachine/TestStateMachine.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/test/java/org/apache/ratis/statemachine/TestStateMachine.java b/ratis-server/src/test/java/org/apache/ratis/statemachine/TestStateMachine.java
index c8bf76e..b81e367 100644
--- a/ratis-server/src/test/java/org/apache/ratis/statemachine/TestStateMachine.java
+++ b/ratis-server/src/test/java/org/apache/ratis/statemachine/TestStateMachine.java
@@ -60,7 +60,7 @@ public class TestStateMachine {
   {
     // TODO: fix and run with in-memory log. It fails with NPE
     // TODO: if change setUseMemory to true
-    RaftServerConfigKeys.Log.setUseMemory(properties::setBoolean, false);
+    RaftServerConfigKeys.Log.setUseMemory(properties, false);
   }
 
   private MiniRaftClusterWithSimulatedRpc cluster;