ClickHouse/dbms/include/DB/DataStreams/IProfilingBlockInputStream.h

90 lines
3.5 KiB
C
Raw Normal View History

2011-08-27 22:43:31 +00:00
#pragma once
2012-05-09 08:16:09 +00:00
#include <boost/function.hpp>
2011-08-27 22:43:31 +00:00
#include <Poco/Stopwatch.h>
2011-09-05 00:51:25 +00:00
#include <DB/Core/Names.h>
2011-08-27 22:43:31 +00:00
#include <DB/DataStreams/IBlockInputStream.h>
namespace DB
{
/// Информация для профайлинга.
struct BlockStreamProfileInfo
{
bool started;
Poco::Stopwatch work_stopwatch; /// Время вычислений (выполнения функции read())
Poco::Stopwatch total_stopwatch; /// Время с учётом ожидания
size_t rows;
size_t blocks;
size_t bytes;
2011-09-26 01:50:32 +00:00
/// Информация о вложенных потоках - для выделения чистого времени работы.
typedef std::vector<const BlockStreamProfileInfo *> BlockStreamProfileInfos;
BlockStreamProfileInfos nested_infos;
2011-09-05 00:51:25 +00:00
String column_names;
2011-08-27 22:43:31 +00:00
BlockStreamProfileInfo() : started(false), rows(0), blocks(0), bytes(0) {}
2012-05-17 19:15:53 +00:00
void update(Block & block);
2011-08-27 22:43:31 +00:00
void print(std::ostream & ostr) const;
};
2012-05-09 08:16:09 +00:00
/** Смотрит за тем, как работает источник блоков.
2011-08-27 22:43:31 +00:00
* Позволяет получить информацию для профайлинга:
* строк в секунду, блоков в секунду, мегабайт в секунду и т. п.
2012-05-09 08:16:09 +00:00
* Позволяет остановить чтение данных (во вложенных источниках).
2011-08-27 22:43:31 +00:00
*/
2011-09-04 21:23:19 +00:00
class IProfilingBlockInputStream : public IBlockInputStream
2011-08-27 22:43:31 +00:00
{
public:
IProfilingBlockInputStream() : is_cancelled(false) {}
2011-08-27 22:43:31 +00:00
Block read();
2011-09-04 21:23:19 +00:00
/// Наследники должны реализовать эту функцию.
virtual Block readImpl() = 0;
2012-08-23 23:49:28 +00:00
/// Получить информацию о скорости выполнения.
2011-08-27 22:43:31 +00:00
const BlockStreamProfileInfo & getInfo() const;
/** Попросить прервать получение данных как можно скорее.
* По-умолчанию - просто выставляет флаг is_cancelled и просит прерваться всех детей.
*/
virtual void cancel();
2012-05-09 08:16:09 +00:00
/** Установить колбэк, который вызывается, чтобы проверить, не был ли запрос остановлен.
2012-05-09 13:12:38 +00:00
* Колбэк пробрасывается во все листовые источники и вызывается там перед чтением данных.
2012-05-09 08:16:09 +00:00
* Следует иметь ввиду, что колбэк может вызываться из разных потоков.
*/
typedef boost::function<bool()> IsCancelledCallback;
void setIsCancelledCallback(IsCancelledCallback callback);
2012-05-09 15:15:45 +00:00
/** Установить колбэк прогресса выполнения.
2012-05-17 19:15:53 +00:00
* Колбэк пробрасывается во все источники.
* По-умолчанию, он вызывается для листовых источников, после каждого блока.
* (Но это может быть переопределено в методе progress())
2012-05-09 15:15:45 +00:00
* Функция принимает количество строк в последнем блоке, количество байт в последнем блоке.
* Следует иметь ввиду, что колбэк может вызываться из разных потоков.
*/
typedef boost::function<void(size_t, size_t)> ProgressCallback;
void setProgressCallback(ProgressCallback callback);
2012-05-17 19:15:53 +00:00
virtual void progress(Block & block);
2012-05-21 20:38:34 +00:00
protected:
2011-08-27 22:43:31 +00:00
BlockStreamProfileInfo info;
volatile bool is_cancelled;
2012-05-09 08:16:09 +00:00
IsCancelledCallback is_cancelled_callback;
2012-05-09 15:15:45 +00:00
ProgressCallback progress_callback;
2011-08-27 22:43:31 +00:00
};
}