#include "rgw_lua_background.h"
#include "rgw_lua_data_filter.h"
#include "rgw_sal_config.h"
+#include "rgw_perf_counters.h"
using namespace std;
using namespace rgw;
return std::make_unique<StoreBundle>(std::move(context_pool));
};
+class TestLuaManager : public rgw::sal::StoreLuaManager {
+ public:
+ std::string lua_script;
+ unsigned read_time = 0;
+ TestLuaManager() {
+ rgw_perf_start(g_cct);
+ }
+ int get_script(const DoutPrefixProvider* dpp, optional_yield y, const std::string& key, std::string& script) override {
+ std::this_thread::sleep_for(std::chrono::seconds(read_time));
+ script = lua_script;
+ return 0;
+ }
+ int put_script(const DoutPrefixProvider* dpp, optional_yield y, const std::string& key, const std::string& script) override {
+ return 0;
+ }
+ int del_script(const DoutPrefixProvider* dpp, optional_yield y, const std::string& key) override {
+ return 0;
+ }
+ int add_package(const DoutPrefixProvider* dpp, optional_yield y, const std::string& package_name) override {
+ return 0;
+ }
+ int remove_package(const DoutPrefixProvider* dpp, optional_yield y, const std::string& package_name) override {
+ return 0;
+ }
+ int list_packages(const DoutPrefixProvider* dpp, optional_yield y, rgw::lua::packages_t& packages) override {
+ return 0;
+ }
+ int reload_packages(const DoutPrefixProvider* dpp, optional_yield y) override {
+ return 0;
+ }
+ ~TestLuaManager() {
+ rgw_perf_stop(g_cct);
+ }
+};
+
+void set_script(rgw::sal::LuaManager* manager, const std::string& script) {
+ static_cast<TestLuaManager*>(manager)->lua_script = script;
+}
+void set_read_time(rgw::sal::LuaManager* manager, unsigned read_time) {
+ static_cast<TestLuaManager*>(manager)->read_time = read_time;
+}
+
#define DEFINE_REQ_STATE RGWProcessEnv pe; \
auto store = make_store(); \
- pe.lua.manager = store->get_lua_manager(""); \
+ pe.lua.manager = std::make_unique<TestLuaManager>(); \
RGWEnv e; \
req_state s(g_cct, pe, &e, 0);
}
class TestBackground : public rgw::lua::Background {
- const unsigned read_time;
-
-protected:
- int read_script() override {
- // don't read the object from the store
- std::this_thread::sleep_for(std::chrono::seconds(read_time));
- return 0;
- }
-
public:
- TestBackground(sal::RadosStore* store, const std::string& script, rgw::sal::LuaManager* manager, unsigned read_time = 0) :
+ TestBackground(sal::RadosStore* store, rgw::sal::LuaManager* manager) :
rgw::lua::Background(store,
g_cct,
manager,
- 1 /* run every second */),
- read_time(read_time) {
- // the script is passed in the constructor
- rgw_script = script;
+ 1 /* run every second */) {
}
~TestBackground() override {
TEST(TestRGWLuaBackground, Start)
{
auto store = make_store();
- auto manager = store->get_lua_manager("");
+ auto manager = std::make_unique<TestLuaManager>();
{
// ctr and dtor without running
- TestBackground lua_background(store.get(), "", manager.get());
+ TestBackground lua_background(store.get(), manager.get());
}
{
// ctr and dtor with running
- TestBackground lua_background(store.get(), "", manager.get());
+ TestBackground lua_background(store.get(), manager.get());
lua_background.start();
}
}
-
-constexpr auto wait_time = std::chrono::seconds(3);
+constexpr auto wait_time = std::chrono::milliseconds(100);
template<typename T>
const T& get_table_value(const TestBackground& b, const std::string& index) {
}
}
+#define WAIT_FOR_BACKGROUND \
+{ \
+ unsigned max_tries = 100; \
+ do { \
+ std::this_thread::sleep_for(wait_time); \
+ --max_tries; \
+ } while (perfcounter->get(l_rgw_lua_script_ok) + perfcounter->get(l_rgw_lua_script_fail) == 0 && max_tries > 0); \
+}
+
TEST(TestRGWLuaBackground, Script)
{
const std::string script = R"(
)";
auto store = make_store();
- auto manager = store->get_lua_manager("");
- TestBackground lua_background(store.get(), script, manager.get());
+ auto manager = std::make_unique<TestLuaManager>();
+ set_script(manager.get(), script);
+ TestBackground lua_background(store.get(), manager.get());
lua_background.start();
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
EXPECT_EQ(get_table_value<std::string>(lua_background, "hello"), "world");
}
)";
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), background_script, pe.lua.manager.get());
+ set_script(pe.lua.manager.get(), background_script);
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
lua_background.start();
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
const std::string request_script = R"(
local key = "hello"
ASSERT_EQ(rc, 0);
EXPECT_EQ(get_table_value<std::string>(lua_background, "hello"), "from request");
// now we resume and let the background set the value
+ perfcounter->set(l_rgw_lua_script_ok, 0);
lua_background.resume(store.get());
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
EXPECT_EQ(get_table_value<std::string>(lua_background, "hello"), "from background");
}
)";
auto store = make_store();
- auto manager = store->get_lua_manager("");
- TestBackground lua_background(store.get(), script, manager.get());
+ auto manager = std::make_unique<TestLuaManager>();
+ set_script(manager.get(), script);
+ TestBackground lua_background(store.get(), manager.get());
lua_background.start();
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
const auto value_len = get_table_value<std::string>(lua_background, "hello").size();
EXPECT_GT(value_len, 0);
lua_background.pause();
- std::this_thread::sleep_for(wait_time);
+ // make sure no execution occurs
+ std::this_thread::sleep_for(wait_time*10);
// no change in len
EXPECT_EQ(value_len, get_table_value<std::string>(lua_background, "hello").size());
}
)";
auto store = make_store();
- auto manager = store->get_lua_manager("");
- TestBackground lua_background(store.get(), script, manager.get(), 2);
+ auto manager = std::make_unique<TestLuaManager>();
+ set_script(manager.get(), script);
+ set_read_time(manager.get(), 2);
+ TestBackground lua_background(store.get(), manager.get());
lua_background.start();
- constexpr auto long_wait_time = std::chrono::seconds(6);
- std::this_thread::sleep_for(long_wait_time);
+ WAIT_FOR_BACKGROUND;
const auto value_len = get_table_value<std::string>(lua_background, "hello").size();
EXPECT_GT(value_len, 0);
lua_background.pause();
- std::this_thread::sleep_for(long_wait_time);
+ // make sure no execution occurs
+ std::this_thread::sleep_for(wait_time*10);
// one execution might occur after pause
EXPECT_TRUE(value_len + 1 >= get_table_value<std::string>(lua_background, "hello").size());
}
)";
auto store = make_store();
- auto manager = store->get_lua_manager("");
- TestBackground lua_background(store.get(), script, manager.get());
+ auto manager = std::make_unique<TestLuaManager>();
+ set_script(manager.get(), script);
+ TestBackground lua_background(store.get(), manager.get());
lua_background.pause();
lua_background.start();
- std::this_thread::sleep_for(wait_time);
+ // make sure no execution occurs
+ std::this_thread::sleep_for(wait_time*10);
EXPECT_EQ(get_table_value<std::string>(lua_background, "hello"), "");
lua_background.resume(store.get());
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
EXPECT_EQ(get_table_value<std::string>(lua_background, "hello"), "world");
}
)";
auto store = make_store();
- auto manager = store->get_lua_manager("");
- TestBackground lua_background(store.get(), script, manager.get());
+ auto manager = std::make_unique<TestLuaManager>();
+ set_script(manager.get(), script);
+ TestBackground lua_background(store.get(), manager.get());
lua_background.start();
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
const auto value_len = get_table_value<std::string>(lua_background, "hello").size();
EXPECT_GT(value_len, 0);
lua_background.pause();
- std::this_thread::sleep_for(wait_time);
+ // make sure no execution occurs
+ std::this_thread::sleep_for(wait_time*10);
// no change in len
EXPECT_EQ(value_len, get_table_value<std::string>(lua_background, "hello").size());
+ perfcounter->set(l_rgw_lua_script_ok, 0);
lua_background.resume(store.get());
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
// should be a change in len
EXPECT_GT(get_table_value<std::string>(lua_background, "hello").size(), value_len);
}
)";
auto store = make_store();
- auto manager = store->get_lua_manager("");
- TestBackground lua_background(store.get(), script, manager.get());
+ auto manager = std::make_unique<TestLuaManager>();
+ set_script(manager.get(), script);
+ TestBackground lua_background(store.get(), manager.get());
lua_background.start();
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
const auto value_len = get_table_value<std::string>(lua_background, "hello").size();
EXPECT_GT(value_len, 0);
lua_background.start();
lua_background.shutdown();
lua_background.shutdown();
- std::this_thread::sleep_for(wait_time);
+ perfcounter->set(l_rgw_lua_script_ok, 0);
lua_background.start();
- std::this_thread::sleep_for(wait_time);
+ WAIT_FOR_BACKGROUND;
// should be a change in len
EXPECT_GT(get_table_value<std::string>(lua_background, "hello").size(), value_len);
}
TEST(TestRGWLuaBackground, TableValues)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
const std::string request_script = R"(
RGW["key1"] = "string value"
TEST(TestRGWLuaBackground, TablePersist)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
std::string request_script = R"(
RGW["key1"] = "string value"
TEST(TestRGWLuaBackground, TableValuesFromRequest)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
lua_background.start();
const std::string request_script = R"(
TEST(TestRGWLuaBackground, TableInvalidValue)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
lua_background.start();
const std::string request_script = R"(
TEST(TestRGWLuaBackground, TableErase)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
std::string request_script = R"(
RGW["size"] = 0
TEST(TestRGWLuaBackground, TableIterate)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
const std::string request_script = R"(
RGW["key1"] = "string value"
TEST(TestRGWLuaBackground, TableIterateWrite)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
const std::string request_script = R"(
RGW["a"] = 1
TEST(TestRGWLuaBackground, TableIncrement)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
const std::string request_script = R"(
RGW["key1"] = 42
TEST(TestRGWLuaBackground, TableIncrementBy)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
const std::string request_script = R"(
RGW["key1"] = 42
TEST(TestRGWLuaBackground, TableDecrement)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
const std::string request_script = R"(
RGW["key1"] = 42
TEST(TestRGWLuaBackground, TableDecrementBy)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
const std::string request_script = R"(
RGW["key1"] = 42
TEST(TestRGWLuaBackground, TableIncrementValueError)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
std::string request_script = R"(
-- cannot increment string values
TEST(TestRGWLuaBackground, TableIncrementError)
{
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
std::string request_script = R"(
-- missing argument
)";
DEFINE_REQ_STATE;
- TestBackground lua_background(store.get(), "", pe.lua.manager.get());
+ TestBackground lua_background(store.get(), pe.lua.manager.get());
s.host_id = "foo";
pe.lua.background = &lua_background;
lua::RGWObjFilter filter(&s, script);