f53913e053
Summary: Created a new integration test for Raft protocol. The tests iterates through the Raft cluster and does the following: * kill machine `X` * execute a query * bring `X` back to life The first step is to insert a vertex in the cluster, and last step is to check if the cluster has all the data. I also edited some of the raft core files because this test surafaced some bugs. The `tester` binary is a hacked version of the HA client and so are the parts in the code that refuse to execute a query is the machine is not in `Leader` mode.o Those parts will go away once we have a proper HA client. I've run the `runner.py` for a while (215 times) ``` while ./runner.py &> log.txt; do echo -n "."; done ``` and it didn't break. Reviewers: ipaljak, mferencevic Reviewed By: ipaljak Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D1788
64 lines
1.5 KiB
C++
64 lines
1.5 KiB
C++
#include "gtest/gtest.h"
|
|
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include "durability/single_node_ha/state_delta.hpp"
|
|
#include "raft/raft_interface.hpp"
|
|
#include "transactions/single_node_ha/engine.hpp"
|
|
#include "transactions/transaction.hpp"
|
|
|
|
using namespace tx;
|
|
|
|
class RaftMock final : public raft::RaftInterface {
|
|
public:
|
|
void Emplace(const database::StateDelta &delta) override {
|
|
log_[delta.transaction_id].emplace_back(std::move(delta));
|
|
}
|
|
|
|
bool SafeToCommit(const tx::TransactionId &tx_id) override { return true; }
|
|
|
|
bool IsLeader() override { return true; }
|
|
|
|
std::vector<database::StateDelta> GetLogForTx(
|
|
const tx::TransactionId &tx_id) {
|
|
return log_[tx_id];
|
|
}
|
|
|
|
private:
|
|
std::unordered_map<tx::TransactionId, std::vector<database::StateDelta>> log_;
|
|
};
|
|
|
|
TEST(Engine, Reset) {
|
|
RaftMock raft;
|
|
Engine engine{&raft};
|
|
|
|
auto t0 = engine.Begin();
|
|
EXPECT_EQ(t0->id_, 1);
|
|
engine.Commit(*t0);
|
|
|
|
engine.Reset();
|
|
|
|
auto t1 = engine.Begin();
|
|
EXPECT_EQ(t1->id_, 1);
|
|
engine.Commit(*t1);
|
|
}
|
|
|
|
TEST(Engine, TxStateDelta) {
|
|
RaftMock raft;
|
|
Engine engine{&raft};
|
|
|
|
auto t0 = engine.Begin();
|
|
tx::TransactionId tx_id = t0->id_;
|
|
engine.Commit(*t0);
|
|
|
|
auto t0_log = raft.GetLogForTx(tx_id);
|
|
EXPECT_EQ(t0_log.size(), 2);
|
|
|
|
using Type = enum database::StateDelta::Type;
|
|
EXPECT_EQ(t0_log[0].type, Type::TRANSACTION_BEGIN);
|
|
EXPECT_EQ(t0_log[0].transaction_id, tx_id);
|
|
EXPECT_EQ(t0_log[1].type, Type::TRANSACTION_COMMIT);
|
|
EXPECT_EQ(t0_log[1].transaction_id, tx_id);
|
|
}
|