Compare commits

...

3 Commits

Author SHA1 Message Date
Vitaliy Filippov aa79d1db1c Fix incorrect "changing scheme" message in modify-pool
Test / test_rm (push) Successful in 14s Details
Test / test_interrupted_rebalance_ec_imm (push) Successful in 1m32s Details
Test / test_move_reappear (push) Successful in 20s Details
Test / test_snapshot_down (push) Successful in 29s Details
Test / test_snapshot_down_ec (push) Successful in 29s Details
Test / test_splitbrain (push) Successful in 28s Details
Test / test_snapshot_chain (push) Successful in 2m5s Details
Test / test_snapshot_chain_ec (push) Successful in 3m3s Details
Test / test_rebalance_verify_imm (push) Successful in 4m0s Details
Test / test_rebalance_verify (push) Successful in 4m40s Details
Test / test_switch_primary (push) Successful in 38s Details
Test / test_write (push) Successful in 41s Details
Test / test_write_no_same (push) Successful in 17s Details
Test / test_write_xor (push) Successful in 1m2s Details
Test / test_rebalance_verify_ec (push) Successful in 5m34s Details
Test / test_rebalance_verify_ec_imm (push) Successful in 5m34s Details
Test / test_heal_pg_size_2 (push) Successful in 3m22s Details
Test / test_heal_ec (push) Successful in 4m58s Details
Test / test_heal_csum_32k_dmj (push) Successful in 5m37s Details
Test / test_heal_csum_32k_dj (push) Successful in 6m21s Details
Test / test_heal_csum_32k (push) Successful in 7m1s Details
Test / test_scrub (push) Successful in 1m37s Details
Test / test_heal_csum_4k_dmj (push) Successful in 6m59s Details
Test / test_scrub_zero_osd_2 (push) Successful in 1m26s Details
Test / test_scrub_xor (push) Successful in 1m3s Details
Test / test_heal_csum_4k_dj (push) Successful in 7m20s Details
Test / test_scrub_pg_size_6_pg_minsize_4_osd_count_6_ec (push) Successful in 1m7s Details
Test / test_scrub_ec (push) Successful in 36s Details
Test / test_scrub_pg_size_3 (push) Successful in 1m37s Details
Test / test_heal_csum_4k (push) Successful in 6m23s Details
2024-03-06 00:41:35 +03:00
Vitaliy Filippov a1fecb7eff Move callback away when calling it in cluster_client 2024-03-06 00:41:35 +03:00
Vitaliy Filippov ff74b19423 Fix rare OSD hang on zeroing out bad entries on start 2024-03-06 00:41:35 +03:00
4 changed files with 30 additions and 13 deletions

View File

@ -32,7 +32,7 @@ void blockstore_init_meta::handle_event(ring_data_t *data, int buf_num)
if (data->res < 0) if (data->res < 0)
{ {
throw std::runtime_error( throw std::runtime_error(
std::string("read metadata failed at offset ") + std::to_string(bufs[buf_num].offset) + std::string("read metadata failed at offset ") + std::to_string(buf_num >= 0 ? bufs[buf_num].offset : last_read_offset) +
std::string(": ") + strerror(-data->res) std::string(": ") + strerror(-data->res)
); );
} }
@ -63,6 +63,7 @@ int blockstore_init_meta::loop()
throw std::runtime_error("Failed to allocate metadata read buffer"); throw std::runtime_error("Failed to allocate metadata read buffer");
// Read superblock // Read superblock
GET_SQE(); GET_SQE();
last_read_offset = 0;
data->iov = { metadata_buffer, (size_t)bs->dsk.meta_block_size }; data->iov = { metadata_buffer, (size_t)bs->dsk.meta_block_size };
data->callback = [this](ring_data_t *data) { handle_event(data, -1); }; data->callback = [this](ring_data_t *data) { handle_event(data, -1); };
my_uring_prep_readv(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset); my_uring_prep_readv(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset);
@ -100,6 +101,7 @@ resume_1:
{ {
printf("Initializing metadata area\n"); printf("Initializing metadata area\n");
GET_SQE(); GET_SQE();
last_read_offset = 0;
data->iov = (struct iovec){ metadata_buffer, (size_t)bs->dsk.meta_block_size }; data->iov = (struct iovec){ metadata_buffer, (size_t)bs->dsk.meta_block_size };
data->callback = [this](ring_data_t *data) { handle_event(data, -1); }; data->callback = [this](ring_data_t *data) { handle_event(data, -1); };
my_uring_prep_writev(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset); my_uring_prep_writev(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset);
@ -259,9 +261,11 @@ resume_2:
next_offset = entries_to_zero[i]/entries_per_block; next_offset = entries_to_zero[i]/entries_per_block;
for (j = i; j < entries_to_zero.size() && entries_to_zero[j]/entries_per_block == next_offset; j++) {} for (j = i; j < entries_to_zero.size() && entries_to_zero[j]/entries_per_block == next_offset; j++) {}
GET_SQE(); GET_SQE();
last_read_offset = (1+next_offset)*bs->dsk.meta_block_size;
data->iov = { metadata_buffer, (size_t)bs->dsk.meta_block_size }; data->iov = { metadata_buffer, (size_t)bs->dsk.meta_block_size };
data->callback = [this](ring_data_t *data) { handle_event(data, -1); }; data->callback = [this](ring_data_t *data) { handle_event(data, -1); };
my_uring_prep_readv(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset + (1+next_offset)*bs->dsk.meta_block_size); my_uring_prep_readv(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset + (1+next_offset)*bs->dsk.meta_block_size);
bs->ringloop->submit();
submitted++; submitted++;
resume_5: resume_5:
if (submitted > 0) if (submitted > 0)
@ -278,6 +282,7 @@ resume_5:
data->iov = { metadata_buffer, (size_t)bs->dsk.meta_block_size }; data->iov = { metadata_buffer, (size_t)bs->dsk.meta_block_size };
data->callback = [this](ring_data_t *data) { handle_event(data, -1); }; data->callback = [this](ring_data_t *data) { handle_event(data, -1); };
my_uring_prep_writev(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset + (1+next_offset)*bs->dsk.meta_block_size); my_uring_prep_writev(sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset + (1+next_offset)*bs->dsk.meta_block_size);
bs->ringloop->submit();
submitted++; submitted++;
resume_6: resume_6:
if (submitted > 0) if (submitted > 0)
@ -299,6 +304,7 @@ resume_6:
{ {
GET_SQE(); GET_SQE();
my_uring_prep_fsync(sqe, bs->dsk.meta_fd, IORING_FSYNC_DATASYNC); my_uring_prep_fsync(sqe, bs->dsk.meta_fd, IORING_FSYNC_DATASYNC);
last_read_offset = 0;
data->iov = { 0 }; data->iov = { 0 };
data->callback = [this](ring_data_t *data) { handle_event(data, -1); }; data->callback = [this](ring_data_t *data) { handle_event(data, -1); };
submitted++; submitted++;

View File

@ -23,6 +23,7 @@ class blockstore_init_meta
struct ring_data_t *data; struct ring_data_t *data;
uint64_t md_offset = 0; uint64_t md_offset = 0;
uint64_t next_offset = 0; uint64_t next_offset = 0;
uint64_t last_read_offset = 0;
uint64_t entries_loaded = 0; uint64_t entries_loaded = 0;
unsigned entries_per_block = 0; unsigned entries_per_block = 0;
int i = 0, j = 0; int i = 0, j = 0;

View File

@ -64,10 +64,6 @@ std::string validate_pool_config(json11::Json::object & new_cfg, json11::Json ol
(new_cfg["parity_chunks"].uint64_value() > 1 ? 1 : 0); (new_cfg["parity_chunks"].uint64_value() > 1 ? 1 : 0);
} }
} }
if (new_cfg["scheme"] != "ec")
{
new_cfg.erase("parity_chunks");
}
// Check integer values and unknown keys // Check integer values and unknown keys
for (auto kv_it = new_cfg.begin(); kv_it != new_cfg.end(); ) for (auto kv_it = new_cfg.begin(); kv_it != new_cfg.end(); )
@ -118,6 +114,12 @@ std::string validate_pool_config(json11::Json::object & new_cfg, json11::Json ol
} }
} }
// Check after merging
if (new_cfg["scheme"] != "ec")
{
new_cfg.erase("parity_chunks");
}
// Prevent autovivification of object keys. Now we don't modify the config, we just check it // Prevent autovivification of object keys. Now we don't modify the config, we just check it
json11::Json cfg = new_cfg; json11::Json cfg = new_cfg;

View File

@ -238,7 +238,8 @@ void cluster_client_t::erase_op(cluster_op_t *op)
// which may continue following SYNCs, but these SYNCs // which may continue following SYNCs, but these SYNCs
// should know about the changed buffer state // should know about the changed buffer state
// This is ugly but this is the way we do it // This is ugly but this is the way we do it
std::function<void(cluster_op_t*)>(op->callback)(op); auto cb = std::move(op->callback);
cb(op);
} }
if (!(flags & OP_IMMEDIATE_COMMIT) || enable_writeback) if (!(flags & OP_IMMEDIATE_COMMIT) || enable_writeback)
{ {
@ -248,7 +249,8 @@ void cluster_client_t::erase_op(cluster_op_t *op)
{ {
// Call callback at the end to avoid inconsistencies in prev_wait // Call callback at the end to avoid inconsistencies in prev_wait
// if the callback adds more operations itself // if the callback adds more operations itself
std::function<void(cluster_op_t*)>(op->callback)(op); auto cb = std::move(op->callback);
cb(op);
} }
if (flags & OP_FLUSH_BUFFER) if (flags & OP_FLUSH_BUFFER)
{ {
@ -548,7 +550,8 @@ void cluster_client_t::execute(cluster_op_t *op)
op->opcode != OSD_OP_READ_BITMAP && op->opcode != OSD_OP_READ_CHAIN_BITMAP && op->opcode != OSD_OP_WRITE) op->opcode != OSD_OP_READ_BITMAP && op->opcode != OSD_OP_READ_CHAIN_BITMAP && op->opcode != OSD_OP_WRITE)
{ {
op->retval = -EINVAL; op->retval = -EINVAL;
std::function<void(cluster_op_t*)>(op->callback)(op); auto cb = std::move(op->callback);
cb(op);
return; return;
} }
if (!pgs_loaded) if (!pgs_loaded)
@ -586,7 +589,8 @@ void cluster_client_t::execute_internal(cluster_op_t *op)
wb->start_writebacks(this, 1); wb->start_writebacks(this, 1);
} }
op->retval = op->len; op->retval = op->len;
std::function<void(cluster_op_t*)>(op->callback)(op); auto cb = std::move(op->callback);
cb(op);
return; return;
} }
if (op->opcode == OSD_OP_WRITE && !(op->flags & OP_IMMEDIATE_COMMIT)) if (op->opcode == OSD_OP_WRITE && !(op->flags & OP_IMMEDIATE_COMMIT))
@ -655,7 +659,8 @@ bool cluster_client_t::check_rw(cluster_op_t *op)
if (!pool_id) if (!pool_id)
{ {
op->retval = -EINVAL; op->retval = -EINVAL;
std::function<void(cluster_op_t*)>(op->callback)(op); auto cb = std::move(op->callback);
cb(op);
return false; return false;
} }
auto pool_it = st_cli.pool_config.find(pool_id); auto pool_it = st_cli.pool_config.find(pool_id);
@ -663,7 +668,8 @@ bool cluster_client_t::check_rw(cluster_op_t *op)
{ {
// Pools are loaded, but this one is unknown // Pools are loaded, but this one is unknown
op->retval = -EINVAL; op->retval = -EINVAL;
std::function<void(cluster_op_t*)>(op->callback)(op); auto cb = std::move(op->callback);
cb(op);
return false; return false;
} }
// Check alignment // Check alignment
@ -671,7 +677,8 @@ bool cluster_client_t::check_rw(cluster_op_t *op)
op->offset % pool_it->second.bitmap_granularity || op->len % pool_it->second.bitmap_granularity) op->offset % pool_it->second.bitmap_granularity || op->len % pool_it->second.bitmap_granularity)
{ {
op->retval = -EINVAL; op->retval = -EINVAL;
std::function<void(cluster_op_t*)>(op->callback)(op); auto cb = std::move(op->callback);
cb(op);
return false; return false;
} }
if (pool_it->second.immediate_commit == IMMEDIATE_ALL) if (pool_it->second.immediate_commit == IMMEDIATE_ALL)
@ -684,7 +691,8 @@ bool cluster_client_t::check_rw(cluster_op_t *op)
if (ino_it != st_cli.inode_config.end() && ino_it->second.readonly) if (ino_it != st_cli.inode_config.end() && ino_it->second.readonly)
{ {
op->retval = -EROFS; op->retval = -EROFS;
std::function<void(cluster_op_t*)>(op->callback)(op); auto cb = std::move(op->callback);
cb(op);
return false; return false;
} }
} }