Fix vitastor-kv hang on reopen & unfinished closed listing

master
Vitaliy Filippov 2024-03-07 01:18:49 +03:00
parent 231d4b15fc
commit 32ba653ba6
2 changed files with 15 additions and 4 deletions

View File

@ -197,6 +197,7 @@ struct kv_op_t
void exec();
void next(); // for list
~kv_op_t();
protected:
int recheck_policy = KV_RECHECK_LEAF;
bool started = false;
@ -985,14 +986,24 @@ void kv_op_t::exec()
finish(-ENOSYS);
}
kv_op_t::~kv_op_t()
{
if (started && !done)
{
done = true;
db->active_ops--;
}
}
void kv_op_t::finish(int res)
{
auto db = this->db;
this->res = res;
this->done = true;
db->active_ops--;
(std::function<void(kv_op_t *)>(callback))(this);
if (!db->active_ops && db->closing)
db->close(db->on_close);
(std::function<void(kv_op_t *)>(callback))(this);
}
void kv_op_t::get()

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"
" --list_prob 300\n"
" Fraction of listing operations\n"
" --reopen_prob 1\n"
" Fraction of database reopens\n"
" --min_key_len 10\n"
" Minimum key size in bytes\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 +
(tv_end.tv_nsec - tv_begin.tv_nsec)/1000;
if (usec > 0)
{
stat.usec += usec;
stat.count++;
}
stat.count++;
}
void kv_test_t::print_stats(kv_test_stat_t & prev_stat, timespec & prev_stat_time)