mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-28 18:42:26 +00:00
dbms: Server: queries with several replicas: development [#METR-14410]
This commit is contained in:
parent
35356191c9
commit
a7f0279e1c
@ -109,7 +109,7 @@ public:
|
|||||||
bool poll(size_t timeout_microseconds = 0);
|
bool poll(size_t timeout_microseconds = 0);
|
||||||
|
|
||||||
/// Проверить, есть ли данные в буфере для чтения.
|
/// Проверить, есть ли данные в буфере для чтения.
|
||||||
bool hasReadBufferPendingData();
|
bool hasReadBufferPendingData() const;
|
||||||
|
|
||||||
/// Получить пакет от сервера.
|
/// Получить пакет от сервера.
|
||||||
Packet receivePacket();
|
Packet receivePacket();
|
||||||
|
@ -144,9 +144,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Проверить, есть ли данные в буфере для чтения. */
|
/** Проверить, есть ли данные в буфере для чтения. */
|
||||||
bool hasPendingData()
|
bool hasPendingData() const
|
||||||
{
|
{
|
||||||
return offset() != buffer().size();
|
return offset() != working_buffer.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
using Segments = std::vector<MergeTreeDataSelectExecutor::RangesInDataParts>;
|
||||||
|
|
||||||
/** Этот класс разбивает объект типа RangesInDataParts (см. MergeTreeDataSelectExecutor)
|
/** Этот класс разбивает объект типа RangesInDataParts (см. MergeTreeDataSelectExecutor)
|
||||||
* на не больше, чем указанное количество сегментов.
|
* на не больше, чем указанное количество сегментов.
|
||||||
*/
|
*/
|
||||||
@ -18,7 +20,7 @@ public:
|
|||||||
PartsWithRangesSplitter(const PartsWithRangesSplitter &) = delete;
|
PartsWithRangesSplitter(const PartsWithRangesSplitter &) = delete;
|
||||||
PartsWithRangesSplitter & operator=(const PartsWithRangesSplitter &) = delete;
|
PartsWithRangesSplitter & operator=(const PartsWithRangesSplitter &) = delete;
|
||||||
|
|
||||||
std::vector<MergeTreeDataSelectExecutor::RangesInDataParts> perform();
|
Segments perform();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void init();
|
void init();
|
||||||
@ -35,11 +37,11 @@ private:
|
|||||||
// Входные данные.
|
// Входные данные.
|
||||||
const MergeTreeDataSelectExecutor::RangesInDataParts & input;
|
const MergeTreeDataSelectExecutor::RangesInDataParts & input;
|
||||||
MergeTreeDataSelectExecutor::RangesInDataParts::const_iterator input_part;
|
MergeTreeDataSelectExecutor::RangesInDataParts::const_iterator input_part;
|
||||||
std::vector<MarkRange>::const_iterator input_range;
|
MarkRanges::const_iterator input_range;
|
||||||
|
|
||||||
// Выходные данные.
|
// Выходные данные.
|
||||||
std::vector<MergeTreeDataSelectExecutor::RangesInDataParts> output_segments;
|
Segments output_segments;
|
||||||
std::vector<MergeTreeDataSelectExecutor::RangesInDataParts>::iterator current_output_segment;
|
Segments::iterator current_output_segment;
|
||||||
MergeTreeDataSelectExecutor::RangesInDataPart * current_output_part;
|
MergeTreeDataSelectExecutor::RangesInDataPart * current_output_part;
|
||||||
|
|
||||||
size_t total_size;
|
size_t total_size;
|
||||||
|
@ -360,9 +360,9 @@ bool Connection::poll(size_t timeout_microseconds)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Connection::hasReadBufferPendingData()
|
bool Connection::hasReadBufferPendingData() const
|
||||||
{
|
{
|
||||||
return static_cast<ReadBufferFromPocoSocket &>(*in).hasPendingData();
|
return static_cast<const ReadBufferFromPocoSocket &>(*in).hasPendingData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
|
||||||
std::pair<UInt64, UInt64> computeHash(const DB::MergeTreeDataSelectExecutor::RangesInDataParts & cluster)
|
std::pair<UInt64, UInt64> computeHash(const DB::MergeTreeDataSelectExecutor::RangesInDataParts & segment)
|
||||||
{
|
{
|
||||||
SipHash hash;
|
SipHash hash;
|
||||||
for (const auto & part_with_ranges : cluster)
|
for (const auto & part_with_ranges : segment)
|
||||||
{
|
{
|
||||||
const auto & part = *(part_with_ranges.data_part);
|
const auto & part = *(part_with_ranges.data_part);
|
||||||
hash.update(part.name.c_str(), part.name.length());
|
hash.update(part.name.c_str(), part.name.length());
|
||||||
|
@ -29,13 +29,13 @@ PartsWithRangesSplitter::PartsWithRangesSplitter(const MergeTreeDataSelectExecut
|
|||||||
}
|
}
|
||||||
total_size *= granularity;
|
total_size *= granularity;
|
||||||
|
|
||||||
if ((total_size == 0) || (min_segment_size == 0) || (max_segments_count < 2))
|
if ((granularity == 0) || (min_segment_size == 0) || (max_segments_count == 0) || (total_size == 0))
|
||||||
throw Exception("One or more arguments are invalid.", ErrorCodes::BAD_ARGUMENTS);
|
throw Exception("One or more arguments are invalid.", ErrorCodes::BAD_ARGUMENTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MergeTreeDataSelectExecutor::RangesInDataParts> PartsWithRangesSplitter::perform()
|
Segments PartsWithRangesSplitter::perform()
|
||||||
{
|
{
|
||||||
if (total_size > min_segment_size)
|
if ((max_segments_count > 1) && (total_size > min_segment_size))
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
while (emitRange()) {}
|
while (emitRange()) {}
|
||||||
|
Loading…
Reference in New Issue
Block a user