fc20ddcd25
Summary: Start removal of old logic Remove more obsolete classes Move Message class to RPC Remove client logic from system Remove messaging namespace Move protocol from messaging to rpc Move System from messaging to rpc Remove unnecessary namespace Remove System from RPC Client Split Client and Server into separate files Start implementing new client logic First semi-working state Changed network protocol layout Rewrite client Fix client receive bug Cleanup code of debug lines Migrate to accessors Migrate back to binary boost archives Remove debug logging from server Disable timeout test Reduce message_id from uint64_t to uint32_t Add multiple workers to server Fix compiler warnings Apply clang-format Reviewers: teon.banek, florijan, dgleich, buda, mtomic Reviewed By: teon.banek Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D1129
117 lines
3.5 KiB
C++
117 lines
3.5 KiB
C++
#include <experimental/optional>
|
|
#include <memory>
|
|
#include <thread>
|
|
#include <unordered_set>
|
|
#include <vector>
|
|
|
|
#include "gmock/gmock.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
#include "communication/rpc/server.hpp"
|
|
#include "distributed/coordination_master.hpp"
|
|
#include "distributed/coordination_worker.hpp"
|
|
#include "io/network/endpoint.hpp"
|
|
|
|
using communication::rpc::System;
|
|
using namespace distributed;
|
|
using namespace std::literals::chrono_literals;
|
|
|
|
const int kWorkerCount = 5;
|
|
const std::string kLocal = "127.0.0.1";
|
|
|
|
class WorkerInThread {
|
|
public:
|
|
WorkerInThread(io::network::Endpoint master_endpoint, int desired_id = -1) {
|
|
worker_thread_ = std::thread([this, master_endpoint, desired_id] {
|
|
system_.emplace(Endpoint(kLocal, 0));
|
|
coord_.emplace(*system_, master_endpoint);
|
|
worker_id_ = coord_->RegisterWorker(desired_id);
|
|
coord_->WaitForShutdown();
|
|
});
|
|
}
|
|
|
|
int worker_id() const { return worker_id_; }
|
|
auto endpoint() const { return system_->endpoint(); }
|
|
auto worker_endpoint(int worker_id) { return coord_->GetEndpoint(worker_id); }
|
|
void join() { worker_thread_.join(); }
|
|
|
|
private:
|
|
std::thread worker_thread_;
|
|
std::experimental::optional<System> system_;
|
|
std::experimental::optional<WorkerCoordination> coord_;
|
|
std::atomic<int> worker_id_{0};
|
|
};
|
|
|
|
TEST(Distributed, Coordination) {
|
|
System master_system({kLocal, 0});
|
|
std::vector<std::unique_ptr<WorkerInThread>> workers;
|
|
{
|
|
MasterCoordination master_coord(master_system);
|
|
|
|
for (int i = 0; i < kWorkerCount; ++i)
|
|
workers.emplace_back(
|
|
std::make_unique<WorkerInThread>(master_system.endpoint()));
|
|
|
|
// Wait till all the workers are safely initialized.
|
|
std::this_thread::sleep_for(300ms);
|
|
|
|
// Expect that all workers have a different ID.
|
|
std::unordered_set<int> worker_ids;
|
|
for (const auto &w : workers) worker_ids.insert(w->worker_id());
|
|
EXPECT_EQ(worker_ids.size(), kWorkerCount);
|
|
|
|
// Check endpoints.
|
|
for (auto &w1 : workers) {
|
|
for (auto &w2 : workers) {
|
|
EXPECT_EQ(w1->worker_endpoint(w2->worker_id()), w2->endpoint());
|
|
}
|
|
}
|
|
} // Coordinated shutdown.
|
|
|
|
for (auto &worker : workers) worker->join();
|
|
}
|
|
|
|
TEST(Distributed, DesiredAndUniqueId) {
|
|
System master_system({kLocal, 0});
|
|
std::vector<std::unique_ptr<WorkerInThread>> workers;
|
|
{
|
|
MasterCoordination master_coord(master_system);
|
|
|
|
workers.emplace_back(
|
|
std::make_unique<WorkerInThread>(master_system.endpoint(), 42));
|
|
std::this_thread::sleep_for(200ms);
|
|
workers.emplace_back(
|
|
std::make_unique<WorkerInThread>(master_system.endpoint(), 42));
|
|
std::this_thread::sleep_for(200ms);
|
|
|
|
EXPECT_EQ(workers[0]->worker_id(), 42);
|
|
EXPECT_NE(workers[1]->worker_id(), 42);
|
|
}
|
|
|
|
for (auto &worker : workers) worker->join();
|
|
}
|
|
|
|
TEST(Distributed, CoordinationWorkersId) {
|
|
System master_system({kLocal, 0});
|
|
std::vector<std::unique_ptr<WorkerInThread>> workers;
|
|
{
|
|
MasterCoordination master_coord(master_system);
|
|
|
|
workers.emplace_back(
|
|
std::make_unique<WorkerInThread>(master_system.endpoint(), 42));
|
|
std::this_thread::sleep_for(200ms);
|
|
workers.emplace_back(
|
|
std::make_unique<WorkerInThread>(master_system.endpoint(), 42));
|
|
std::this_thread::sleep_for(200ms);
|
|
|
|
std::vector<int> ids;
|
|
ids.push_back(0);
|
|
|
|
for (auto &worker : workers) ids.push_back(worker->worker_id());
|
|
EXPECT_THAT(master_coord.GetWorkerIds(),
|
|
testing::UnorderedElementsAreArray(ids));
|
|
}
|
|
|
|
for (auto &worker : workers) worker->join();
|
|
}
|