Repository: mesos Updated Branches: refs/heads/master 18b488ff9 -> 11f2f7ef3
Add a temporary filter for overlay backend related tests. This is a temporary filter to disable tests that use overlay as backend on filesystems where `d_type` support is missing. In particular, many XFS nodes are known to have this issue. Review: https://reviews.apache.org/r/64232/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/11f2f7ef Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/11f2f7ef Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/11f2f7ef Branch: refs/heads/master Commit: 11f2f7ef30946093b9d584ea17232bc6e9fa0e97 Parents: 18b488f Author: Meng Zhu <[email protected]> Authored: Fri Dec 1 22:35:27 2017 -0800 Committer: Gilbert Song <[email protected]> Committed: Fri Dec 1 22:35:27 2017 -0800 ---------------------------------------------------------------------- .../containerizer/provisioner_docker_tests.cpp | 4 +- src/tests/environment.cpp | 74 ++++++++++++++++++++ 2 files changed, 76 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/11f2f7ef/src/tests/containerizer/provisioner_docker_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/containerizer/provisioner_docker_tests.cpp b/src/tests/containerizer/provisioner_docker_tests.cpp index 832c81f..13f5350 100644 --- a/src/tests/containerizer/provisioner_docker_tests.cpp +++ b/src/tests/containerizer/provisioner_docker_tests.cpp @@ -672,7 +672,7 @@ INSTANTIATE_TEST_CASE_P( // This test verifies that a docker image containing whiteout files // will be processed correctly by copy, aufs and overlay backends. -TEST_P(ProvisionerDockerBackendTest, ROOT_INTERNET_CURL_Whiteout) +TEST_P(ProvisionerDockerBackendTest, ROOT_INTERNET_CURL_DTYPE_Whiteout) { Try<Owned<cluster::Master>> master = StartMaster(); ASSERT_SOME(master); @@ -760,7 +760,7 @@ TEST_P(ProvisionerDockerBackendTest, ROOT_INTERNET_CURL_Whiteout) // This test verifies that the provisioner correctly overwrites a // directory in underlying layers with a with a regular file or symbolic // link of the same name in an upper layer, and vice versa. -TEST_P(ProvisionerDockerBackendTest, ROOT_INTERNET_CURL_Overwrite) +TEST_P(ProvisionerDockerBackendTest, ROOT_INTERNET_CURL_DTYPE_Overwrite) { Try<Owned<cluster::Master>> master = StartMaster(); ASSERT_SOME(master); http://git-wip-us.apache.org/repos/asf/mesos/blob/11f2f7ef/src/tests/environment.cpp ---------------------------------------------------------------------- diff --git a/src/tests/environment.cpp b/src/tests/environment.cpp index 607ac6c..72bd621 100644 --- a/src/tests/environment.cpp +++ b/src/tests/environment.cpp @@ -317,6 +317,79 @@ private: }; +// Note: This is a temporary filter to disable tests that use +// overlay as backend on filesystems where `d_type` support is +// missing. In particular, many XFS nodes are known to have this +// issue due to mkfs option with `f_type = 0`. Please see +// MESOS-8121 for more info. +// +// This filter assumes that the affected tests will use +// `/tmp` as root directory of the agent's work dir. +class DtypeFilter : public TestFilter +{ +public: + DtypeFilter() + { +#ifdef __linux__ + auto checkDirDtype = [this](const string& directory) { + string probeDir = path::join(directory, ".probe"); + + Try<Nothing> mkdir = os::mkdir(probeDir); + if (mkdir.isError()) { + dtypeError = Error( + "Cannot verify filesystem d_type attribute: " + "Failed to create temporary directory '" + + probeDir + "': " + mkdir.error()); + } + + Try<bool> supportDType = fs::dtypeSupported(directory); + + // Clean up the temporary directory that is used + // for d_type detection. + Try<Nothing> rmdir = os::rmdir(probeDir); + if (rmdir.isError()) { + LOG(WARNING) << "Failed to remove temporary directory" + << "' " << probeDir << "': " << rmdir.error(); + } + + if (supportDType.isError()) { + dtypeError = Error( + "Cannot verify filesystem d_type attribute: " + + supportDType.error()); + } + + if (!supportDType.get()) { + dtypeError = Error( + "The underlying filesystem of " + directory + + " misses d_type support."); + } + }; + + // TODO(mzhu): Avoid hard coding a specific directory for + // filtering. This is a temporary solution. + checkDirDtype(os::temp()); + + if (dtypeError.isSome()) { + std::cerr + << "-------------------------------------------------------------\n" + << "We cannot run any overlay backend tests because:\n" + << dtypeError.get().message << "\n" + << "-------------------------------------------------------------\n"; + return; + } +#endif + } + + bool disable(const ::testing::TestInfo* test) const + { + return dtypeError.isSome() && matches(test, "DTYPE_"); + } + +private: + Option<Error> dtypeError; +}; + + class InternetFilter : public TestFilter { public: @@ -692,6 +765,7 @@ Environment::Environment(const Flags& _flags) std::make_shared<CgroupsFilter>(), std::make_shared<CurlFilter>(), std::make_shared<DockerFilter>(), + std::make_shared<DtypeFilter>(), std::make_shared<InternetFilter>(), std::make_shared<LogrotateFilter>(), std::make_shared<NetcatFilter>(),
