ClickHouse/dbms/include/DB/IO/WriteBufferAIO.h
2015-03-11 20:27:34 +03:00

60 lines
1.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <DB/IO/IBufferAIO.h>
#include <DB/IO/WriteBuffer.h>
#include <DB/IO/BufferWithOwnMemory.h>
#include <statdaemons/AIO.h>
#include <unistd.h>
#include <fcntl.h>
namespace DB
{
/** Класс для асинхронной записи данных.
* Все размеры и смещения должны быть кратны 512 байтам.
*/
class WriteBufferAIO : public IBufferAIO, public BufferWithOwnMemory<WriteBuffer>
{
public:
WriteBufferAIO(const std::string & filename_, size_t buffer_size_ = DBMS_DEFAULT_BUFFER_SIZE, int flags_ = -1, mode_t mode_ = 0666,
char * existing_memory_ = nullptr);
~WriteBufferAIO() override;
WriteBufferAIO(const WriteBufferAIO &) = delete;
WriteBufferAIO & operator=(const WriteBufferAIO &) = delete;
off_t seek(off_t off, int whence = SEEK_SET);
void truncate(off_t length = 0);
void sync();
std::string getFileName() const noexcept override { return filename; }
int getFD() const noexcept override { return fd; }
private:
void nextImpl() override;
void waitForCompletion() override;
void swapBuffers() noexcept override;
private:
/// Буфер для асинхронных операций записи данных.
BufferWithOwnMemory<WriteBuffer> flush_buffer;
iocb request;
std::vector<iocb *> request_ptrs;
std::vector<io_event> events;
AIOContext aio_context;
const std::string filename;
off_t pos_in_file = 0;
int fd = -1;
/// Асинхронная операция записи ещё не завершилась.
bool is_pending_write = false;
/// Было получено исключение.
bool got_exception = false;
};
}