From 32ba653ba6a99fa728996048ff2b7e3a6692cf6c Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Thu, 7 Mar 2024 01:18:49 +0300 Subject: [PATCH] Fix vitastor-kv hang on reopen & unfinished closed listing --- src/kv_db.cpp | 13 ++++++++++++- src/kv_stress.cpp | 6 +++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/kv_db.cpp b/src/kv_db.cpp index f17be216..35a2d007 100644 --- a/src/kv_db.cpp +++ b/src/kv_db.cpp @@ -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(callback))(this); if (!db->active_ops && db->closing) db->close(db->on_close); - (std::function(callback))(this); } void kv_op_t::get() diff --git a/src/kv_stress.cpp b/src/kv_stress.cpp index 279aace4..8bcf819a 100644 --- a/src/kv_stress.cpp +++ b/src/kv_stress.cpp @@ -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)