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