mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-11 18:14:03 +00:00
dbms: development [#CONV-2944].
This commit is contained in:
parent
3482ab7686
commit
2961d42e9d
@ -137,6 +137,12 @@ private:
|
|||||||
};
|
};
|
||||||
typedef std::map<String, ColumnData> Files_t;
|
typedef std::map<String, ColumnData> Files_t;
|
||||||
Files_t files;
|
Files_t files;
|
||||||
|
|
||||||
|
/** Прочитать файлы с засечками, если они ещё не прочитаны.
|
||||||
|
* Делается лениво, чтобы при большом количестве таблиц, сервер быстро стартовал.
|
||||||
|
*/
|
||||||
|
bool loaded_marks;
|
||||||
|
void loadMarks();
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -97,7 +97,7 @@ void LogBlockOutputStream::write(const Block & block)
|
|||||||
|
|
||||||
|
|
||||||
StorageLog::StorageLog(const std::string & path_, const std::string & name_, NamesAndTypesListPtr columns_)
|
StorageLog::StorageLog(const std::string & path_, const std::string & name_, NamesAndTypesListPtr columns_)
|
||||||
: path(path_), name(name_), columns(columns_)
|
: path(path_), name(name_), columns(columns_), loaded_marks(false)
|
||||||
{
|
{
|
||||||
if (columns->empty())
|
if (columns->empty())
|
||||||
throw Exception("Empty list of columns passed to StorageLog constructor", ErrorCodes::EMPTY_LIST_OF_COLUMNS_PASSED);
|
throw Exception("Empty list of columns passed to StorageLog constructor", ErrorCodes::EMPTY_LIST_OF_COLUMNS_PASSED);
|
||||||
@ -105,7 +105,6 @@ StorageLog::StorageLog(const std::string & path_, const std::string & name_, Nam
|
|||||||
/// создаём файлы, если их нет
|
/// создаём файлы, если их нет
|
||||||
Poco::File(path + escapeForFileName(name) + '/').createDirectories();
|
Poco::File(path + escapeForFileName(name) + '/').createDirectories();
|
||||||
|
|
||||||
ssize_t size_of_marks_file = -1;
|
|
||||||
for (NamesAndTypesList::const_iterator it = columns->begin(); it != columns->end(); ++it)
|
for (NamesAndTypesList::const_iterator it = columns->begin(); it != columns->end(); ++it)
|
||||||
{
|
{
|
||||||
if (files.end() != files.find(it->first))
|
if (files.end() != files.find(it->first))
|
||||||
@ -116,7 +115,18 @@ StorageLog::StorageLog(const std::string & path_, const std::string & name_, Nam
|
|||||||
files.insert(std::make_pair(it->first, column_data));
|
files.insert(std::make_pair(it->first, column_data));
|
||||||
files[it->first].data_file = Poco::File(path + escapeForFileName(name) + '/' + escapeForFileName(it->first) + DBMS_STORAGE_LOG_DATA_FILE_EXTENSION);
|
files[it->first].data_file = Poco::File(path + escapeForFileName(name) + '/' + escapeForFileName(it->first) + DBMS_STORAGE_LOG_DATA_FILE_EXTENSION);
|
||||||
files[it->first].marks_file = Poco::File(path + escapeForFileName(name) + '/' + escapeForFileName(it->first) + DBMS_STORAGE_LOG_MARKS_FILE_EXTENSION);
|
files[it->first].marks_file = Poco::File(path + escapeForFileName(name) + '/' + escapeForFileName(it->first) + DBMS_STORAGE_LOG_MARKS_FILE_EXTENSION);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StorageLog::loadMarks()
|
||||||
|
{
|
||||||
|
if (loaded_marks)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ssize_t size_of_marks_file = -1;
|
||||||
|
for (NamesAndTypesList::const_iterator it = columns->begin(); it != columns->end(); ++it)
|
||||||
|
{
|
||||||
/// Считаем засечки
|
/// Считаем засечки
|
||||||
if (files[it->first].marks_file.exists())
|
if (files[it->first].marks_file.exists())
|
||||||
{
|
{
|
||||||
@ -131,7 +141,7 @@ StorageLog::StorageLog(const std::string & path_, const std::string & name_, Nam
|
|||||||
throw Exception("Sizes of marks files are inconsistent", ErrorCodes::SIZES_OF_MARKS_FILES_ARE_INCONSISTENT);
|
throw Exception("Sizes of marks files are inconsistent", ErrorCodes::SIZES_OF_MARKS_FILES_ARE_INCONSISTENT);
|
||||||
|
|
||||||
files[it->first].marks.reserve(files[it->first].marks_file.getSize() / sizeof(Mark));
|
files[it->first].marks.reserve(files[it->first].marks_file.getSize() / sizeof(Mark));
|
||||||
ReadBufferFromFile marks_rb(files[it->first].marks_file.path());
|
ReadBufferFromFile marks_rb(files[it->first].marks_file.path(), 32768);
|
||||||
while (!marks_rb.eof())
|
while (!marks_rb.eof())
|
||||||
{
|
{
|
||||||
Mark mark;
|
Mark mark;
|
||||||
@ -141,6 +151,8 @@ StorageLog::StorageLog(const std::string & path_, const std::string & name_, Nam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loaded_marks = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -167,6 +179,7 @@ BlockInputStreams StorageLog::read(
|
|||||||
size_t max_block_size,
|
size_t max_block_size,
|
||||||
unsigned threads)
|
unsigned threads)
|
||||||
{
|
{
|
||||||
|
loadMarks();
|
||||||
check(column_names);
|
check(column_names);
|
||||||
processed_stage = QueryProcessingStage::FetchColumns;
|
processed_stage = QueryProcessingStage::FetchColumns;
|
||||||
|
|
||||||
@ -202,6 +215,7 @@ BlockInputStreams StorageLog::read(
|
|||||||
BlockOutputStreamPtr StorageLog::write(
|
BlockOutputStreamPtr StorageLog::write(
|
||||||
ASTPtr query)
|
ASTPtr query)
|
||||||
{
|
{
|
||||||
|
loadMarks();
|
||||||
return new LogBlockOutputStream(*this);
|
return new LogBlockOutputStream(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user