Skip to content

Commit 885d3d4

Browse files
Ravi Nagarjun AkellaRavi Nagarjun Akella
authored andcommitted
Add multi threaded UT to trigger cache eviction
1 parent 0bff606 commit 885d3d4

File tree

5 files changed

+85
-4
lines changed

5 files changed

+85
-4
lines changed

conanfile.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
class HomestoreConan(ConanFile):
1111
name = "homestore"
12-
version = "6.20.23"
12+
version = "6.20.24"
1313

1414
homepage = "https://github.com/eBay/Homestore"
1515
description = "HomeStore Storage Engine"
@@ -53,7 +53,7 @@ def build_requirements(self):
5353

5454
def requirements(self):
5555
self.requires("iomgr/[^11.3]@oss/master", transitive_headers=True)
56-
self.requires("sisl/[^12.4.7]@oss/master", transitive_headers=True)
56+
self.requires("sisl/12.4.11@oss/master", transitive_headers=True)
5757
self.requires("nuraft_mesg/[~3.8.7]@oss/main", transitive_headers=True)
5858

5959
self.requires("farmhash/cci.20190513@", transitive_headers=True)

src/lib/index/wb_cache.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ IndexWBCache::IndexWBCache(const std::shared_ptr< VirtualDev >& vdev, std::pair<
5151
},
5252
[](const sisl::CacheRecord& rec) -> bool {
5353
const auto& hnode = (sisl::SingleEntryHashNode< BtreeNodePtr >&)rec;
54-
return static_cast< IndexBtreeNode* >(hnode.m_value.get())->m_idx_buf->is_clean();
54+
auto idx_buf = static_cast< IndexBtreeNode* >(hnode.m_value.get())->m_idx_buf;
55+
return !idx_buf || idx_buf->is_clean();
5556
}},
5657
m_node_size{node_size},
5758
m_meta_blk{sb.first} {

src/tests/btree_helpers/btree_test_helper.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct BtreeTestHelper {
5050
m_max_range_input = SISL_OPTIONS["num_entries"].as< uint32_t >();
5151

5252
if (m_is_multi_threaded) {
53+
m_fibers.clear();
5354
std::mutex mtx;
5455
m_run_time = SISL_OPTIONS["run_time"].as< uint32_t >();
5556
iomanager.run_on_wait(iomgr::reactor_regex::all_worker, [this, &mtx]() {

src/tests/test_common/homestore_test_common.hpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <device/hs_super_blk.h>
3232
#include <iomgr/iomgr_config_generated.h>
3333
#include <common/homestore_assert.hpp>
34+
#include <iomgr/http_server.hpp>
3435

3536
#ifdef _PRERELEASE
3637
#include "common/crash_simulator.hpp"
@@ -70,6 +71,34 @@ using namespace homestore;
7071

7172
namespace test_common {
7273

74+
class test_http_server {
75+
public:
76+
void get_prometheus_metrics(const Pistache::Rest::Request&, Pistache::Http::ResponseWriter response) {
77+
response.send(Pistache::Http::Code::Ok,
78+
sisl::MetricsFarm::getInstance().report(sisl::ReportFormat::kTextFormat));
79+
}
80+
81+
void start() {
82+
auto http_server_ptr = ioenvironment.get_http_server();
83+
84+
std::vector< iomgr::http_route > routes = {
85+
{Pistache::Http::Method::Get, "/metrics",
86+
Pistache::Rest::Routes::bind(&test_http_server::get_prometheus_metrics, this), iomgr::url_t::safe}};
87+
try {
88+
http_server_ptr->setup_routes(routes);
89+
LOGINFO("Started http server ");
90+
} catch (std::runtime_error const& e) { LOGERROR("setup routes failed, {}", e.what()) }
91+
92+
// start the server
93+
http_server_ptr->start();
94+
}
95+
96+
void stop() {
97+
auto http_server_ptr = ioenvironment.get_http_server();
98+
http_server_ptr->stop();
99+
}
100+
};
101+
73102
// Fix a port for http server
74103
inline static void set_fixed_http_port(uint32_t http_port) {
75104
SETTINGS_FACTORY(iomgr_config).modifiable_settings([http_port](auto& s) { s.io_env->http_port = http_port; });
@@ -362,6 +391,12 @@ class HSTestHelper {
362391
}
363392
}
364393

394+
test_http_server* get_http_server() {
395+
return m_http_server.get();
396+
}
397+
398+
void set_app_mem_size(uint64_t app_mem_size) { m_app_mem_size = app_mem_size; }
399+
365400
private:
366401
void do_start_homestore(bool fake_restart = false, bool init_device = true, uint32_t shutdown_delay_sec = 5) {
367402
auto const ndevices = SISL_OPTIONS["num_devs"].as< uint32_t >();
@@ -429,7 +464,7 @@ class HSTestHelper {
429464
ioenvironment.with_http_server();
430465
}
431466

432-
const uint64_t app_mem_size = ((ndevices * dev_size) * 15) / 100;
467+
const uint64_t app_mem_size = (m_app_mem_size == 0) ? (((ndevices * dev_size) * 15) / 100) : m_app_mem_size;
433468
LOGINFO("Initialize and start HomeStore with app_mem_size = {}", homestore::in_bytes(app_mem_size));
434469

435470
using namespace homestore;
@@ -530,6 +565,8 @@ class HSTestHelper {
530565
protected:
531566
test_token m_token;
532567
std::vector< std::string > m_generated_devs;
568+
std::unique_ptr< test_http_server > m_http_server;
569+
uint64_t m_app_mem_size{0};
533570
#ifdef _PRERELEASE
534571
flip::FlipClient m_fc{iomgr_flip::instance()};
535572
folly::Promise< folly::Unit > m_crash_recovered;

src/tests/test_index_btree.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ SISL_OPTION_GROUP(
5151
::cxxopts::value< bool >()->default_value("1"), ""),
5252
(max_merge_level, "", "max_merge_level", "max merge level", ::cxxopts::value< uint8_t >()->default_value("127"),
5353
""),
54+
(cache_pct, "", "cache_pct", "cache percentage", ::cxxopts::value< uint32_t >()->default_value("10"),
55+
""),
56+
(app_mem_size_mb, "", "app_mem_size_mb", "application memory size", ::cxxopts::value< uint64_t >()->default_value("900"),
57+
""),
5458
(seed, "", "seed", "random engine seed, use random if not defined",
5559
::cxxopts::value< uint64_t >()->default_value("0"), "number"))
5660

@@ -108,13 +112,18 @@ struct BtreeTest : public BtreeTestHelper< TestType >, public ::testing::Test {
108112
this->m_bt = std::make_shared< typename T::BtreeType >(uuid, parent_uuid, 0, this->m_cfg);
109113
hs()->index_service().add_index_table(this->m_bt);
110114
LOGINFO("Added index table to index service");
115+
116+
//start http server
117+
m_helper.get_http_server()->start();
118+
LOGINFO("Started http server");
111119
}
112120

113121
void TearDown() override {
114122
BtreeTestHelper< TestType >::TearDown();
115123
auto [interior, leaf] = this->m_bt->compute_node_count();
116124
LOGINFO("Teardown with Root bnode_id {} tree size: {} btree node count (interior = {} leaf= {})",
117125
this->m_bt->root_node_id(), this->m_bt->count_keys(this->m_bt->root_node_id()), interior, leaf);
126+
m_helper.get_http_server()->stop();
118127
m_helper.shutdown_homestore(false);
119128
this->m_bt.reset();
120129
log_obj_life_counter();
@@ -479,6 +488,11 @@ struct BtreeConcurrentTest : public BtreeTestHelper< TestType >, public ::testin
479488
void restart_homestore() {
480489
m_helper.params(HS_SERVICE::INDEX).index_svc_cbs = new TestIndexServiceCallbacks(this);
481490
m_helper.restart_homestore();
491+
BtreeTestHelper< TestType >::SetUp();
492+
}
493+
494+
void set_app_mem_size(uint64_t app_mem_size) {
495+
m_helper.set_app_mem_size(app_mem_size);
482496
}
483497

484498
void SetUp() override {
@@ -558,6 +572,34 @@ TYPED_TEST(BtreeConcurrentTest, ConcurrentAllOps) {
558572
this->multi_op_execute(ops, !SISL_OPTIONS["init_device"].as< bool >());
559573
}
560574

575+
TYPED_TEST(BtreeConcurrentTest, ConcurrentAllOpsCacheEviction) {
576+
// restart homestore with smaller cache %
577+
HS_SETTINGS_FACTORY().modifiable_settings([](auto& s) {
578+
s.resource_limits.cache_size_percent = SISL_OPTIONS["cache_pct"].as< uint32_t >();
579+
HS_SETTINGS_FACTORY().save();
580+
});
581+
this->set_app_mem_size(SISL_OPTIONS["app_mem_size_mb"].as< uint64_t >() * 1024 * 1024);
582+
583+
this->restart_homestore();
584+
585+
// range put is not supported for non-extent keys
586+
std::vector< std::string > input_ops = {"put:80", "remove:10", "query:10"};
587+
if (SISL_OPTIONS.count("operation_list")) {
588+
input_ops = SISL_OPTIONS["operation_list"].as< std::vector< std::string > >();
589+
}
590+
auto ops = this->build_op_list(input_ops);
591+
592+
this->multi_op_execute(ops, !SISL_OPTIONS["init_device"].as< bool >());
593+
594+
LOGINFO("Metrics dump {}", sisl::MetricsFarm::getInstance().report(sisl::ReportFormat::kTextFormat));
595+
// reset cache pct
596+
HS_SETTINGS_FACTORY().modifiable_settings([](auto& s) {
597+
s.resource_limits.cache_size_percent = 65u;
598+
HS_SETTINGS_FACTORY().save();
599+
});
600+
this->set_app_mem_size(0);
601+
}
602+
561603
int main(int argc, char* argv[]) {
562604
int parsed_argc{argc};
563605
::testing::InitGoogleTest(&parsed_argc, argv);

0 commit comments

Comments
 (0)