2015-01-14 10:06:30 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/Client/Connection.h>
|
2015-01-15 18:33:20 +00:00
|
|
|
|
#include <DB/Client/ConnectionPool.h>
|
2015-01-14 10:06:30 +00:00
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
2015-01-15 16:55:50 +00:00
|
|
|
|
/**
|
|
|
|
|
* Множество реплик одного шарда.
|
|
|
|
|
*/
|
2015-02-04 10:27:06 +00:00
|
|
|
|
class ParallelReplicas final
|
2015-01-15 16:55:50 +00:00
|
|
|
|
{
|
2015-01-14 10:06:30 +00:00
|
|
|
|
public:
|
2015-02-06 22:32:54 +00:00
|
|
|
|
/// Принимает готовое соединение.
|
2015-02-06 14:46:04 +00:00
|
|
|
|
ParallelReplicas(Connection * connection_, Settings * settings_);
|
2015-02-06 22:32:54 +00:00
|
|
|
|
|
|
|
|
|
/// Принимает пул, из которого нужно будет достать одно или несколько соединений.
|
2015-02-06 14:46:04 +00:00
|
|
|
|
ParallelReplicas(IConnectionPool * pool_, Settings * settings_);
|
2015-01-14 10:06:30 +00:00
|
|
|
|
|
2015-02-04 10:27:06 +00:00
|
|
|
|
ParallelReplicas(const ParallelReplicas &) = delete;
|
|
|
|
|
ParallelReplicas & operator=(const ParallelReplicas &) = delete;
|
2015-01-14 10:06:30 +00:00
|
|
|
|
|
2015-01-22 21:54:16 +00:00
|
|
|
|
/// Отправить на реплики всё содержимое внешних таблиц.
|
|
|
|
|
void sendExternalTablesData(std::vector<ExternalTablesData> & data);
|
2015-01-14 10:06:30 +00:00
|
|
|
|
|
2015-01-22 21:54:16 +00:00
|
|
|
|
/// Отправить запрос на реплики.
|
2015-01-16 15:22:12 +00:00
|
|
|
|
void sendQuery(const String & query, const String & query_id = "",
|
|
|
|
|
UInt64 stage = QueryProcessingStage::Complete, bool with_pending_data = false);
|
2015-01-14 10:06:30 +00:00
|
|
|
|
|
2015-01-22 21:54:16 +00:00
|
|
|
|
/// Получить пакет от какой-нибудь реплики.
|
|
|
|
|
Connection::Packet receivePacket();
|
|
|
|
|
|
|
|
|
|
/// Разорвать соединения к репликам
|
2015-01-15 12:09:26 +00:00
|
|
|
|
void disconnect();
|
|
|
|
|
|
2015-01-22 21:54:16 +00:00
|
|
|
|
/// Отменить запросы к репликам
|
2015-01-15 12:09:26 +00:00
|
|
|
|
void sendCancel();
|
|
|
|
|
|
2015-02-07 17:12:29 +00:00
|
|
|
|
/// На каждой реплике читать и пропускать все пакеты до EndOfStream или Exception.
|
|
|
|
|
/// Возвращает EndOfStream, если не было получено никакого исключения. В противном
|
|
|
|
|
/// случае возвращает последний полученный пакет типа Exception.
|
2015-01-22 21:54:16 +00:00
|
|
|
|
Connection::Packet drain();
|
2015-01-15 12:09:26 +00:00
|
|
|
|
|
2015-01-22 21:54:16 +00:00
|
|
|
|
/// Получить адреса реплик в виде строки.
|
2015-01-15 12:09:26 +00:00
|
|
|
|
std::string dumpAddresses() const;
|
|
|
|
|
|
2015-01-15 16:55:50 +00:00
|
|
|
|
/// Возвращает количесто реплик.
|
2015-02-04 10:27:06 +00:00
|
|
|
|
size_t size() const { return replica_map.size(); }
|
2015-01-15 15:05:03 +00:00
|
|
|
|
|
2015-02-07 17:12:29 +00:00
|
|
|
|
/// Проверить, есть ли действительные реплики.
|
|
|
|
|
bool hasActiveReplicas() const { return active_replica_count > 0; }
|
2015-01-15 16:55:50 +00:00
|
|
|
|
|
|
|
|
|
private:
|
2015-01-18 15:52:09 +00:00
|
|
|
|
/// Реплики хэшированные по id сокета
|
2015-02-04 10:27:06 +00:00
|
|
|
|
using ReplicaMap = std::unordered_map<int, Connection *>;
|
2015-01-14 10:06:30 +00:00
|
|
|
|
|
2015-02-04 13:07:10 +00:00
|
|
|
|
private:
|
2015-02-07 17:12:29 +00:00
|
|
|
|
/// Зарегистрировать реплику.
|
|
|
|
|
void registerReplica(Connection * connection);
|
2015-02-05 22:31:03 +00:00
|
|
|
|
|
2015-02-07 17:12:29 +00:00
|
|
|
|
/// Получить реплику, на которой можно прочитать данные.
|
|
|
|
|
ReplicaMap::iterator getReplicaForReading();
|
2015-02-05 22:31:03 +00:00
|
|
|
|
|
2015-02-04 13:07:10 +00:00
|
|
|
|
/// Проверить, есть ли данные, которые можно прочитать на каких-нибудь репликах.
|
2015-02-07 17:12:29 +00:00
|
|
|
|
/// Возвращает одну такую реплику, если она найдётся.
|
2015-02-04 13:07:10 +00:00
|
|
|
|
ReplicaMap::iterator waitForReadEvent();
|
|
|
|
|
|
2015-02-07 17:12:29 +00:00
|
|
|
|
// Пометить реплику как недействительную.
|
|
|
|
|
void invalidateReplica(ReplicaMap::iterator it);
|
2015-02-06 10:41:03 +00:00
|
|
|
|
|
2015-01-14 10:06:30 +00:00
|
|
|
|
private:
|
2015-02-06 14:46:04 +00:00
|
|
|
|
Settings * settings;
|
2015-02-04 10:27:06 +00:00
|
|
|
|
ReplicaMap replica_map;
|
2015-02-06 14:46:04 +00:00
|
|
|
|
|
|
|
|
|
std::vector<ConnectionPool::Entry> pool_entries;
|
|
|
|
|
ConnectionPool::Entry pool_entry;
|
|
|
|
|
|
2015-02-06 22:32:54 +00:00
|
|
|
|
/// Текущее количество действительных соединений к репликам.
|
2015-02-07 17:12:29 +00:00
|
|
|
|
size_t active_replica_count = 0;
|
2015-02-06 22:32:54 +00:00
|
|
|
|
/// Запрос выполняется параллельно на нескольких репликах.
|
2015-02-05 22:31:03 +00:00
|
|
|
|
bool supports_parallel_execution;
|
2015-02-06 22:32:54 +00:00
|
|
|
|
/// Отправили запрос
|
2015-01-22 21:54:16 +00:00
|
|
|
|
bool sent_query = false;
|
2015-02-06 22:32:54 +00:00
|
|
|
|
/// Отменили запрос
|
2015-01-22 21:54:16 +00:00
|
|
|
|
bool cancelled = false;
|
2015-01-14 10:06:30 +00:00
|
|
|
|
};
|
|
|
|
|
}
|