2013-05-04 06:09:23 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <limits>
|
|
|
|
|
|
|
|
|
|
#include <DB/Common/ConcurrentBoundedQueue.h>
|
|
|
|
|
|
|
|
|
|
#include <DB/DataStreams/IProfilingBlockInputStream.h>
|
|
|
|
|
#include <DB/DataStreams/IBlockOutputStream.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Является одновременно InputStream и OutputStream.
|
|
|
|
|
* При записи, кладёт блоки в очередь.
|
|
|
|
|
* При чтении, вынимает их из очереди.
|
|
|
|
|
* Используется thread-safe очередь.
|
|
|
|
|
* Если очередь пуста - чтение блокируется.
|
|
|
|
|
* Если очередь переполнена - запись блокируется.
|
|
|
|
|
*
|
|
|
|
|
* Используется для того, чтобы временно сохранить куда-то результат, и позже передать его дальше.
|
|
|
|
|
* Также используется для синхронизации, когда нужно из одного источника сделать несколько
|
|
|
|
|
* - для однопроходного выполнения сразу нескольких запросов.
|
|
|
|
|
* Также может использоваться для распараллеливания: несколько потоков кладут блоки в очередь, а один - вынимает.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
class QueueBlockIOStream : public IProfilingBlockInputStream, public IBlockOutputStream
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QueueBlockIOStream(size_t queue_size_ = std::numeric_limits<int>::max())
|
|
|
|
|
: queue_size(queue_size_), queue(queue_size) {}
|
|
|
|
|
|
2014-11-08 23:52:18 +00:00
|
|
|
|
String getName() const override { return "QueueBlockIOStream"; }
|
|
|
|
|
|
|
|
|
|
String getID() const override
|
2013-05-04 06:09:23 +00:00
|
|
|
|
{
|
|
|
|
|
std::stringstream res;
|
|
|
|
|
res << this;
|
|
|
|
|
return res.str();
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-08 23:52:18 +00:00
|
|
|
|
void write(const Block & block) override
|
2013-05-04 06:09:23 +00:00
|
|
|
|
{
|
|
|
|
|
queue.push(block);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-08 23:52:18 +00:00
|
|
|
|
void cancel() override
|
2013-05-04 06:09:23 +00:00
|
|
|
|
{
|
|
|
|
|
IProfilingBlockInputStream::cancel();
|
|
|
|
|
queue.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected:
|
2014-11-08 23:52:18 +00:00
|
|
|
|
Block readImpl() override
|
2013-05-04 06:09:23 +00:00
|
|
|
|
{
|
|
|
|
|
Block res;
|
|
|
|
|
queue.pop(res);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
size_t queue_size;
|
|
|
|
|
|
2016-05-28 10:35:44 +00:00
|
|
|
|
using Queue = ConcurrentBoundedQueue<Block>;
|
2013-05-04 06:09:23 +00:00
|
|
|
|
Queue queue;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|