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(); }
