Compare commits

...

2 Commits

Author SHA1 Message Date
Vitaliy Filippov 2defd7d8ed First just recheck version without actually re-reading block in vitastor-kv
Test / test_move_reappear (push) Has been cancelled Details
Test / test_rm (push) Has been cancelled Details
Test / test_snapshot_chain (push) Has been cancelled Details
Test / test_snapshot_chain_ec (push) Has been cancelled Details
Test / test_snapshot_down (push) Has been cancelled Details
Test / test_snapshot_down_ec (push) Has been cancelled Details
Test / test_splitbrain (push) Has been cancelled Details
Test / test_rebalance_verify (push) Has been cancelled Details
Test / test_rebalance_verify_imm (push) Has been cancelled Details
Test / test_rebalance_verify_ec (push) Has been cancelled Details
Test / test_rebalance_verify_ec_imm (push) Has been cancelled Details
Test / test_switch_primary (push) Has been cancelled Details
Test / test_write (push) Has been cancelled Details
Test / test_write_xor (push) Has been cancelled Details
Test / test_write_no_same (push) Has been cancelled Details
Test / test_heal_pg_size_2 (push) Has been cancelled Details
Test / test_heal_ec (push) Has been cancelled Details
Test / test_heal_csum_32k_dmj (push) Has been cancelled Details
Test / test_heal_csum_32k_dj (push) Has been cancelled Details
Test / test_heal_csum_32k (push) Has been cancelled Details
Test / test_heal_csum_4k_dmj (push) Has been cancelled Details
Test / test_heal_csum_4k_dj (push) Has been cancelled Details
Test / build (push) Has been cancelled Details
Test / test_heal_csum_4k (push) Has been cancelled Details
Test / test_scrub (push) Has been cancelled Details
Test / test_scrub_zero_osd_2 (push) Has been cancelled Details
Test / test_scrub_xor (push) Has been cancelled Details
Test / test_scrub_pg_size_3 (push) Has been cancelled Details
Test / test_scrub_pg_size_6_pg_minsize_4_osd_count_6_ec (push) Has been cancelled Details
Test / test_scrub_ec (push) Has been cancelled Details
2024-03-07 19:35:22 +03:00
Vitaliy Filippov 7a55d59266 Fix vitastor-kv hang on reopen & unfinished closed listing
Test / test_minsize_1 (push) Has been cancelled Details
Test / test_move_reappear (push) Has been cancelled Details
Test / test_rm (push) Has been cancelled Details
Test / test_snapshot_chain (push) Has been cancelled Details
Test / test_snapshot_chain_ec (push) Has been cancelled Details
Test / test_snapshot_down (push) Has been cancelled Details
Test / test_snapshot_down_ec (push) Has been cancelled Details
Test / test_splitbrain (push) Has been cancelled Details
Test / test_rebalance_verify (push) Has been cancelled Details
Test / test_rebalance_verify_imm (push) Has been cancelled Details
Test / test_rebalance_verify_ec (push) Has been cancelled Details
Test / test_rebalance_verify_ec_imm (push) Has been cancelled Details
Test / test_switch_primary (push) Has been cancelled Details
Test / test_write (push) Has been cancelled Details
Test / test_write_xor (push) Has been cancelled Details
Test / test_write_no_same (push) Has been cancelled Details
Test / test_heal_pg_size_2 (push) Has been cancelled Details
Test / test_heal_ec (push) Has been cancelled Details
Test / test_heal_csum_32k_dmj (push) Has been cancelled Details
Test / test_heal_csum_32k_dj (push) Has been cancelled Details
Test / test_heal_csum_32k (push) Has been cancelled Details
Test / test_heal_csum_4k_dmj (push) Has been cancelled Details
Test / test_heal_csum_4k_dj (push) Has been cancelled Details
Test / test_heal_csum_4k (push) Has been cancelled Details
Test / test_scrub (push) Has been cancelled Details
Test / test_scrub_zero_osd_2 (push) Has been cancelled Details
Test / test_scrub_xor (push) Has been cancelled Details
Test / test_scrub_pg_size_3 (push) Has been cancelled Details
Test / test_scrub_pg_size_6_pg_minsize_4_osd_count_6_ec (push) Has been cancelled Details
Test / test_scrub_ec (push) Has been cancelled Details
2024-03-07 19:13:24 +03:00
3 changed files with 34 additions and 10 deletions

View File

@ -673,7 +673,7 @@ bool cluster_client_t::check_rw(cluster_op_t *op)
return false; return false;
} }
// Check alignment // Check alignment
if (!op->len && (op->opcode == OSD_OP_READ || op->opcode == OSD_OP_READ_BITMAP || op->opcode == OSD_OP_READ_CHAIN_BITMAP || op->opcode == OSD_OP_WRITE) || if (!op->len && (op->opcode == OSD_OP_READ_BITMAP || op->opcode == OSD_OP_READ_CHAIN_BITMAP || op->opcode == OSD_OP_WRITE) ||
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;

View File

@ -887,14 +887,23 @@ static void get_block(kv_db_t *db, uint64_t offset, int cur_level, int recheck_p
op->opcode = OSD_OP_READ; op->opcode = OSD_OP_READ;
op->inode = db->inode_id; op->inode = db->inode_id;
op->offset = offset; op->offset = offset;
op->len = db->kv_block_size; if (b_it != db->block_cache.end() && !b_it->second.invalidated && !b_it->second.updating)
op->iov.push_back(malloc_or_die(op->len), op->len); {
// just recheck version - it's cheaper than re-reading the block
op->len = 0;
}
else
{
op->len = db->kv_block_size;
op->iov.push_back(malloc_or_die(op->len), op->len);
}
op->callback = [=](cluster_op_t *op) op->callback = [=](cluster_op_t *op)
{ {
if (op->retval != op->len) if (op->retval != op->len)
{ {
// error // error
free(op->iov.buf[0].iov_base); if (op->len)
free(op->iov.buf[0].iov_base);
cb(op->retval >= 0 ? -EIO : op->retval, BLK_NOCHANGE); cb(op->retval >= 0 ? -EIO : op->retval, BLK_NOCHANGE);
delete op; delete op;
return; return;
@ -909,7 +918,8 @@ static void get_block(kv_db_t *db, uint64_t offset, int cur_level, int recheck_p
if (blk->updating > 0 && recheck_policy == KV_RECHECK_WAIT) if (blk->updating > 0 && recheck_policy == KV_RECHECK_WAIT)
{ {
// Wait until block update stops // Wait until block update stops
free(op->iov.buf[0].iov_base); if (op->len)
free(op->iov.buf[0].iov_base);
delete op; delete op;
db->continue_update.emplace(blk->offset, [=, blk_offset = blk->offset]() db->continue_update.emplace(blk->offset, [=, blk_offset = blk->offset]()
{ {
@ -923,6 +933,13 @@ static void get_block(kv_db_t *db, uint64_t offset, int cur_level, int recheck_p
} }
else else
{ {
if (!op->len)
{
// Version check failed, re-read block
delete op;
get_block(db, offset, cur_level, recheck_policy, cb);
return;
}
auto blk = &db->block_cache[op->offset]; auto blk = &db->block_cache[op->offset];
if (blk_it != db->block_cache.end()) if (blk_it != db->block_cache.end())
{ {
@ -944,7 +961,8 @@ static void get_block(kv_db_t *db, uint64_t offset, int cur_level, int recheck_p
} }
try_evict(db); try_evict(db);
} }
free(op->iov.buf[0].iov_base); if (op->len)
free(op->iov.buf[0].iov_base);
delete op; delete op;
}; };
db->cli->execute(op); db->cli->execute(op);
@ -987,12 +1005,13 @@ void kv_op_t::exec()
void kv_op_t::finish(int res) void kv_op_t::finish(int res)
{ {
auto db = this->db;
this->res = res; this->res = res;
this->done = true; this->done = true;
db->active_ops--; db->active_ops--;
(std::function<void(kv_op_t *)>(callback))(this);
if (!db->active_ops && db->closing) if (!db->active_ops && db->closing)
db->close(db->on_close); db->close(db->on_close);
(std::function<void(kv_op_t *)>(callback))(this);
} }
void kv_op_t::get() void kv_op_t::get()
@ -2039,5 +2058,10 @@ void kv_dbw_t::list_next(void *handle, std::function<void(int res, const std::st
void kv_dbw_t::list_close(void *handle) void kv_dbw_t::list_close(void *handle)
{ {
kv_op_t *op = (kv_op_t*)handle; kv_op_t *op = (kv_op_t*)handle;
if (op->started && !op->done)
{
op->done = true;
op->db->active_ops--;
}
delete op; delete op;
} }

View File

@ -147,6 +147,8 @@ json11::Json::object kv_test_t::parse_args(int narg, const char *args[])
" Fraction of key delete operations\n" " Fraction of key delete operations\n"
" --list_prob 300\n" " --list_prob 300\n"
" Fraction of listing operations\n" " Fraction of listing operations\n"
" --reopen_prob 1\n"
" Fraction of database reopens\n"
" --min_key_len 10\n" " --min_key_len 10\n"
" Minimum key size in bytes\n" " Minimum key size in bytes\n"
" --max_key_len 70\n" " --max_key_len 70\n"
@ -607,10 +609,8 @@ void kv_test_t::add_stat(kv_test_lat_t & stat, timespec tv_begin)
int64_t usec = (tv_end.tv_sec - tv_begin.tv_sec)*1000000 + int64_t usec = (tv_end.tv_sec - tv_begin.tv_sec)*1000000 +
(tv_end.tv_nsec - tv_begin.tv_nsec)/1000; (tv_end.tv_nsec - tv_begin.tv_nsec)/1000;
if (usec > 0) if (usec > 0)
{
stat.usec += usec; stat.usec += usec;
stat.count++; stat.count++;
}
} }
void kv_test_t::print_stats(kv_test_stat_t & prev_stat, timespec & prev_stat_time) void kv_test_t::print_stats(kv_test_stat_t & prev_stat, timespec & prev_stat_time)