thin-provisioning-tools/block-cache/copier.h

90 lines
1.6 KiB
C
Raw Normal View History

2016-03-17 20:45:52 +05:30
#ifndef BLOCK_CACHE_COPIER_H
#define BLOCK_CACHE_COPIER_H
2016-04-14 13:24:32 +05:30
#include "block-cache/io_engine.h"
#include "block-cache/mem_pool.h"
2016-03-17 20:45:52 +05:30
#include <string>
2016-04-14 13:24:32 +05:30
#include <list>
#include <map>
2016-03-17 20:45:52 +05:30
//----------------------------------------------------------------
namespace bcache {
2016-04-14 13:24:32 +05:30
using block_address = uint64_t;
struct copy_op {
copy_op()
: read_complete(false),
write_complete(false) {
}
copy_op(block_address src_b_,
block_address src_e_,
block_address dest_b_)
: src_b(src_b_),
src_e(src_e_),
dest_b(dest_b_),
read_complete(false),
write_complete(false) {
}
2016-04-14 13:24:32 +05:30
block_address src_b, src_e;
block_address dest_b;
bool read_complete;
bool write_complete;
};
class copy_job {
public:
copy_job(copy_op const &op_, void *data_)
: op(op_), data(data_) {
}
copy_op op;
void *data;
};
2016-03-17 20:45:52 +05:30
class copier {
public:
copier(std::string const &src, std::string const &dest,
2016-04-14 13:24:32 +05:30
sector_t block_size, size_t mem);
sector_t get_block_size() const {
return block_size_;
}
2016-03-17 20:45:52 +05:30
2016-04-14 13:24:32 +05:30
// Blocks if out of memory.
void issue(copy_op const &op);
2016-03-17 20:45:52 +05:30
2016-04-14 13:24:32 +05:30
unsigned nr_pending() const;
boost::optional<copy_op> wait();
2016-03-17 20:45:52 +05:30
private:
2016-04-14 13:24:32 +05:30
void wait_();
void complete(copy_job const &j);
sector_t to_sector(block_address b) const;
unsigned genkey();
mempool pool_;
sector_t block_size_;
unsigned nr_blocks_;
io_engine engine_;
io_engine::handle src_handle_;
io_engine::handle dest_handle_;
unsigned genkey_count_;
using job_map = std::map<unsigned, copy_job>;
using op_list = std::list<copy_op>;
job_map jobs_;
op_list complete_;
2016-03-17 20:45:52 +05:30
};
}
//----------------------------------------------------------------
#endif