Repository: incubator-ratis
Updated Branches:
  refs/heads/master f7dea20f1 -> aa3816089


RATIS-364. Raft should persist configuration entries to meta file. Contributed 
by Mukul Kumar Singh.


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

Branch: refs/heads/master
Commit: aa38160890a0ffb7b8a3b0a7b709e12156c1a737
Parents: f7dea20
Author: Mukul Kumar Singh <[email protected]>
Authored: Tue Oct 23 13:26:25 2018 +0530
Committer: Mukul Kumar Singh <[email protected]>
Committed: Tue Oct 23 13:26:25 2018 +0530

----------------------------------------------------------------------
 .../ratis/server/impl/RaftServerImpl.java       |  4 +--
 .../apache/ratis/server/impl/ServerState.java   |  8 ++++--
 .../ratis/server/storage/RaftStorage.java       | 27 +++++++++++++++++++-
 .../server/storage/RaftStorageDirectory.java    |  5 ++++
 .../apache/ratis/statemachine/StateMachine.java | 11 --------
 .../statemachine/impl/BaseStateMachine.java     | 12 ---------
 6 files changed, 39 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/aa381608/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 e9cf119..ed7b8bc 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
@@ -1096,8 +1096,8 @@ public class RaftServerImpl implements 
RaftServerProtocol, RaftServerAsynchronou
     final StateMachine stateMachine = getStateMachine();
     if (next.hasConfigurationEntry()) {
       // the reply should have already been set. only need to record
-      // the new conf in the state machine.
-      
stateMachine.setRaftConfiguration(ServerProtoUtils.toRaftConfiguration(next));
+      // the new conf in the metadata file.
+      state.writeRaftConfiguration(next);
     } else if (next.hasStateMachineLogEntry()) {
       // check whether there is a TransactionContext because we are the leader.
       TransactionContext trx = role.getLeaderState()

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/aa381608/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 49169f5..e58cc7d 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
@@ -156,14 +156,18 @@ public class ServerState implements Closeable {
       return RaftServerConstants.INVALID_LOG_INDEX;
     }
 
-    // get the raft configuration from the snapshot
-    RaftConfiguration raftConf = sm.getRaftConfiguration();
+    // get the raft configuration from raft metafile
+    RaftConfiguration raftConf = storage.readRaftConfiguration();
     if (raftConf != null) {
       setRaftConf(raftConf.getLogEntryIndex(), raftConf);
     }
     return snapshot.getIndex();
   }
 
+  void writeRaftConfiguration(LogEntryProto conf) {
+    storage.writeRaftConfiguration(conf);
+  }
+
   void start() {
     stateMachineUpdater.start();
   }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/aa381608/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 16cd342..bcb2b6e 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
@@ -17,7 +17,10 @@
  */
 package org.apache.ratis.server.storage;
 
+import org.apache.ratis.proto.RaftProtos.LogEntryProto;
+import org.apache.ratis.server.impl.RaftConfiguration;
 import org.apache.ratis.server.impl.RaftServerConstants;
+import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.storage.RaftStorageDirectory.StorageState;
 import org.apache.ratis.statemachine.SnapshotInfo;
 import org.apache.ratis.statemachine.StateMachineStorage;
@@ -28,6 +31,8 @@ import org.slf4j.LoggerFactory;
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.nio.file.Files;
 
 public class RaftStorage implements Closeable {
@@ -115,7 +120,27 @@ public class RaftStorage implements Closeable {
     return metaFile;
   }
 
-  public SnapshotInfo getLastestSnapshot() throws IOException {
+  public void writeRaftConfiguration(LogEntryProto conf) {
+    File confFile = storageDir.getMetaConfFile();
+    try (FileOutputStream fio = new FileOutputStream(confFile)) {
+      conf.writeTo(fio);
+    } catch (Exception e) {
+      LOG.error("Failed writing configuration to file:" + confFile, e);
+    }
+  }
+
+  public RaftConfiguration readRaftConfiguration() {
+    File confFile = storageDir.getMetaConfFile();
+    try (FileInputStream fio = new FileInputStream(confFile)) {
+      LogEntryProto confProto = 
LogEntryProto.newBuilder().mergeFrom(fio).build();
+      return ServerProtoUtils.toRaftConfiguration(confProto);
+    } catch (Exception e) {
+      LOG.error("Failed reading configuration from file:" + confFile, e);
+      return null;
+    }
+  }
+
+  public SnapshotInfo getLatestSnapshot() throws IOException {
     return getStateMachineStorage().getLatestSnapshot();
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/aa381608/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorageDirectory.java
----------------------------------------------------------------------
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorageDirectory.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorageDirectory.java
index 05208a3..c2feabb 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorageDirectory.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/storage/RaftStorageDirectory.java
@@ -51,6 +51,7 @@ public class RaftStorageDirectory {
   static final String TEMP = "tmp";
   static final Pattern CLOSED_SEGMENT_REGEX = 
Pattern.compile("log_(\\d+)-(\\d+)");
   static final Pattern OPEN_SEGMENT_REGEX = 
Pattern.compile("log_inprogress_(\\d+)(?:\\..*)?");
+  private static final String CONF_EXTENSION = ".conf";
 
 
   enum StorageState {
@@ -139,6 +140,10 @@ public class RaftStorageDirectory {
         + AtomicFileOutputStream.TMP_EXTENSION);
   }
 
+  File getMetaConfFile() {
+    return new File(getCurrentDir(), META_FILE_NAME + CONF_EXTENSION);
+  }
+
   File getOpenLogFile(long startIndex) {
     return new File(getCurrentDir(), getOpenLogFileName(startIndex));
   }

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/aa381608/ratis-server/src/main/java/org/apache/ratis/statemachine/StateMachine.java
----------------------------------------------------------------------
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/statemachine/StateMachine.java 
b/ratis-server/src/main/java/org/apache/ratis/statemachine/StateMachine.java
index 900db83..bb40c3c 100644
--- a/ratis-server/src/main/java/org/apache/ratis/statemachine/StateMachine.java
+++ b/ratis-server/src/main/java/org/apache/ratis/statemachine/StateMachine.java
@@ -98,17 +98,6 @@ public interface StateMachine extends Closeable {
   long takeSnapshot() throws IOException;
 
   /**
-   * Record the RaftConfiguration in the state machine. The RaftConfiguration
-   * should also be stored in the snapshot.
-   */
-  void setRaftConfiguration(RaftConfiguration conf);
-
-  /**
-   * @return the latest raft configuration recorded in the state machine.
-   */
-  RaftConfiguration getRaftConfiguration();
-
-  /**
    * @return StateMachineStorage to interact with the durability guarantees 
provided by the
    * state machine.
    */

http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/aa381608/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
----------------------------------------------------------------------
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
 
b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
index 9792252..119432e 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java
@@ -23,7 +23,6 @@ import org.apache.ratis.protocol.RaftClientRequest;
 import org.apache.ratis.protocol.RaftGroupId;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServer;
-import org.apache.ratis.server.impl.RaftConfiguration;
 import org.apache.ratis.server.impl.RaftServerConstants;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.storage.RaftStorage;
@@ -47,7 +46,6 @@ import java.util.concurrent.atomic.AtomicReference;
 public class BaseStateMachine implements StateMachine {
   private final CompletableFuture<RaftServer> server = new 
CompletableFuture<>();
   private volatile RaftGroupId groupId;
-  private volatile RaftConfiguration raftConf;
   protected final LifeCycle lifeCycle = new 
LifeCycle(getClass().getSimpleName());
 
   private final AtomicReference<TermIndex> lastAppliedTermIndex = new 
AtomicReference<>();
@@ -71,16 +69,6 @@ public class BaseStateMachine implements StateMachine {
   }
 
   @Override
-  public void setRaftConfiguration(RaftConfiguration conf) {
-    this.raftConf = conf;
-  }
-
-  @Override
-  public RaftConfiguration getRaftConfiguration() {
-    return this.raftConf;
-  }
-
-  @Override
   public SnapshotInfo getLatestSnapshot() {
     return getStateMachineStorage().getLatestSnapshot();
   }

Reply via email to