ClickHouse/src/Coordination/KeeperStorage.h

143 lines
3.7 KiB
C++
Raw Normal View History

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>
#include <Coordination/SessionExpiryQueue.h>
2021-02-26 13:53:34 +00:00
#include <Coordination/SnapshotableHashTable.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 DB
2020-10-30 14:16:47 +00:00
{
using namespace DB;
2021-03-29 08:24:56 +00:00
struct KeeperStorageRequest;
using KeeperStorageRequestPtr = std::shared_ptr<KeeperStorageRequest>;
2020-11-10 13:43:10 +00:00
using ResponseCallback = std::function<void(const Coordination::ZooKeeperResponsePtr &)>;
2021-02-19 07:25:55 +00:00
using ChildrenSet = std::unordered_set<std::string>;
2021-03-01 13:33:34 +00:00
using SessionAndTimeout = std::unordered_map<int64_t, int64_t>;
2021-03-29 08:24:56 +00:00
struct KeeperStorageSnapshot;
2020-10-30 14:16:47 +00:00
2021-03-29 08:24:56 +00:00
class KeeperStorage
2020-10-30 14:16:47 +00:00
{
2020-10-30 19:57:30 +00:00
public:
2021-02-26 13:53:34 +00:00
int64_t session_id_counter{1};
2020-10-30 14:16:47 +00:00
struct Node
{
String data;
2021-01-26 11:10:44 +00:00
Coordination::ACLs acls{};
2020-10-30 14:16:47 +00:00
bool is_sequental = false;
Coordination::Stat stat{};
int32_t seq_num = 0;
2021-02-19 09:24:50 +00:00
ChildrenSet children{};
2020-10-30 14:16:47 +00:00
};
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
2021-02-26 13:53:34 +00:00
using Container = SnapshotableHashTable<Node>;
using Ephemerals = std::unordered_map<int64_t, std::unordered_set<std::string>>;
using SessionAndWatcher = std::unordered_map<int64_t, std::unordered_set<std::string>>;
2021-01-19 14:22:28 +00:00
using SessionIDs = std::vector<int64_t>;
2020-10-30 14:16:47 +00:00
2021-05-21 21:19:22 +00:00
/// Just vector of SHA1 from user:password
using AuthIDs = std::vector<std::string>;
using SessionAndAuth = std::unordered_map<int64_t, AuthIDs>;
SessionAndAuth session_and_auth;
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
2021-05-21 21:19:22 +00:00
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;
SessionExpiryQueue session_expiry_queue;
SessionAndTimeout session_and_timeout;
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-02-25 08:34:05 +00:00
int64_t getZXID() const
2020-10-30 14:16:47 +00:00
{
2021-02-25 08:34:05 +00:00
return zxid;
2021-01-19 14:22:28 +00:00
}
2020-10-30 14:16:47 +00:00
public:
2021-03-29 08:24:56 +00:00
KeeperStorage(int64_t tick_time_ms);
2021-01-19 14:22:28 +00:00
2021-02-04 08:28:11 +00:00
int64_t getSessionID(int64_t session_timeout_ms)
2021-01-21 14:34:34 +00:00
{
auto result = session_id_counter++;
session_and_timeout.emplace(result, session_timeout_ms);
session_expiry_queue.update(result, session_timeout_ms);
return result;
2021-01-21 14:34:34 +00:00
}
2021-01-21 20:01:25 +00:00
2021-03-01 13:33:34 +00:00
void addSessionID(int64_t session_id, int64_t session_timeout_ms)
{
session_and_timeout.emplace(session_id, session_timeout_ms);
session_expiry_queue.update(session_id, session_timeout_ms);
}
2021-02-25 08:34:05 +00:00
ResponsesForSessions processRequest(const Coordination::ZooKeeperRequestPtr & request, int64_t session_id, std::optional<int64_t> new_last_zxid);
void finalize();
2021-02-26 14:54:59 +00:00
void enableSnapshotMode()
{
container.enableSnapshotMode();
}
void disableSnapshotMode()
{
container.disableSnapshotMode();
}
Container::const_iterator getSnapshotIteratorBegin() const
{
return container.begin();
}
void clearGarbageAfterSnapshot()
{
container.clearOutdatedNodes();
}
const SessionAndTimeout & getActiveSessions() const
{
return session_and_timeout;
}
std::unordered_set<int64_t> getDeadSessions()
{
return session_expiry_queue.getExpiredSessions();
}
2020-10-30 14:16:47 +00:00
};
2020-11-11 13:55:28 +00:00
2021-03-29 08:24:56 +00:00
using KeeperStoragePtr = std::unique_ptr<KeeperStorage>;
2021-03-18 20:55:11 +00:00
2020-10-30 14:16:47 +00:00
}