From b2e989a4fb606f71ff242c8d945c973bd7314a06 Mon Sep 17 00:00:00 2001 From: Shahar Mike Date: Wed, 25 Oct 2023 22:44:09 +0300 Subject: [PATCH] fix(server): Fix crash when connection uses multiple lua scripts (#2073) --- src/server/main_service.cc | 4 +++- src/server/multi_test.cc | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/server/main_service.cc b/src/server/main_service.cc index 4bdcbb600..8d40a8779 100644 --- a/src/server/main_service.cc +++ b/src/server/main_service.cc @@ -1903,8 +1903,10 @@ void Service::Exec(CmdArgList args, ConnectionContext* cntx) { } } - if (exec_info.preborrowed_interpreter) + if (exec_info.preborrowed_interpreter) { ServerState::tlocal()->ReturnInterpreter(exec_info.preborrowed_interpreter); + exec_info.preborrowed_interpreter = nullptr; + } if (scheduled) { VLOG(1) << "Exec unlocking " << exec_info.body.size() << " commands"; diff --git a/src/server/multi_test.cc b/src/server/multi_test.cc index 8a6efdacc..b0335c6b4 100644 --- a/src/server/multi_test.cc +++ b/src/server/multi_test.cc @@ -950,4 +950,13 @@ TEST_F(MultiEvalTest, ScriptSquashingUknownCmd) { EXPECT_EQ(Run({"get", "A"}), "2"); } +TEST_F(MultiEvalTest, MultiAndEval) { + // We had a bug in borrowing interpreters which caused a crash in this scenario + Run({"multi"}); + Run({"eval", "return redis.call('set', 'x', 'y1')", "1", "x"}); + Run({"exec"}); + + Run({"eval", "return redis.call('set', 'x', 'y1')", "1", "x"}); +} + } // namespace dfly