You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ya...@apache.org on 2016/07/08 17:54:36 UTC
mesos git commit: Fixed the flaky BusyMountPoint test.
Repository: mesos
Updated Branches:
refs/heads/master 96be2aab4 -> cc0d3fb14
Fixed the flaky BusyMountPoint test.
In GarbageCollectorIntegrationTest.BusyMountPoint there is
a race between the task creating a file and the test looking for it
which sometimes leads to assertion failure on the existence of the
file.
Review: https://reviews.apache.org/r/49520/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/cc0d3fb1
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/cc0d3fb1
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/cc0d3fb1
Branch: refs/heads/master
Commit: cc0d3fb1452058ff4ced078b3581faefab438972
Parents: 96be2aa
Author: Megha Sharma <ms...@apple.com>
Authored: Fri Jul 8 10:50:58 2016 -0700
Committer: Jiang Yan Xu <xu...@apple.com>
Committed: Fri Jul 8 10:53:42 2016 -0700
----------------------------------------------------------------------
src/tests/gc_tests.cpp | 71 +++++++++++++++++----------------------------
1 file changed, 26 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0d3fb1/src/tests/gc_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/gc_tests.cpp b/src/tests/gc_tests.cpp
index d6335dc..11a31db 100644
--- a/src/tests/gc_tests.cpp
+++ b/src/tests/gc_tests.cpp
@@ -32,6 +32,7 @@
#include <process/owned.hpp>
#include <process/pid.hpp>
#include <process/process.hpp>
+#include <process/timeout.hpp>
#include <stout/duration.hpp>
#include <stout/gtest.hpp>
@@ -71,6 +72,7 @@ using process::Clock;
using process::Future;
using process::Owned;
using process::PID;
+using process::Timeout;
using std::list;
using std::map;
@@ -852,38 +854,10 @@ TEST_F(GarbageCollectorIntegrationTest, Unschedule)
#ifdef __linux__
// In Mesos it's possible for tasks and isolators to lay down files
-// that are not deletable by GC. This test fixture verifies that GC
-// behaves correctly and makes sure the undeletable files from tests
-// are cleaned up during teardown.
-class ROOT_GarbageCollectorUndeletableFilesTest
- : public GarbageCollectorIntegrationTest
-{
-public:
- virtual void TearDown()
- {
- if (mountPoint.isSome()) {
- Try<Nothing> unmount = fs::unmount(
- mountPoint.get(),
- MNT_FORCE | MNT_DETACH);
- if (unmount.isError()) {
- LOG(ERROR) << "Failed to unmount '" << mountPoint.get()
- << "': " << unmount.error();
- }
- }
-
- GarbageCollectorIntegrationTest::TearDown();
- }
-
-protected:
- Option<string> mountPoint;
-};
-
-
-// This test runs a task that creates a busy mount point which is not
-// directly deletable by GC. We verify that GC deletes all files that
-// it's able to delete in the face of such errors.
-TEST_F(ROOT_GarbageCollectorUndeletableFilesTest,
- DISABLED_BusyMountPoint)
+// that are not deletable by GC. This test runs a task that creates a busy
+// mount point which is not directly deletable by GC. We verify that
+// GC deletes all files that it's able to delete in the face of such errors.
+TEST_F(GarbageCollectorIntegrationTest, ROOT_BusyMountPoint)
{
Try<Owned<cluster::Master>> master = StartMaster();
ASSERT_SOME(master);
@@ -915,21 +889,22 @@ TEST_F(ROOT_GarbageCollectorUndeletableFilesTest,
AWAIT_READY(frameworkId);
AWAIT_READY(offers);
EXPECT_FALSE(offers.get().empty());
+
const Offer& offer = offers.get()[0];
SlaveID slaveId = offer.slave_id();
// The busy mount point goes before the regular file in GC's
// directory traversal due to their names. This makes sure that
// an error occurs before all deletable files are GCed.
- string mountPoint_ = "test1";
+ string mountPoint = "test1";
string regularFile = "test2.txt";
TaskInfo task = createTask(
slaveId,
Resources::parse("cpus:1;mem:128;disk:1").get(),
"touch "+ regularFile + "; "
- "mkdir " + mountPoint_ + "; "
- "mount --bind " + mountPoint_ + " " + mountPoint_,
+ "mkdir " + mountPoint + "; "
+ "mount --bind " + mountPoint + " " + mountPoint,
None(),
"test-task123",
"test-task123");
@@ -951,22 +926,28 @@ TEST_F(ROOT_GarbageCollectorUndeletableFilesTest,
ExecutorID executorId;
executorId.set_value("test-task123");
- Result<string> sandbox_ = os::realpath(slave::paths::getExecutorLatestRunPath(
+ Result<string> _sandbox = os::realpath(slave::paths::getExecutorLatestRunPath(
flags.work_dir,
slaveId,
frameworkId.get(),
executorId));
- ASSERT_SOME(sandbox_);
- string sandbox = sandbox_.get();
- // Register the mount point for cleanup.
- mountPoint = Option<string>(path::join(sandbox, mountPoint_));
-
+ ASSERT_SOME(_sandbox);
+ string sandbox = _sandbox.get();
EXPECT_TRUE(os::exists(sandbox));
- EXPECT_TRUE(os::exists(path::join(sandbox, mountPoint_)));
- EXPECT_TRUE(os::exists(path::join(sandbox, regularFile)));
+
+ // Wait for the task to create these paths.
+ Timeout timeout = Timeout::in(Seconds(15));
+ while (!os::exists(path::join(sandbox, mountPoint)) ||
+ !os::exists(path::join(sandbox, regularFile)) ||
+ !timeout.expired()) {
+ os::sleep(Milliseconds(10));
+ }
+
+ ASSERT_TRUE(os::exists(path::join(sandbox, mountPoint)));
+ ASSERT_TRUE(os::exists(path::join(sandbox, regularFile)));
AWAIT_READY(status2);
- EXPECT_EQ(task.task_id(), status2.get().task_id());
+ ASSERT_EQ(task.task_id(), status2.get().task_id());
EXPECT_EQ(TASK_FINISHED, status2.get().state());
AWAIT_READY(schedule);
@@ -976,7 +957,7 @@ TEST_F(ROOT_GarbageCollectorUndeletableFilesTest,
Clock::settle();
EXPECT_TRUE(os::exists(sandbox));
- EXPECT_TRUE(os::exists(path::join(sandbox, mountPoint_)));
+ EXPECT_TRUE(os::exists(path::join(sandbox, mountPoint)));
EXPECT_FALSE(os::exists(path::join(sandbox, regularFile)));
Clock::resume();