2020-10-30 14:16:47 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <Common/ThreadPool.h>
|
|
|
|
#include <Common/ZooKeeper/IKeeper.h>
|
|
|
|
#include <Common/ConcurrentBoundedQueue.h>
|
|
|
|
#include <Common/ZooKeeper/ZooKeeperCommon.h>
|
2020-11-19 16:06:19 +00:00
|
|
|
#include <unordered_map>
|
|
|
|
#include <unordered_set>
|
2021-01-19 15:51:52 +00:00
|
|
|
#include <vector>
|
2020-10-30 14:16:47 +00:00
|
|
|
|
|
|
|
namespace zkutil
|
|
|
|
{
|
|
|
|
|
|
|
|
using namespace DB;
|
2020-11-03 14:49:30 +00:00
|
|
|
struct TestKeeperStorageRequest;
|
|
|
|
using TestKeeperStorageRequestPtr = std::shared_ptr<TestKeeperStorageRequest>;
|
2020-11-10 13:43:10 +00:00
|
|
|
using ResponseCallback = std::function<void(const Coordination::ZooKeeperResponsePtr &)>;
|
2020-10-30 14:16:47 +00:00
|
|
|
|
|
|
|
class TestKeeperStorage
|
|
|
|
{
|
2020-10-30 19:57:30 +00:00
|
|
|
public:
|
2021-01-21 13:53:10 +00:00
|
|
|
int64_t session_id_counter{0};
|
2020-10-30 14:16:47 +00:00
|
|
|
|
|
|
|
struct Node
|
|
|
|
{
|
|
|
|
String data;
|
|
|
|
Coordination::ACLs acls;
|
|
|
|
bool is_ephemeral = false;
|
|
|
|
bool is_sequental = false;
|
|
|
|
Coordination::Stat stat{};
|
|
|
|
int32_t seq_num = 0;
|
|
|
|
};
|
|
|
|
|
2021-01-19 14:22:28 +00:00
|
|
|
struct ResponseForSession
|
|
|
|
{
|
|
|
|
int64_t session_id;
|
|
|
|
Coordination::ZooKeeperResponsePtr response;
|
|
|
|
};
|
|
|
|
|
2021-01-19 14:45:45 +00:00
|
|
|
using ResponsesForSessions = std::vector<ResponseForSession>;
|
2021-01-19 14:22:28 +00:00
|
|
|
|
|
|
|
struct RequestForSession
|
2020-11-26 14:57:32 +00:00
|
|
|
{
|
|
|
|
int64_t session_id;
|
2021-01-19 14:22:28 +00:00
|
|
|
Coordination::ZooKeeperRequestPtr request;
|
2020-11-26 14:57:32 +00:00
|
|
|
};
|
|
|
|
|
2021-01-19 14:45:45 +00:00
|
|
|
using RequestsForSessions = std::vector<RequestForSession>;
|
2021-01-19 14:22:28 +00:00
|
|
|
|
2020-10-30 14:16:47 +00:00
|
|
|
using Container = std::map<std::string, Node>;
|
2020-11-19 16:06:19 +00:00
|
|
|
using Ephemerals = std::unordered_map<int64_t, std::unordered_set<String>>;
|
2020-11-26 14:57:32 +00:00
|
|
|
using SessionAndWatcher = std::unordered_map<int64_t, std::unordered_set<String>>;
|
2021-01-19 14:22:28 +00:00
|
|
|
using SessionIDs = std::vector<int64_t>;
|
2020-10-30 14:16:47 +00:00
|
|
|
|
2021-01-19 14:22:28 +00:00
|
|
|
using Watches = std::map<String /* path, relative of root_path */, SessionIDs>;
|
2020-10-30 14:16:47 +00:00
|
|
|
|
|
|
|
Container container;
|
2020-11-19 16:06:19 +00:00
|
|
|
Ephemerals ephemerals;
|
2020-11-26 14:57:32 +00:00
|
|
|
SessionAndWatcher sessions_and_watchers;
|
2020-10-30 14:16:47 +00:00
|
|
|
|
2021-01-21 13:53:10 +00:00
|
|
|
int64_t zxid{0};
|
|
|
|
bool finalized{false};
|
2020-10-30 14:16:47 +00:00
|
|
|
|
|
|
|
Watches watches;
|
|
|
|
Watches list_watches; /// Watches for 'list' request (watches on children).
|
|
|
|
|
2021-01-19 14:22:28 +00:00
|
|
|
void clearDeadWatches(int64_t session_id);
|
2020-10-30 14:16:47 +00:00
|
|
|
|
2021-01-19 14:22:28 +00:00
|
|
|
int64_t getZXID()
|
2020-10-30 14:16:47 +00:00
|
|
|
{
|
2021-01-21 13:53:10 +00:00
|
|
|
return zxid++;
|
2021-01-19 14:22:28 +00:00
|
|
|
}
|
2020-10-30 14:16:47 +00:00
|
|
|
|
|
|
|
public:
|
2020-11-03 14:49:30 +00:00
|
|
|
TestKeeperStorage();
|
2021-01-19 14:22:28 +00:00
|
|
|
|
2021-01-21 14:34:34 +00:00
|
|
|
int64_t getSessionID()
|
|
|
|
{
|
|
|
|
return session_id_counter++;
|
|
|
|
}
|
2021-01-19 14:22:28 +00:00
|
|
|
ResponsesForSessions processRequest(const Coordination::ZooKeeperRequestPtr & request, int64_t session_id);
|
|
|
|
ResponsesForSessions finalize(const RequestsForSessions & expired_requests);
|
2020-10-30 14:16:47 +00:00
|
|
|
};
|
2020-11-11 13:55:28 +00:00
|
|
|
|
2020-10-30 14:16:47 +00:00
|
|
|
}
|