fix: lua and client tracking (#3163)

* add missing tracking_cb_ invkoe in RunSquashedMultiCb
* add test
This commit is contained in:
Kostas Kyrimis 2024-06-11 16:24:44 +03:00 committed by GitHub
parent 007d4854db
commit 7f9a13bb50
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 26 additions and 3 deletions

View file

@ -6,6 +6,7 @@
#include <absl/strings/match.h> #include <absl/strings/match.h>
#include "absl/strings/str_cat.h"
#include "base/gtest.h" #include "base/gtest.h"
#include "base/logging.h" #include "base/logging.h"
#include "facade/facade_test.h" #include "facade/facade_test.h"
@ -447,4 +448,21 @@ TEST_F(ServerFamilyTest, ClientTrackingNonTransactionalBug) {
Run({"CLUSTER", "SLOTS"}); Run({"CLUSTER", "SLOTS"});
} }
TEST_F(ServerFamilyTest, ClientTrackingLuaBug) {
Run({"HELLO", "3"});
// Check stickiness
Run({"CLIENT", "TRACKING", "ON"});
using namespace std::string_literals;
std::string eval = R"(redis.call('get', 'foo'); redis.call('set', 'foo', 'bar'); )";
Run({"EVAL", absl::StrCat(eval, "return 1"), "1", "foo"});
Run({"PING"});
EXPECT_EQ(InvalidationMessagesLen("IO0"), 1);
absl::StrAppend(&eval, R"(redis.call('get', 'oof'); redis.call('set', 'oof', 'bar'); return 1)");
Run({"EVAL", eval, "2", "foo", "oof"});
Run({"PING"});
EXPECT_EQ(InvalidationMessagesLen("IO0"), 3);
}
} // namespace dfly } // namespace dfly

View file

@ -665,9 +665,7 @@ void Transaction::RunCallback(EngineShard* shard) {
// Log to journal only once the command finished running // Log to journal only once the command finished running
if ((coordinator_state_ & COORD_CONCLUDING) || (multi_ && multi_->concluding)) { if ((coordinator_state_ & COORD_CONCLUDING) || (multi_ && multi_->concluding)) {
LogAutoJournalOnShard(shard, result); LogAutoJournalOnShard(shard, result);
if (tracking_cb_) { MaybeInvokeTrackingCb();
tracking_cb_(this);
}
} }
} }
@ -1252,6 +1250,7 @@ OpStatus Transaction::RunSquashedMultiCb(RunnableType cb) {
auto result = cb(this, shard); auto result = cb(this, shard);
shard->db_slice().OnCbFinish(); shard->db_slice().OnCbFinish();
LogAutoJournalOnShard(shard, result); LogAutoJournalOnShard(shard, result);
MaybeInvokeTrackingCb();
DCHECK_EQ(result.flags, 0); // if it's sophisticated, we shouldn't squash it DCHECK_EQ(result.flags, 0); // if it's sophisticated, we shouldn't squash it
return result; return result;

View file

@ -364,6 +364,12 @@ class Transaction {
tracking_cb_ = std::move(f); tracking_cb_ = std::move(f);
} }
void MaybeInvokeTrackingCb() {
if (tracking_cb_) {
tracking_cb_(this);
}
}
// Remove once BZPOP is stabilized // Remove once BZPOP is stabilized
std::string DEBUGV18_BlockInfo() { std::string DEBUGV18_BlockInfo() {
return "claimed=" + std::to_string(blocking_barrier_.IsClaimed()) + return "claimed=" + std::to_string(blocking_barrier_.IsClaimed()) +