Fix vitastor-kv hang on reopen & unfinished closed listing
parent
231d4b15fc
commit
32ba653ba6
|
@ -197,6 +197,7 @@ struct kv_op_t
|
||||||
|
|
||||||
void exec();
|
void exec();
|
||||||
void next(); // for list
|
void next(); // for list
|
||||||
|
~kv_op_t();
|
||||||
protected:
|
protected:
|
||||||
int recheck_policy = KV_RECHECK_LEAF;
|
int recheck_policy = KV_RECHECK_LEAF;
|
||||||
bool started = false;
|
bool started = false;
|
||||||
|
@ -985,14 +986,24 @@ void kv_op_t::exec()
|
||||||
finish(-ENOSYS);
|
finish(-ENOSYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kv_op_t::~kv_op_t()
|
||||||
|
{
|
||||||
|
if (started && !done)
|
||||||
|
{
|
||||||
|
done = true;
|
||||||
|
db->active_ops--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue