mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-29 19:12:03 +00:00
dbms: correctly determine mark to end of previous block [#MTRSADMIN-1093]
This commit is contained in:
parent
978aba0f4c
commit
be68461fc6
@ -11,6 +11,7 @@
|
|||||||
#include <DB/IO/CompressedReadBuffer.h>
|
#include <DB/IO/CompressedReadBuffer.h>
|
||||||
#include <DB/IO/HashingReadBuffer.h>
|
#include <DB/IO/HashingReadBuffer.h>
|
||||||
#include <DB/Columns/ColumnsNumber.h>
|
#include <DB/Columns/ColumnsNumber.h>
|
||||||
|
#include <statdaemons/ext/scope_guard.hpp>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -115,6 +116,12 @@ struct Stream
|
|||||||
readIntBinary(mrk_mark.offset_in_compressed_file, mrk_hashing_buf);
|
readIntBinary(mrk_mark.offset_in_compressed_file, mrk_hashing_buf);
|
||||||
readIntBinary(mrk_mark.offset_in_decompressed_block, mrk_hashing_buf);
|
readIntBinary(mrk_mark.offset_in_decompressed_block, mrk_hashing_buf);
|
||||||
|
|
||||||
|
/// На всякий случай, сохраним смещение в файле и размер предыдущего блока.
|
||||||
|
SCOPE_EXIT(
|
||||||
|
prev_offset_in_compressed_file = mrk_mark.offset_in_compressed_file;
|
||||||
|
prev_buffer_size = uncompressed_hashing_buf.buffer().size();
|
||||||
|
);
|
||||||
|
|
||||||
bool has_alternative_mark = false;
|
bool has_alternative_mark = false;
|
||||||
MarkInCompressedFile alternative_data_mark;
|
MarkInCompressedFile alternative_data_mark;
|
||||||
MarkInCompressedFile data_mark;
|
MarkInCompressedFile data_mark;
|
||||||
@ -138,6 +145,18 @@ struct Stream
|
|||||||
if (uncompressed_hashing_buf.eof())
|
if (uncompressed_hashing_buf.eof())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (uncompressed_hashing_buf.offset() == 0)
|
||||||
|
{
|
||||||
|
/// Восстановим засечку на конец предыдущего блока по сохраненным данным
|
||||||
|
has_alternative_mark = true;
|
||||||
|
alternative_data_mark.offset_in_compressed_file = prev_offset_in_compressed_file;
|
||||||
|
alternative_data_mark.offset_in_decompressed_block = prev_buffer_size;
|
||||||
|
|
||||||
|
if (mrk_mark == alternative_data_mark)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "mrk_mark " << mrk_mark.offset_in_compressed_file << ' ' << mrk_mark.offset_in_decompressed_block << std::endl;
|
||||||
|
|
||||||
data_mark.offset_in_compressed_file = compressed_hashing_buf.count() - uncompressing_buf.getSizeCompressed();
|
data_mark.offset_in_compressed_file = compressed_hashing_buf.count() - uncompressing_buf.getSizeCompressed();
|
||||||
data_mark.offset_in_decompressed_block = uncompressed_hashing_buf.offset();
|
data_mark.offset_in_decompressed_block = uncompressed_hashing_buf.offset();
|
||||||
@ -161,6 +180,10 @@ struct Stream
|
|||||||
checksums.files[name + ".mrk"] = MergeTreeData::DataPart::Checksums::Checksum(
|
checksums.files[name + ".mrk"] = MergeTreeData::DataPart::Checksums::Checksum(
|
||||||
mrk_hashing_buf.count(), mrk_hashing_buf.getHash());
|
mrk_hashing_buf.count(), mrk_hashing_buf.getHash());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t prev_offset_in_compressed_file{};
|
||||||
|
size_t prev_buffer_size{};
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Возвращает количество строк. Добавляет в checksums чексуммы всех файлов столбца.
|
/// Возвращает количество строк. Добавляет в checksums чексуммы всех файлов столбца.
|
||||||
|
Loading…
Reference in New Issue
Block a user