Passed on registrar when constructing resource provider manager. In order to support recovering resource provider manager information in the future, we need to adjust the construction of the manager to be able to consume a registrar.
This patch lays the groundwork by adjusting interfaces and their usage; we will make use of the passed on information in a following patch. Review: https://reviews.apache.org/r/66310/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2d81d7ce Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2d81d7ce Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2d81d7ce Branch: refs/heads/master Commit: 2d81d7ce72f68ddc981c0d3c28f4f4c1654dd516 Parents: e286bbf Author: Benjamin Bannier <benjamin.bann...@mesosphere.io> Authored: Tue May 1 13:09:08 2018 -0700 Committer: Chun-Hung Hsiao <chhs...@mesosphere.io> Committed: Tue May 1 13:09:08 2018 -0700 ---------------------------------------------------------------------- src/resource_provider/manager.cpp | 15 +++++++---- src/resource_provider/manager.hpp | 5 +++- src/resource_provider/registrar.cpp | 5 +++- src/slave/slave.cpp | 31 +++++++++++++++++++++- src/tests/resource_provider_manager_tests.cpp | 28 ++++++++++++------- 5 files changed, 67 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/2d81d7ce/src/resource_provider/manager.cpp ---------------------------------------------------------------------- diff --git a/src/resource_provider/manager.cpp b/src/resource_provider/manager.cpp index 4128808..67dbfbe 100644 --- a/src/resource_provider/manager.cpp +++ b/src/resource_provider/manager.cpp @@ -58,6 +58,7 @@ using mesos::internal::resource_provider::validation::call::validate; using mesos::resource_provider::Call; using mesos::resource_provider::Event; +using mesos::resource_provider::Registrar; using process::Failure; using process::Future; @@ -157,7 +158,7 @@ class ResourceProviderManagerProcess : public Process<ResourceProviderManagerProcess> { public: - ResourceProviderManagerProcess(); + ResourceProviderManagerProcess(Owned<Registrar> _registrar); Future<http::Response> api( const http::Request& request, @@ -212,9 +213,13 @@ private: }; -ResourceProviderManagerProcess::ResourceProviderManagerProcess() +ResourceProviderManagerProcess::ResourceProviderManagerProcess( + Owned<Registrar> _registrar) : ProcessBase(process::ID::generate("resource-provider-manager")), - metrics(*this) {} + metrics(*this) +{ + CHECK_NOTNULL(_registrar.get()); +} Future<http::Response> ResourceProviderManagerProcess::api( @@ -763,8 +768,8 @@ ResourceProviderManagerProcess::Metrics::~Metrics() } -ResourceProviderManager::ResourceProviderManager() - : process(new ResourceProviderManagerProcess()) +ResourceProviderManager::ResourceProviderManager(Owned<Registrar> registrar) + : process(new ResourceProviderManagerProcess(std::move(registrar))) { spawn(CHECK_NOTNULL(process.get())); } http://git-wip-us.apache.org/repos/asf/mesos/blob/2d81d7ce/src/resource_provider/manager.hpp ---------------------------------------------------------------------- diff --git a/src/resource_provider/manager.hpp b/src/resource_provider/manager.hpp index bc017fa..6c57956 100644 --- a/src/resource_provider/manager.hpp +++ b/src/resource_provider/manager.hpp @@ -26,6 +26,7 @@ #include "messages/messages.hpp" #include "resource_provider/message.hpp" +#include "resource_provider/registrar.hpp" namespace mesos { namespace internal { @@ -37,7 +38,9 @@ class ResourceProviderManagerProcess; class ResourceProviderManager { public: - ResourceProviderManager(); + ResourceProviderManager( + process::Owned<resource_provider::Registrar> registrar); + ~ResourceProviderManager(); ResourceProviderManager( http://git-wip-us.apache.org/repos/asf/mesos/blob/2d81d7ce/src/resource_provider/registrar.cpp ---------------------------------------------------------------------- diff --git a/src/resource_provider/registrar.cpp b/src/resource_provider/registrar.cpp index 53b403e..b151e2b 100644 --- a/src/resource_provider/registrar.cpp +++ b/src/resource_provider/registrar.cpp @@ -185,7 +185,10 @@ private: GenericRegistrarProcess::GenericRegistrarProcess(Owned<Storage> _storage) : ProcessBase(process::ID::generate("resource-provider-generic-registrar")), storage(std::move(_storage)), - state(storage.get()) {} + state(storage.get()) +{ + CHECK_NOTNULL(storage.get()); +} Future<Nothing> GenericRegistrarProcess::recover() http://git-wip-us.apache.org/repos/asf/mesos/blob/2d81d7ce/src/slave/slave.cpp ---------------------------------------------------------------------- diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp index d313777..6ca3d79 100644 --- a/src/slave/slave.cpp +++ b/src/slave/slave.cpp @@ -38,6 +38,9 @@ #include <mesos/module/authenticatee.hpp> +#include <mesos/state/leveldb.hpp> +#include <mesos/state/in_memory.hpp> + #include <mesos/resource_provider/storage/disk_profile_adaptor.hpp> #include <process/after.hpp> @@ -943,6 +946,10 @@ void Slave::finalize() shutdownFramework(UPID(), frameworkId); } } + + // Explicitly tear down the resource provider manager to ensure that the + // wrapped process is terminated and releases the underlying storage. + resourceProviderManager.reset(); } @@ -8802,7 +8809,29 @@ void Slave::initializeResourceProviderManager( return; } - resourceProviderManager.reset(new ResourceProviderManager()); + // The registrar uses LevelDB as underlying storage. Since LevelDB + // is currently not supported on Windows (see MESOS-5932), we fall + // back to in-memory storage there. + // + // TODO(bbannier): Remove this Windows workaround once MESOS-5932 is fixed. +#ifndef __WINDOWS__ + Owned<mesos::state::Storage> storage(new mesos::state::LevelDBStorage( + paths::getResourceProviderRegistryPath(flags.work_dir, slaveId))); +#else + LOG(WARNING) + << "Persisting resource provider manager state is not supported on Windows"; + Owned<mesos::state::Storage> storage(new mesos::state::InMemoryStorage()); +#endif // __WINDOWS__ + + Try<Owned<resource_provider::Registrar>> resourceProviderRegistrar = + resource_provider::Registrar::create(std::move(storage)); + + CHECK_SOME(resourceProviderRegistrar) + << "Could not construct resource provider registrar: " + << resourceProviderRegistrar.error(); + + resourceProviderManager.reset( + new ResourceProviderManager(std::move(resourceProviderRegistrar.get()))); if (capabilities.resourceProvider) { // Start listening for messages from the resource provider manager. http://git-wip-us.apache.org/repos/asf/mesos/blob/2d81d7ce/src/tests/resource_provider_manager_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/resource_provider_manager_tests.cpp b/src/tests/resource_provider_manager_tests.cpp index ceb7854..1664073 100644 --- a/src/tests/resource_provider_manager_tests.cpp +++ b/src/tests/resource_provider_manager_tests.cpp @@ -67,6 +67,7 @@ using mesos::master::detector::MasterDetector; using mesos::state::InMemoryStorage; using mesos::state::State; +using mesos::state::Storage; using mesos::resource_provider::AdmitResourceProvider; using mesos::resource_provider::Registrar; @@ -129,7 +130,8 @@ TEST_F(ResourceProviderManagerHttpApiTest, NoContentType) request.method = "POST"; request.headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL); - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Future<http::Response> response = manager.api(request, None()); @@ -154,7 +156,8 @@ TEST_F(ResourceProviderManagerHttpApiTest, ValidJsonButInvalidProtobuf) request.headers["Content-Type"] = APPLICATION_JSON; request.body = stringify(object); - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Future<http::Response> response = manager.api(request, None()); @@ -177,7 +180,8 @@ TEST_P(ResourceProviderManagerHttpApiTest, MalformedContent) request.headers["Content-Type"] = stringify(contentType); request.body = "MALFORMED_CONTENT"; - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Future<http::Response> response = manager.api(request, None()); @@ -223,7 +227,8 @@ TEST_P(ResourceProviderManagerHttpApiTest, UnsupportedContentMediaType) request.headers["Content-Type"] = unknownMediaType; request.body = serialize(contentType, call); - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Future<http::Response> response = manager.api(request, None()); @@ -235,7 +240,8 @@ TEST_P(ResourceProviderManagerHttpApiTest, UpdateState) { const ContentType contentType = GetParam(); - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Option<id::UUID> streamId; Option<mesos::v1::ResourceProviderID> resourceProviderId; @@ -342,7 +348,8 @@ TEST_P(ResourceProviderManagerHttpApiTest, UpdateOperationStatus) { const ContentType contentType = GetParam(); - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Option<id::UUID> streamId; Option<mesos::v1::ResourceProviderID> resourceProviderId; @@ -460,7 +467,8 @@ TEST_P(ResourceProviderManagerHttpApiTest, PublishResourcesSuccess) { const ContentType contentType = GetParam(); - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Option<id::UUID> streamId; Option<mesos::v1::ResourceProviderID> resourceProviderId; @@ -567,7 +575,8 @@ TEST_P(ResourceProviderManagerHttpApiTest, PublishResourcesFailure) { const ContentType contentType = GetParam(); - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Option<id::UUID> streamId; Option<mesos::v1::ResourceProviderID> resourceProviderId; @@ -674,7 +683,8 @@ TEST_P(ResourceProviderManagerHttpApiTest, PublishResourcesDisconnected) { const ContentType contentType = GetParam(); - ResourceProviderManager manager; + ResourceProviderManager manager( + Registrar::create(Owned<Storage>(new InMemoryStorage)).get()); Option<mesos::v1::ResourceProviderID> resourceProviderId; Option<http::Pipe::Reader> reader;