You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2014/02/28 02:06:37 UTC

git commit: Enforced log coordinator demotion after a write is discarded.

Repository: mesos
Updated Branches:
  refs/heads/master 2159b55f9 -> 8b1b7d4fb


Enforced log coordinator demotion after a write is discarded.

Review: https://reviews.apache.org/r/18488


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8b1b7d4f
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8b1b7d4f
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8b1b7d4f

Branch: refs/heads/master
Commit: 8b1b7d4fb84b8b4bfeae7d2f1bcb31a9fa568452
Parents: 2159b55
Author: Jie Yu <yu...@gmail.com>
Authored: Tue Feb 25 15:19:41 2014 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Feb 27 17:06:04 2014 -0800

----------------------------------------------------------------------
 src/log/coordinator.cpp |  7 ++++++-
 src/tests/log_tests.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/8b1b7d4f/src/log/coordinator.cpp
----------------------------------------------------------------------
diff --git a/src/log/coordinator.cpp b/src/log/coordinator.cpp
index 52e8305..6bfff1e 100644
--- a/src/log/coordinator.cpp
+++ b/src/log/coordinator.cpp
@@ -414,7 +414,12 @@ void CoordinatorProcess::writingFailed()
 void CoordinatorProcess::writingAborted()
 {
   CHECK_EQ(state, WRITING);
-  state = ELECTED;
+
+  // Demote the coordinator if a write operation is discarded since we
+  // don't actually know the write was successful or not and we really
+  // need to "catch-up" that position before we try and do another
+  // write (see MESOS-1038 for more details).
+  state = INITIAL;
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/8b1b7d4f/src/tests/log_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/log_tests.cpp b/src/tests/log_tests.cpp
index 1e59b24..0e2485f 100644
--- a/src/tests/log_tests.cpp
+++ b/src/tests/log_tests.cpp
@@ -707,6 +707,55 @@ TEST_F(CoordinatorTest, AppendReadError)
 }
 
 
+TEST_F(CoordinatorTest, AppendDiscarded)
+{
+  const string path1 = os::getcwd() + "/.log1";
+  initializer.flags.path = path1;
+  initializer.execute();
+
+  const string path2 = os::getcwd() + "/.log2";
+  initializer.flags.path = path2;
+  initializer.execute();
+
+  Shared<Replica> replica1(new Replica(path1));
+  Shared<Replica> replica2(new Replica(path2));
+
+  set<UPID> pids;
+  pids.insert(replica1->pid());
+  pids.insert(replica2->pid());
+
+  Shared<Network> network(new Network(pids));
+
+  Coordinator coord(2, replica1, network);
+
+  {
+    Future<Option<uint64_t> > electing = coord.elect();
+    AWAIT_READY_FOR(electing, Seconds(10));
+    ASSERT_SOME(electing.get());
+    EXPECT_EQ(0u, electing.get().get());
+  }
+
+  process::terminate(replica2->pid());
+  process::wait(replica2->pid());
+  replica2.reset();
+
+  {
+    Future<uint64_t> appending = coord.append("hello world");
+    ASSERT_TRUE(appending.isPending());
+
+    appending.discard();
+    AWAIT_DISCARDED(appending);
+  }
+
+  {
+    Future<uint64_t> appending = coord.append("hello moto");
+    AWAIT_FAILED(appending);
+
+    EXPECT_EQ("Coordinator is not elected", appending.failure());
+  }
+}
+
+
 TEST_F(CoordinatorTest, ElectNoQuorum)
 {
   const string path = os::getcwd() + "/.log";