_shutdown_logger();
}
-int BlueFS::prepare_new_device(int id)
+int BlueFS::prepare_new_device(int id, const bluefs_layout_t& layout)
{
dout(1) << __func__ << dendl;
new_log_dev_cur = BDEV_NEWDB;
new_log_dev_next = BDEV_DB;
}
- _rewrite_log_sync(false,
+ _rewrite_log_and_layout_sync(false,
BDEV_NEWDB,
new_log_dev_cur,
new_log_dev_next,
- RENAME_DB2SLOW);
+ RENAME_DB2SLOW,
+ layout);
//}
} else if(id == BDEV_NEWWAL) {
- _rewrite_log_sync(false, BDEV_DB, BDEV_NEWWAL, BDEV_WAL, REMOVE_WAL);
+ _rewrite_log_and_layout_sync(false,
+ BDEV_DB,
+ BDEV_NEWWAL,
+ BDEV_WAL,
+ REMOVE_WAL,
+ layout);
} else {
assert(false);
}
int BlueFS::device_migrate_to_existing(
CephContext *cct,
const set<int>& devs_source,
- int dev_target)
+ int dev_target,
+ const bluefs_layout_t& layout)
{
vector<byte> buf;
bool buffered = cct->_conf->bluefs_buffered_io;
new_log_dev_next;
}
- _rewrite_log_sync(
+ _rewrite_log_and_layout_sync(
false,
(flags & REMOVE_DB) ? BDEV_SLOW : BDEV_DB,
new_log_dev_cur,
new_log_dev_next,
- flags);
+ flags,
+ layout);
return 0;
}
int BlueFS::device_migrate_to_new(
CephContext *cct,
const set<int>& devs_source,
- int dev_target)
+ int dev_target,
+ const bluefs_layout_t& layout)
{
vector<byte> buf;
bool buffered = cct->_conf->bluefs_buffered_io;
BDEV_DB :
BDEV_SLOW;
- _rewrite_log_sync(
+ _rewrite_log_and_layout_sync(
false,
super_dev,
new_log_dev_cur,
new_log_dev_next,
- flags);
+ flags,
+ layout);
return 0;
}
void BlueFS::_compact_log_sync()
{
dout(10) << __func__ << dendl;
- _rewrite_log_sync(true,
+ _rewrite_log_and_layout_sync(true,
BDEV_DB,
log_writer->file->fnode.prefer_bdev,
log_writer->file->fnode.prefer_bdev,
- 0);
+ 0,
+ super.memorized_layout);
logger->inc(l_bluefs_log_compactions);
}
-void BlueFS::_rewrite_log_sync(bool allocate_with_fallback,
- int super_dev,
- int log_dev,
- int log_dev_new,
- int flags)
+void BlueFS::_rewrite_log_and_layout_sync(bool allocate_with_fallback,
+ int super_dev,
+ int log_dev,
+ int log_dev_new,
+ int flags,
+ std::optional<bluefs_layout_t> layout)
{
File *log_file = log_writer->file.get();
#endif
flush_bdev();
+ super.memorized_layout = layout;
super.log_fnode = log_file->fnode;
// rename device if needed
if (log_dev != log_dev_new) {
void _compact_log_sync();
void _compact_log_async(std::unique_lock<ceph::mutex>& l);
- void _rewrite_log_sync(bool allocate_with_fallback,
- int super_dev,
- int log_dev,
- int new_log_dev,
- int flags);
+ void _rewrite_log_and_layout_sync(bool allocate_with_fallback,
+ int super_dev,
+ int log_dev,
+ int new_log_dev,
+ int flags,
+ std::optional<bluefs_layout_t> layout);
//void _aio_finish(void *priv);
int mount();
int maybe_verify_layout(const bluefs_layout_t& layout) const;
void umount();
- int prepare_new_device(int id);
+ int prepare_new_device(int id, const bluefs_layout_t& layout);
int log_dump();
int device_migrate_to_new(
CephContext *cct,
const set<int>& devs_source,
- int dev_target);
+ int dev_target,
+ const bluefs_layout_t& layout);
int device_migrate_to_existing(
CephContext *cct,
const set<int>& devs_source,
- int dev_target);
+ int dev_target,
+ const bluefs_layout_t& layout);
uint64_t get_used();
uint64_t get_total(unsigned id);
}
reserved = BDEV_LABEL_BLOCK_SIZE;
+ bluefs_layout.dedicated_wal = true;
} else if (id == BlueFS::BDEV_NEWDB) {
string p = path + "/block.db";
r = _setup_block_symlink_or_file("block.db", dev_path,
ceph_assert(r == 0);
}
reserved = SUPER_RESERVED;
+ bluefs_layout.shared_bdev = BlueFS::BDEV_SLOW;
+ bluefs_layout.dedicated_db = true;
}
bluefs->umount();
reserved,
bluefs->get_block_device_size(id) - reserved);
- r = bluefs->prepare_new_device(id);
+ r = bluefs->prepare_new_device(id, bluefs_layout);
ceph_assert(r == 0);
if (r < 0) {
<< dendl;
return -ENOSPC;
}
- r = bluefs->device_migrate_to_existing(cct, devs_source, id);
+ if (devs_source.count(BlueFS::BDEV_DB)) {
+ bluefs_layout.shared_bdev = BlueFS::BDEV_DB;
+ bluefs_layout.dedicated_db = false;
+ }
+ if (devs_source.count(BlueFS::BDEV_WAL)) {
+ bluefs_layout.dedicated_wal = false;
+ }
+ r = bluefs->device_migrate_to_existing(cct, devs_source, id, bluefs_layout);
if (r < 0) {
derr << __func__ << " failed during BlueFS migration, " << cpp_strerror(r) << dendl;
goto shutdown;
if (devs_source.count(BlueFS::BDEV_DB) &&
bluefs_layout.shared_bdev != BlueFS::BDEV_DB) {
link_db = path + "/block.db";
+ bluefs_layout.shared_bdev = BlueFS::BDEV_DB;
+ bluefs_layout.dedicated_db = false;
}
if (devs_source.count(BlueFS::BDEV_WAL)) {
link_wal = path + "/block.wal";
+ bluefs_layout.dedicated_wal = false;
}
size_t target_size;
if (id == BlueFS::BDEV_NEWWAL) {
target_name = "block.wal";
target_size = cct->_conf->bluestore_block_wal_size;
+ bluefs_layout.dedicated_wal = true;
r = bluefs->add_block_device(BlueFS::BDEV_NEWWAL, dev_path,
cct->_conf->bdev_enable_discard);
} else if (id == BlueFS::BDEV_NEWDB) {
target_name = "block.db";
target_size = cct->_conf->bluestore_block_db_size;
+ bluefs_layout.shared_bdev = BlueFS::BDEV_SLOW;
+ bluefs_layout.dedicated_db = true;
r = bluefs->add_block_device(BlueFS::BDEV_NEWDB, dev_path,
cct->_conf->bdev_enable_discard);
bluefs->add_block_extent(
id, reserved, bluefs->get_block_device_size(id) - reserved);
- r = bluefs->device_migrate_to_new(cct, devs_source, id);
+ r = bluefs->device_migrate_to_new(cct, devs_source, id, bluefs_layout);
if (r < 0) {
derr << __func__ << " failed during BlueFS migration, " << cpp_strerror(r) << dendl;