* Storage takes care of the saving of setting when a new replica is added * Restore replicas at startup * Modify interactive_mg_runner + memgraph to support that data-directory can be configured in CONTEXT * Extend e2e test * Correct typo * Add flag to config to specify when replication should be stored (true by default when starting Memgraph) * Remove un-necessary "--" in yaml file * Make sure Memgraph stops if a replica can't be restored. * Add UT covering the parsing of ReplicaStatus to/from json * Add assert in e2e script to check that a port is free before using it * Add test covering crash on Jepsen * Make sure applciaiton crashes if it starts on corrupted replications' info Starting with a non-reponsive replica is allowed. * Add temporary startup flag: this is needed so jepsen do not automatically restore replica on startup of main. This will be removed in T0835
84 lines
3.1 KiB
C++
84 lines
3.1 KiB
C++
// Copyright 2022 Memgraph Ltd.
|
|
//
|
|
// Use of this software is governed by the Business Source License
|
|
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
|
|
// License, and you may not use this file except in compliance with the Business Source License.
|
|
//
|
|
// As of the Change Date specified in that file, in accordance with
|
|
// the Business Source License, use of this software will be governed
|
|
// by the Apache License, Version 2.0, included in the file
|
|
// licenses/APL.txt.
|
|
|
|
#include "storage/v2/replication/replication_persistence_helper.hpp"
|
|
#include "utils/logging.hpp"
|
|
|
|
namespace {
|
|
const std::string kReplicaName = "replica_name";
|
|
const std::string kIpAddress = "replica_ip_address";
|
|
const std::string kPort = "replica_port";
|
|
const std::string kSyncMode = "replica_sync_mode";
|
|
const std::string kCheckFrequency = "replica_check_frequency";
|
|
const std::string kSSLKeyFile = "replica_ssl_key_file";
|
|
const std::string kSSLCertFile = "replica_ssl_cert_file";
|
|
} // namespace
|
|
|
|
namespace memgraph::storage::replication {
|
|
|
|
nlohmann::json ReplicaStatusToJSON(ReplicaStatus &&status) {
|
|
auto data = nlohmann::json::object();
|
|
|
|
data[kReplicaName] = std::move(status.name);
|
|
data[kIpAddress] = std::move(status.ip_address);
|
|
data[kPort] = status.port;
|
|
data[kSyncMode] = status.sync_mode;
|
|
|
|
data[kCheckFrequency] = status.replica_check_frequency.count();
|
|
|
|
if (status.ssl.has_value()) {
|
|
data[kSSLKeyFile] = std::move(status.ssl->key_file);
|
|
data[kSSLCertFile] = std::move(status.ssl->cert_file);
|
|
} else {
|
|
data[kSSLKeyFile] = nullptr;
|
|
data[kSSLCertFile] = nullptr;
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
std::optional<ReplicaStatus> JSONToReplicaStatus(nlohmann::json &&data) {
|
|
ReplicaStatus replica_status;
|
|
|
|
const auto get_failed_message = [](const std::string_view message, const std::string_view nested_message) {
|
|
return fmt::format("Failed to deserialize replica's configuration: {} : {}", message, nested_message);
|
|
};
|
|
|
|
try {
|
|
data.at(kReplicaName).get_to(replica_status.name);
|
|
data.at(kIpAddress).get_to(replica_status.ip_address);
|
|
data.at(kPort).get_to(replica_status.port);
|
|
data.at(kSyncMode).get_to(replica_status.sync_mode);
|
|
|
|
replica_status.replica_check_frequency = std::chrono::seconds(data.at(kCheckFrequency));
|
|
|
|
const auto &key_file = data.at(kSSLKeyFile);
|
|
const auto &cert_file = data.at(kSSLCertFile);
|
|
|
|
MG_ASSERT(key_file.is_null() == cert_file.is_null());
|
|
|
|
if (!key_file.is_null()) {
|
|
replica_status.ssl = replication::ReplicationClientConfig::SSL{};
|
|
data.at(kSSLKeyFile).get_to(replica_status.ssl->key_file);
|
|
data.at(kSSLCertFile).get_to(replica_status.ssl->cert_file);
|
|
}
|
|
} catch (const nlohmann::json::type_error &exception) {
|
|
spdlog::error(get_failed_message("Invalid type conversion", exception.what()));
|
|
return std::nullopt;
|
|
} catch (const nlohmann::json::out_of_range &exception) {
|
|
spdlog::error(get_failed_message("Non existing field", exception.what()));
|
|
return std::nullopt;
|
|
}
|
|
|
|
return replica_status;
|
|
}
|
|
} // namespace memgraph::storage::replication
|