From 0f2caa946b8e3edd17d42e134c7938054d4ec49f Mon Sep 17 00:00:00 2001 From: Dave Rusek Date: Fri, 5 Dec 2014 16:52:53 -0700 Subject: [PATCH 1/2] Apply patch from Christian Weisskopf --- .../robotninjas/barge/NotLeaderException.java | 8 ++++--- .../org/robotninjas/barge/RaftCoreModule.java | 6 +++++ .../org/robotninjas/barge/log/LogModule.java | 7 ++++-- .../robotninjas/barge/log/RaftJournal.java | 8 +++++++ .../org/robotninjas/barge/log/RaftLog.java | 5 ++++ .../robotninjas/barge/state/BaseState.java | 9 ++++++-- .../org/robotninjas/barge/state/Leader.java | 5 ++++ .../barge/state/RaftPredicates.java | 2 +- .../barge/jaxrs/BargeResource.java | 8 ++++++- .../barge/jaxrs/BargeResourceTest.java | 5 +++- .../robotninjas/barge/NettyRaftModule.java | 23 +++++++++++++------ .../robotninjas/barge/NettyRaftService.java | 9 +++++++- 12 files changed, 77 insertions(+), 18 deletions(-) diff --git a/barge-core/src/main/java/org/robotninjas/barge/NotLeaderException.java b/barge-core/src/main/java/org/robotninjas/barge/NotLeaderException.java index 0187b79..bb046ec 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/NotLeaderException.java +++ b/barge-core/src/main/java/org/robotninjas/barge/NotLeaderException.java @@ -1,14 +1,16 @@ package org.robotninjas.barge; +import com.google.common.base.Optional; + public class NotLeaderException extends RaftException { - private final Replica leader; + private final Optional leader; - public NotLeaderException(Replica leader) { + public NotLeaderException(Optional leader) { this.leader = leader; } - public Replica getLeader() { + public Optional getLeader() { return leader; } } diff --git a/barge-core/src/main/java/org/robotninjas/barge/RaftCoreModule.java b/barge-core/src/main/java/org/robotninjas/barge/RaftCoreModule.java index 4a69fb3..60a053d 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/RaftCoreModule.java +++ b/barge-core/src/main/java/org/robotninjas/barge/RaftCoreModule.java @@ -116,6 +116,12 @@ public Builder withLogDir(File logDir) { return this; } + public Builder withExecutor(Executor executor) { + this.executor = Optional.of(executor); + + return this; + } + public RaftCoreModule build() { checkState(config.isPresent()); checkState(stateMachine.isPresent()); diff --git a/barge-core/src/main/java/org/robotninjas/barge/log/LogModule.java b/barge-core/src/main/java/org/robotninjas/barge/log/LogModule.java index 75014b3..12cf991 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/log/LogModule.java +++ b/barge-core/src/main/java/org/robotninjas/barge/log/LogModule.java @@ -22,6 +22,8 @@ import journal.io.api.Journal; import journal.io.api.JournalBuilder; import org.robotninjas.barge.StateMachine; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; import java.io.File; @@ -33,6 +35,8 @@ public class LogModule extends PrivateModule { + private static final Logger LOGGER = LoggerFactory.getLogger(LogModule.class); + private final File logDirectory; private final StateMachine stateMachine; private final Executor executor; @@ -68,11 +72,10 @@ Journal getJournal() { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { - //noinspection EmptyCatchBlock try { journal.close(); } catch (IOException e) { - //TODO log it + LOGGER.error("Error closing journal", e); } } })); diff --git a/barge-core/src/main/java/org/robotninjas/barge/log/RaftJournal.java b/barge-core/src/main/java/org/robotninjas/barge/log/RaftJournal.java index d4c2ff6..e15e656 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/log/RaftJournal.java +++ b/barge-core/src/main/java/org/robotninjas/barge/log/RaftJournal.java @@ -170,6 +170,14 @@ public void replay(Visitor visitor) { } + public void close() { + try { + journal.close(); + } catch (IOException e) { + propagate(e); + } + } + static interface Visitor { void term(Mark mark, long term); diff --git a/barge-core/src/main/java/org/robotninjas/barge/log/RaftLog.java b/barge-core/src/main/java/org/robotninjas/barge/log/RaftLog.java index f1c3483..103b78c 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/log/RaftLog.java +++ b/barge-core/src/main/java/org/robotninjas/barge/log/RaftLog.java @@ -113,6 +113,11 @@ public void append(RaftJournal.Mark mark, Entry entry, long index) { lastLogIndex, currentTerm, commitIndex, votedFor.orNull()); } + public void close() { + LOGGER.debug("Closing raft log and journal"); + journal.close(); + } + private SettableFuture storeEntry(final long index, @Nonnull Entry entry) { LOGGER.debug("{} storing {}", config.local(), entry); RaftJournal.Mark mark = journal.appendEntry(entry, index); diff --git a/barge-core/src/main/java/org/robotninjas/barge/state/BaseState.java b/barge-core/src/main/java/org/robotninjas/barge/state/BaseState.java index da9b3f1..8878d83 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/state/BaseState.java +++ b/barge-core/src/main/java/org/robotninjas/barge/state/BaseState.java @@ -26,7 +26,7 @@ public abstract class BaseState implements State { private final StateType type; private final RaftLog log; - private Optional leader; + private Optional leader = Optional.absent(); protected BaseState(@Nullable StateType type, @Nonnull RaftLog log) { this.log = checkNotNull(log); @@ -43,6 +43,10 @@ protected RaftLog getLog() { return log; } + public Optional getLeader() { + return leader; + } + @Override public void destroy(RaftStateContext ctx) { } @@ -173,7 +177,7 @@ public ListenableFuture commitOperation(@Nonnull RaftStateContext ctx, @ StateType stateType = ctx.type(); Preconditions.checkNotNull(stateType); if (stateType.equals(FOLLOWER)) { - throw new NotLeaderException(leader.get()); + throw new NotLeaderException(leader); } else if (stateType.equals(CANDIDATE)) { throw new NoLeaderException(); } @@ -183,6 +187,7 @@ public ListenableFuture commitOperation(@Nonnull RaftStateContext ctx, @ @Override public void doStop(RaftStateContext ctx) { ctx.setState(this, STOPPED); + log.close(); } } diff --git a/barge-core/src/main/java/org/robotninjas/barge/state/Leader.java b/barge-core/src/main/java/org/robotninjas/barge/state/Leader.java index 911294c..0134e0f 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/state/Leader.java +++ b/barge-core/src/main/java/org/robotninjas/barge/state/Leader.java @@ -36,6 +36,7 @@ import org.robotninjas.barge.log.RaftLog; import static org.robotninjas.barge.state.Raft.StateType.FOLLOWER; import static org.robotninjas.barge.state.Raft.StateType.LEADER; +import static org.robotninjas.barge.state.Raft.StateType.STOPPED; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -181,6 +182,10 @@ List> sendRequests(final RaftStateContex Futures.addCallback(response, new FutureCallback() { @Override public void onSuccess(@Nullable AppendEntriesResponse result) { + if (ctx.type().equals(STOPPED)) { + return; + } + updateCommitted(); checkTermOnResponse(ctx, result); } diff --git a/barge-core/src/main/java/org/robotninjas/barge/state/RaftPredicates.java b/barge-core/src/main/java/org/robotninjas/barge/state/RaftPredicates.java index 6115882..9b93121 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/state/RaftPredicates.java +++ b/barge-core/src/main/java/org/robotninjas/barge/state/RaftPredicates.java @@ -31,7 +31,7 @@ class RaftPredicates { @Nonnull - static Predicate appendSuccessul() { + static Predicate appendSuccessful() { return AppendSuccessPredicate.Success; } diff --git a/barge-jax-rs/src/main/java/org/robotninjas/barge/jaxrs/BargeResource.java b/barge-jax-rs/src/main/java/org/robotninjas/barge/jaxrs/BargeResource.java index e47984d..758d21a 100644 --- a/barge-jax-rs/src/main/java/org/robotninjas/barge/jaxrs/BargeResource.java +++ b/barge-jax-rs/src/main/java/org/robotninjas/barge/jaxrs/BargeResource.java @@ -15,9 +15,11 @@ */ package org.robotninjas.barge.jaxrs; +import com.google.common.base.Optional; import com.google.common.base.Throwables; import org.robotninjas.barge.ClusterConfig; import org.robotninjas.barge.NotLeaderException; +import org.robotninjas.barge.Replica; import org.robotninjas.barge.api.AppendEntries; import org.robotninjas.barge.api.AppendEntriesResponse; import org.robotninjas.barge.api.RequestVote; @@ -97,7 +99,11 @@ public Response commit(byte[] operation) { return Response.noContent().build(); } catch (NotLeaderException e) { - return Response.status(Response.Status.FOUND).location(((HttpReplica) e.getLeader()).getUri()).build(); + Optional leader = e.getLeader(); + if (leader.isPresent() == false) { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); // FIXME find better solution for missing leader + } + return Response.status(Response.Status.FOUND).location(((HttpReplica) leader.get()).getUri()).build(); } catch (Exception e) { throw Throwables.propagate(e); } diff --git a/barge-jax-rs/src/test/java/org/robotninjas/barge/jaxrs/BargeResourceTest.java b/barge-jax-rs/src/test/java/org/robotninjas/barge/jaxrs/BargeResourceTest.java index fe829ee..1bb5eee 100644 --- a/barge-jax-rs/src/test/java/org/robotninjas/barge/jaxrs/BargeResourceTest.java +++ b/barge-jax-rs/src/test/java/org/robotninjas/barge/jaxrs/BargeResourceTest.java @@ -15,6 +15,7 @@ */ package org.robotninjas.barge.jaxrs; +import com.google.common.base.Optional; import com.google.common.base.Throwables; import com.google.common.collect.Sets; import com.google.common.util.concurrent.Futures; @@ -27,6 +28,7 @@ import org.junit.Test; import org.robotninjas.barge.ClusterConfig; import org.robotninjas.barge.NotLeaderException; +import org.robotninjas.barge.Replica; import org.robotninjas.barge.api.AppendEntriesResponse; import org.robotninjas.barge.api.RequestVoteResponse; import org.robotninjas.barge.state.Raft; @@ -94,7 +96,8 @@ public void onPOSTCommitReturn204GivenServiceReturnsResponse() throws Exception @Test public void onPOSTCommitReturn302WithLeaderURIGivenRaftThrowsNotLeaderException() throws Exception { URI leaderURI = new URI("http://localhost:1234"); - when(raftService.commitOperation("foo".getBytes())).thenThrow(new NotLeaderException(new HttpReplica(leaderURI))); + Replica replica = new HttpReplica(leaderURI); + when(raftService.commitOperation("foo".getBytes())).thenThrow(new NotLeaderException(Optional.of(replica))); Response value = client().target("/commit") .request() diff --git a/barge-rpc-proto/src/main/java/org/robotninjas/barge/NettyRaftModule.java b/barge-rpc-proto/src/main/java/org/robotninjas/barge/NettyRaftModule.java index c1c2c66..63a294a 100644 --- a/barge-rpc-proto/src/main/java/org/robotninjas/barge/NettyRaftModule.java +++ b/barge-rpc-proto/src/main/java/org/robotninjas/barge/NettyRaftModule.java @@ -2,9 +2,11 @@ import com.google.inject.PrivateModule; +import org.robotninjas.barge.RaftCoreModule.Builder; import org.robotninjas.barge.state.AbstractListenersModule; import java.io.File; +import java.util.concurrent.Executor; public class NettyRaftModule extends PrivateModule { @@ -13,12 +15,14 @@ public class NettyRaftModule extends PrivateModule { private final File logDir; private final StateMachine stateMachine; private final long timeout; + private final Executor executor; - public NettyRaftModule(NettyClusterConfig config, File logDir, StateMachine stateMachine, long timeout) { + public NettyRaftModule(NettyClusterConfig config, File logDir, StateMachine stateMachine, long timeout, Executor executor) { this.config = config; this.logDir = logDir; this.stateMachine = stateMachine; this.timeout = timeout; + this.executor = executor; } @Override @@ -29,12 +33,17 @@ protected void configureListeners() { } }); - install(RaftCoreModule.builder() - .withTimeout(timeout) - .withConfig(config) - .withLogDir(logDir) - .withStateMachine(stateMachine) - .build()); + Builder builder = RaftCoreModule.builder() + .withTimeout(timeout) + .withConfig(config) + .withLogDir(logDir) + .withStateMachine(stateMachine); + + if (executor != null) { + builder.withExecutor(executor); + } + + install(builder.build()); install(new RaftProtoRpcModule(config.local())); diff --git a/barge-rpc-proto/src/main/java/org/robotninjas/barge/NettyRaftService.java b/barge-rpc-proto/src/main/java/org/robotninjas/barge/NettyRaftService.java index eb67899..f541fd3 100644 --- a/barge-rpc-proto/src/main/java/org/robotninjas/barge/NettyRaftService.java +++ b/barge-rpc-proto/src/main/java/org/robotninjas/barge/NettyRaftService.java @@ -33,6 +33,7 @@ import javax.inject.Inject; import java.io.File; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Throwables.propagate; @@ -129,6 +130,7 @@ public static class Builder { private final NettyClusterConfig config; private File logDir = Files.createTempDir(); private long timeout = TIMEOUT; + private Executor executor; private StateTransitionListener listener; protected Builder(NettyClusterConfig config) { @@ -145,9 +147,14 @@ public Builder logDir(File logDir) { return this; } + public Builder executor(Executor executor) { + this.executor = executor; + return this; + } + public NettyRaftService build(StateMachine stateMachine) { NettyRaftService nettyRaftService = Guice.createInjector( - new NettyRaftModule(config, logDir, stateMachine, timeout)) + new NettyRaftModule(config, logDir, stateMachine, timeout, executor)) .getInstance(NettyRaftService.class); if (listener != null) { From 03ea1a2082af9da7d83adbdd65f123658b410949 Mon Sep 17 00:00:00 2001 From: Dave Rusek Date: Wed, 10 Dec 2014 17:00:55 -0700 Subject: [PATCH 2/2] Upgrade dependencies (Christian Weisskopf) --- barge-core/pom.xml | 3 +- .../org/robotninjas/barge/BatchExecutor.java | 2 +- barge-jax-rs/pom.xml | 16 +++++--- pom.xml | 38 ++++++++++--------- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/barge-core/pom.xml b/barge-core/pom.xml index 5d86216..47199c2 100644 --- a/barge-core/pom.xml +++ b/barge-core/pom.xml @@ -85,7 +85,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 2.10 + 2.13 @@ -112,6 +112,7 @@ org.jacoco jacoco-maven-plugin + 0.7.2.201409121644 jacoco-initialize diff --git a/barge-core/src/main/java/org/robotninjas/barge/BatchExecutor.java b/barge-core/src/main/java/org/robotninjas/barge/BatchExecutor.java index 2d0fa8e..f9a5211 100644 --- a/barge-core/src/main/java/org/robotninjas/barge/BatchExecutor.java +++ b/barge-core/src/main/java/org/robotninjas/barge/BatchExecutor.java @@ -15,7 +15,7 @@ class BatchExecutor extends BatchExecutorImpl { @Override public void execute(EventReader toExecute) { - Optional oldContext = Optional.fromNullable(MDC.getCopyOfContextMap()); + Optional> oldContext = Optional.fromNullable(MDC.getCopyOfContextMap()); MDC.setContextMap(contextMap); super.execute(toExecute); diff --git a/barge-jax-rs/pom.xml b/barge-jax-rs/pom.xml index 00eed4f..5158f67 100644 --- a/barge-jax-rs/pom.xml +++ b/barge-jax-rs/pom.xml @@ -49,7 +49,7 @@ org.slf4j jul-to-slf4j - 1.7.4 + ${slf4j.version} @@ -62,7 +62,7 @@ org.eclipse.jetty.websocket websocket-api - 9.1.0.v20131115 + ${jetty.version} @@ -75,13 +75,13 @@ org.eclipse.jetty.websocket websocket-server - 9.1.0.v20131115 + ${jetty.version} org.eclipse.jetty.websocket websocket-client - 9.1.0.v20131115 + ${jetty.version} test @@ -131,7 +131,7 @@ maven-shade-plugin - 2.1 + 2.3 package @@ -139,6 +139,12 @@ shade + + + org.glassfish.hk2.external:aopalliance-repackaged + org.glassfish.hk2.external:javax.inject + + *:* diff --git a/pom.xml b/pom.xml index be7dc93..30b088f 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,11 @@ + UTF-8 + ${project.encoding} + 1.7.7 + 3.0 + 9.2.5.v20141112 2.8 2.2.2 @@ -75,37 +80,37 @@ com.google.protobuf protobuf-java - 2.5.0 + 2.6.1 com.google.guava guava - 15.0 + 18.0 com.google.inject guice - 3.0 + ${guice.version} com.google.inject.extensions guice-assistedinject - 3.0 + ${guice.version} com.google.inject.extensions guice-multibindings - 3.0 + ${guice.version} org.slf4j slf4j-api - 1.7.5 + ${slf4j.version} @@ -117,7 +122,7 @@ com.github.sbtourist journalio - 1.4.1 + 1.4.2 @@ -167,7 +172,7 @@ com.google.code.findbugs jsr305 - 1.3.9 + 3.0.0 compile true @@ -176,7 +181,7 @@ ch.qos.logback logback-classic - 1.0.11 + 1.1.2 runtime true @@ -184,7 +189,7 @@ org.javassist javassist - 3.18.1-GA + 3.18.2-GA runtime true @@ -193,38 +198,37 @@ junit junit - 4.9 + 4.11 test org.mockito mockito-all - 1.8.0 + 1.10.8 test org.assertj assertj-core - 1.5.0 + 1.7.0 test - + org.apache.maven.plugins maven-compiler-plugin - 2.5.1 + 3.2 1.7 1.7 - UTF-8 @@ -246,7 +250,7 @@ maven-assembly-plugin - 2.2-beta-2 + 2.5.2