mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-10 18:05:44 +02:00
refactor: remove transaction lib on cluster code dependency (#4417)
This commit is contained in:
parent
cb752d90cd
commit
933c9f0b1c
30 changed files with 221 additions and 198 deletions
|
@ -27,7 +27,7 @@ endif()
|
||||||
|
|
||||||
|
|
||||||
add_library(dfly_transaction db_slice.cc blocking_controller.cc
|
add_library(dfly_transaction db_slice.cc blocking_controller.cc
|
||||||
command_registry.cc cluster/cluster_utility.cc
|
command_registry.cc cluster_support.cc
|
||||||
journal/cmd_serializer.cc journal/tx_executor.cc namespaces.cc
|
journal/cmd_serializer.cc journal/tx_executor.cc namespaces.cc
|
||||||
common.cc journal/journal.cc journal/types.cc journal/journal_slice.cc
|
common.cc journal/journal.cc journal/types.cc journal/journal_slice.cc
|
||||||
server_state.cc table.cc top_keys.cc transaction.cc tx_base.cc
|
server_state.cc table.cc top_keys.cc transaction.cc tx_base.cc
|
||||||
|
@ -60,7 +60,7 @@ add_library(dragonfly_lib bloom_family.cc
|
||||||
${DF_SEARCH_SRCS}
|
${DF_SEARCH_SRCS}
|
||||||
${DF_LINUX_SRCS}
|
${DF_LINUX_SRCS}
|
||||||
cluster/cluster_config.cc cluster/cluster_family.cc cluster/incoming_slot_migration.cc
|
cluster/cluster_config.cc cluster/cluster_family.cc cluster/incoming_slot_migration.cc
|
||||||
cluster/outgoing_slot_migration.cc cluster/cluster_defs.cc
|
cluster/outgoing_slot_migration.cc cluster/cluster_defs.cc cluster/cluster_utility.cc
|
||||||
acl/user.cc acl/user_registry.cc acl/acl_family.cc
|
acl/user.cc acl/user_registry.cc acl/acl_family.cc
|
||||||
acl/validator.cc)
|
acl/validator.cc)
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
// Copyright 2024, DragonflyDB authors. All rights reserved.
|
||||||
|
// See LICENSE for licensing terms.
|
||||||
|
//
|
||||||
|
|
||||||
#include "cluster_config.h"
|
#include "cluster_config.h"
|
||||||
|
|
||||||
#include <absl/container/flat_hash_set.h>
|
#include <absl/container/flat_hash_set.h>
|
||||||
|
@ -39,7 +43,7 @@ bool HasValidNodeIds(const ClusterShardInfos& new_config) {
|
||||||
|
|
||||||
bool IsConfigValid(const ClusterShardInfos& new_config) {
|
bool IsConfigValid(const ClusterShardInfos& new_config) {
|
||||||
// Make sure that all slots are set exactly once.
|
// Make sure that all slots are set exactly once.
|
||||||
vector<bool> slots_found(cluster::kMaxSlotNum + 1);
|
vector<bool> slots_found(kMaxSlotNum + 1);
|
||||||
|
|
||||||
if (!HasValidNodeIds(new_config)) {
|
if (!HasValidNodeIds(new_config)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -309,7 +313,7 @@ std::shared_ptr<ClusterConfig> ClusterConfig::CloneWithoutMigrations() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClusterConfig::IsMySlot(SlotId id) const {
|
bool ClusterConfig::IsMySlot(SlotId id) const {
|
||||||
if (id > cluster::kMaxSlotNum) {
|
if (id > kMaxSlotNum) {
|
||||||
DCHECK(false) << "Requesting a non-existing slot id " << id;
|
DCHECK(false) << "Requesting a non-existing slot id " << id;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +326,7 @@ bool ClusterConfig::IsMySlot(std::string_view key) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
ClusterNodeInfo ClusterConfig::GetMasterNodeForSlot(SlotId id) const {
|
ClusterNodeInfo ClusterConfig::GetMasterNodeForSlot(SlotId id) const {
|
||||||
CHECK_LE(id, cluster::kMaxSlotNum) << "Requesting a non-existing slot id " << id;
|
CHECK_LE(id, kMaxSlotNum) << "Requesting a non-existing slot id " << id;
|
||||||
|
|
||||||
for (const auto& shard : config_) {
|
for (const auto& shard : config_) {
|
||||||
if (shard.slot_ranges.Contains(id)) {
|
if (shard.slot_ranges.Contains(id)) {
|
||||||
|
|
|
@ -1,27 +1,20 @@
|
||||||
|
// Copyright 2024, DragonflyDB authors. All rights reserved.
|
||||||
|
// See LICENSE for licensing terms.
|
||||||
|
//
|
||||||
|
|
||||||
extern "C" {
|
#include "cluster_defs.h"
|
||||||
#include "redis/crc16.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <absl/strings/str_cat.h>
|
#include <absl/strings/str_cat.h>
|
||||||
#include <absl/strings/str_join.h>
|
#include <absl/strings/str_join.h>
|
||||||
|
|
||||||
#include "base/flags.h"
|
|
||||||
#include "base/logging.h"
|
|
||||||
#include "cluster_defs.h"
|
|
||||||
#include "facade/error.h"
|
#include "facade/error.h"
|
||||||
#include "slot_set.h"
|
#include "slot_set.h"
|
||||||
#include "src/server/common.h"
|
|
||||||
|
|
||||||
// TODO remove when tl_cluster_config will be moved out from it
|
// TODO remove when tl_cluster_config will be moved out from it
|
||||||
#include "server/cluster/cluster_family.h"
|
#include "server/cluster/cluster_family.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
ABSL_FLAG(string, cluster_mode, "",
|
|
||||||
"Cluster mode supported. Possible values are "
|
|
||||||
"'emulated', 'yes' or ''");
|
|
||||||
|
|
||||||
namespace dfly::cluster {
|
namespace dfly::cluster {
|
||||||
std::string SlotRange::ToString() const {
|
std::string SlotRange::ToString() const {
|
||||||
return absl::StrCat("[", start, ", ", end, "]");
|
return absl::StrCat("[", start, ", ", end, "]");
|
||||||
|
@ -69,53 +62,6 @@ ClusterShardInfos::ClusterShardInfos(std::vector<ClusterShardInfo> infos)
|
||||||
std::sort(infos_.begin(), infos_.end());
|
std::sort(infos_.begin(), infos_.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
enum class ClusterMode {
|
|
||||||
kUninitialized,
|
|
||||||
kNoCluster,
|
|
||||||
kEmulatedCluster,
|
|
||||||
kRealCluster,
|
|
||||||
};
|
|
||||||
|
|
||||||
ClusterMode cluster_mode = ClusterMode::kUninitialized;
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
void InitializeCluster() {
|
|
||||||
string cluster_mode_str = absl::GetFlag(FLAGS_cluster_mode);
|
|
||||||
|
|
||||||
if (cluster_mode_str == "emulated") {
|
|
||||||
cluster_mode = ClusterMode::kEmulatedCluster;
|
|
||||||
} else if (cluster_mode_str == "yes") {
|
|
||||||
cluster_mode = ClusterMode::kRealCluster;
|
|
||||||
} else if (cluster_mode_str.empty()) {
|
|
||||||
cluster_mode = ClusterMode::kNoCluster;
|
|
||||||
} else {
|
|
||||||
LOG(ERROR) << "Invalid value for flag --cluster_mode. Exiting...";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsClusterEnabled() {
|
|
||||||
return cluster_mode == ClusterMode::kRealCluster;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsClusterEmulated() {
|
|
||||||
return cluster_mode == ClusterMode::kEmulatedCluster;
|
|
||||||
}
|
|
||||||
|
|
||||||
SlotId KeySlot(std::string_view key) {
|
|
||||||
string_view tag = LockTagOptions::instance().Tag(key);
|
|
||||||
return crc16(tag.data(), tag.length()) & kMaxSlotNum;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsClusterEnabledOrEmulated() {
|
|
||||||
return IsClusterEnabled() || IsClusterEmulated();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsClusterShardedByTag() {
|
|
||||||
return IsClusterEnabledOrEmulated() || LockTagOptions::instance().enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
facade::ErrorReply SlotOwnershipError(SlotId slot_id) {
|
facade::ErrorReply SlotOwnershipError(SlotId slot_id) {
|
||||||
const cluster::ClusterConfig* cluster_config = ClusterFamily::cluster_config();
|
const cluster::ClusterConfig* cluster_config = ClusterFamily::cluster_config();
|
||||||
if (!cluster_config)
|
if (!cluster_config)
|
||||||
|
|
|
@ -11,14 +11,10 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "facade/facade_types.h"
|
#include "facade/facade_types.h"
|
||||||
|
#include "server/cluster_support.h"
|
||||||
|
|
||||||
namespace dfly::cluster {
|
namespace dfly::cluster {
|
||||||
|
|
||||||
using SlotId = uint16_t;
|
|
||||||
|
|
||||||
constexpr SlotId kMaxSlotNum = 0x3FFF;
|
|
||||||
constexpr SlotId kInvalidSlotId = kMaxSlotNum + 1;
|
|
||||||
|
|
||||||
struct SlotRange {
|
struct SlotRange {
|
||||||
static constexpr SlotId kMaxSlotId = 0x3FFF;
|
static constexpr SlotId kMaxSlotId = 0x3FFF;
|
||||||
SlotId start = 0;
|
SlotId start = 0;
|
||||||
|
@ -169,15 +165,7 @@ enum class MigrationState : uint8_t {
|
||||||
C_FINISHED,
|
C_FINISHED,
|
||||||
};
|
};
|
||||||
|
|
||||||
SlotId KeySlot(std::string_view key);
|
|
||||||
|
|
||||||
// return error message if slot doesn't belong to this node
|
// return error message if slot doesn't belong to this node
|
||||||
facade::ErrorReply SlotOwnershipError(SlotId slot_id);
|
facade::ErrorReply SlotOwnershipError(SlotId slot_id);
|
||||||
|
|
||||||
void InitializeCluster();
|
|
||||||
bool IsClusterEnabled();
|
|
||||||
bool IsClusterEmulated();
|
|
||||||
bool IsClusterEnabledOrEmulated();
|
|
||||||
bool IsClusterShardedByTag();
|
|
||||||
|
|
||||||
} // namespace dfly::cluster
|
} // namespace dfly::cluster
|
||||||
|
|
|
@ -406,7 +406,7 @@ void ClusterFamily::KeySlot(CmdArgList args, SinkReplyBuilder* builder) {
|
||||||
return builder->SendError(WrongNumArgsError("CLUSTER KEYSLOT"));
|
return builder->SendError(WrongNumArgsError("CLUSTER KEYSLOT"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SlotId id = cluster::KeySlot(ArgS(args, 1));
|
SlotId id = dfly::KeySlot(ArgS(args, 1));
|
||||||
return builder->SendLong(id);
|
return builder->SendLong(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
// Copyright 2024, DragonflyDB authors. All rights reserved.
|
||||||
|
// See LICENSE for licensing terms.
|
||||||
|
//
|
||||||
|
|
||||||
#include "server/cluster/cluster_utility.h"
|
#include "server/cluster/cluster_utility.h"
|
||||||
|
|
||||||
#include "server/cluster/cluster_defs.h"
|
#include "server/cluster/cluster_defs.h"
|
||||||
|
@ -8,37 +12,6 @@ using namespace std;
|
||||||
|
|
||||||
namespace dfly::cluster {
|
namespace dfly::cluster {
|
||||||
|
|
||||||
void UniqueSlotChecker::Add(std::string_view key) {
|
|
||||||
if (!IsClusterEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Add(KeySlot(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UniqueSlotChecker::Add(SlotId slot_id) {
|
|
||||||
if (!IsClusterEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!slot_id_.has_value()) {
|
|
||||||
slot_id_ = slot_id;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*slot_id_ != slot_id) {
|
|
||||||
slot_id_ = kInvalidSlotId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
optional<SlotId> UniqueSlotChecker::GetUniqueSlotId() const {
|
|
||||||
if (slot_id_.has_value() && *slot_id_ == kInvalidSlotId) {
|
|
||||||
return nullopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
return slot_id_;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t GetKeyCount(const SlotRanges& slots) {
|
uint64_t GetKeyCount(const SlotRanges& slots) {
|
||||||
std::atomic_uint64_t keys = 0;
|
std::atomic_uint64_t keys = 0;
|
||||||
|
|
||||||
|
|
|
@ -4,26 +4,10 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <optional>
|
|
||||||
#include <string_view>
|
|
||||||
|
|
||||||
#include "server/cluster/cluster_defs.h"
|
#include "server/cluster/cluster_defs.h"
|
||||||
|
|
||||||
namespace dfly::cluster {
|
namespace dfly::cluster {
|
||||||
|
|
||||||
// A simple utility class that "aggregates" SlotId-s and can tell whether all inputs were the same.
|
|
||||||
// Only works when cluster is enabled.
|
|
||||||
class UniqueSlotChecker {
|
|
||||||
public:
|
|
||||||
void Add(std::string_view key);
|
|
||||||
void Add(SlotId slot_id);
|
|
||||||
|
|
||||||
std::optional<SlotId> GetUniqueSlotId() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::optional<SlotId> slot_id_;
|
|
||||||
};
|
|
||||||
|
|
||||||
uint64_t GetKeyCount(const SlotRanges& slots);
|
uint64_t GetKeyCount(const SlotRanges& slots);
|
||||||
|
|
||||||
} // namespace dfly::cluster
|
} // namespace dfly::cluster
|
||||||
|
|
99
src/server/cluster_support.cc
Normal file
99
src/server/cluster_support.cc
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
// Copyright 2024, DragonflyDB authors. All rights reserved.
|
||||||
|
// See LICENSE for licensing terms.
|
||||||
|
//
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "redis/crc16.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "base/flags.h"
|
||||||
|
#include "base/logging.h"
|
||||||
|
#include "cluster_support.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
ABSL_FLAG(string, cluster_mode, "",
|
||||||
|
"Cluster mode supported. Possible values are "
|
||||||
|
"'emulated', 'yes' or ''");
|
||||||
|
|
||||||
|
namespace dfly {
|
||||||
|
|
||||||
|
void UniqueSlotChecker::Add(std::string_view key) {
|
||||||
|
if (!IsClusterEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Add(KeySlot(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
void UniqueSlotChecker::Add(SlotId slot_id) {
|
||||||
|
if (!IsClusterEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!slot_id_.has_value()) {
|
||||||
|
slot_id_ = slot_id;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*slot_id_ != slot_id) {
|
||||||
|
slot_id_ = kInvalidSlotId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
optional<SlotId> UniqueSlotChecker::GetUniqueSlotId() const {
|
||||||
|
if (slot_id_.has_value() && *slot_id_ == kInvalidSlotId) {
|
||||||
|
return nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
return slot_id_;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
enum class ClusterMode {
|
||||||
|
kUninitialized,
|
||||||
|
kNoCluster,
|
||||||
|
kEmulatedCluster,
|
||||||
|
kRealCluster,
|
||||||
|
};
|
||||||
|
|
||||||
|
ClusterMode cluster_mode = ClusterMode::kUninitialized;
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void InitializeCluster() {
|
||||||
|
string cluster_mode_str = absl::GetFlag(FLAGS_cluster_mode);
|
||||||
|
|
||||||
|
if (cluster_mode_str == "emulated") {
|
||||||
|
cluster_mode = ClusterMode::kEmulatedCluster;
|
||||||
|
} else if (cluster_mode_str == "yes") {
|
||||||
|
cluster_mode = ClusterMode::kRealCluster;
|
||||||
|
} else if (cluster_mode_str.empty()) {
|
||||||
|
cluster_mode = ClusterMode::kNoCluster;
|
||||||
|
} else {
|
||||||
|
LOG(ERROR) << "Invalid value for flag --cluster_mode. Exiting...";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsClusterEnabled() {
|
||||||
|
return cluster_mode == ClusterMode::kRealCluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsClusterEmulated() {
|
||||||
|
return cluster_mode == ClusterMode::kEmulatedCluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
SlotId KeySlot(std::string_view key) {
|
||||||
|
string_view tag = LockTagOptions::instance().Tag(key);
|
||||||
|
return crc16(tag.data(), tag.length()) & kMaxSlotNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsClusterEnabledOrEmulated() {
|
||||||
|
return IsClusterEnabled() || IsClusterEmulated();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsClusterShardedByTag() {
|
||||||
|
return IsClusterEnabledOrEmulated() || LockTagOptions::instance().enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dfly
|
41
src/server/cluster_support.h
Normal file
41
src/server/cluster_support.h
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// Copyright 2024, DragonflyDB authors. All rights reserved.
|
||||||
|
// See LICENSE for licensing terms.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <optional>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
namespace dfly {
|
||||||
|
|
||||||
|
using SlotId = std::uint16_t;
|
||||||
|
|
||||||
|
constexpr SlotId kMaxSlotNum = 0x3FFF;
|
||||||
|
constexpr SlotId kInvalidSlotId = kMaxSlotNum + 1;
|
||||||
|
|
||||||
|
// A simple utility class that "aggregates" SlotId-s and can tell whether all inputs were the same.
|
||||||
|
// Only works when cluster is enabled.
|
||||||
|
class UniqueSlotChecker {
|
||||||
|
public:
|
||||||
|
void Add(std::string_view key);
|
||||||
|
void Add(SlotId slot_id);
|
||||||
|
|
||||||
|
std::optional<SlotId> GetUniqueSlotId() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::optional<SlotId> slot_id_;
|
||||||
|
};
|
||||||
|
|
||||||
|
SlotId KeySlot(std::string_view key);
|
||||||
|
|
||||||
|
void InitializeCluster();
|
||||||
|
bool IsClusterEnabled();
|
||||||
|
bool IsClusterEmulated();
|
||||||
|
bool IsClusterEnabledOrEmulated();
|
||||||
|
bool IsClusterShardedByTag();
|
||||||
|
|
||||||
|
} // namespace dfly
|
|
@ -32,6 +32,7 @@ constexpr int64_t kMaxExpireDeadlineMs = kMaxExpireDeadlineSec * 1000;
|
||||||
using LSN = uint64_t;
|
using LSN = uint64_t;
|
||||||
using TxId = uint64_t;
|
using TxId = uint64_t;
|
||||||
using TxClock = uint64_t;
|
using TxClock = uint64_t;
|
||||||
|
using SlotId = std::uint16_t;
|
||||||
|
|
||||||
using facade::ArgS;
|
using facade::ArgS;
|
||||||
using facade::CmdArgList;
|
using facade::CmdArgList;
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#include "base/logging.h"
|
#include "base/logging.h"
|
||||||
#include "search/doc_index.h"
|
#include "search/doc_index.h"
|
||||||
#include "server/channel_store.h"
|
#include "server/channel_store.h"
|
||||||
#include "server/cluster/cluster_defs.h"
|
|
||||||
#include "server/engine_shard_set.h"
|
#include "server/engine_shard_set.h"
|
||||||
#include "server/error.h"
|
#include "server/error.h"
|
||||||
#include "server/journal/journal.h"
|
#include "server/journal/journal.h"
|
||||||
|
@ -63,8 +62,8 @@ void AccountObjectMemory(string_view key, unsigned type, int64_t size, DbTable*
|
||||||
|
|
||||||
stats.AddTypeMemoryUsage(type, size);
|
stats.AddTypeMemoryUsage(type, size);
|
||||||
|
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
db->slots_stats[cluster::KeySlot(key)].memory_bytes += size;
|
db->slots_stats[KeySlot(key)].memory_bytes += size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +311,7 @@ auto DbSlice::GetStats() const -> Stats {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
SlotStats DbSlice::GetSlotStats(cluster::SlotId sid) const {
|
SlotStats DbSlice::GetSlotStats(SlotId sid) const {
|
||||||
CHECK(db_arr_[0]);
|
CHECK(db_arr_[0]);
|
||||||
return db_arr_[0]->slots_stats[sid];
|
return db_arr_[0]->slots_stats[sid];
|
||||||
}
|
}
|
||||||
|
@ -487,8 +486,8 @@ OpResult<DbSlice::PrimeItAndExp> DbSlice::FindInternal(const Context& cntx, std:
|
||||||
break;
|
break;
|
||||||
case UpdateStatsMode::kReadStats:
|
case UpdateStatsMode::kReadStats:
|
||||||
events_.hits++;
|
events_.hits++;
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
db.slots_stats[cluster::KeySlot(key)].total_reads++;
|
db.slots_stats[KeySlot(key)].total_reads++;
|
||||||
}
|
}
|
||||||
if (res.it->second.IsExternal()) {
|
if (res.it->second.IsExternal()) {
|
||||||
if (res.it->second.IsCool())
|
if (res.it->second.IsCool())
|
||||||
|
@ -651,8 +650,8 @@ OpResult<DbSlice::AddOrFindResult> DbSlice::AddOrFindInternal(const Context& cnt
|
||||||
events_.stash_unloaded = db.prime.stash_unloaded();
|
events_.stash_unloaded = db.prime.stash_unloaded();
|
||||||
events_.evicted_keys += evp.evicted();
|
events_.evicted_keys += evp.evicted();
|
||||||
events_.garbage_checked += evp.checked();
|
events_.garbage_checked += evp.checked();
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
cluster::SlotId sid = cluster::KeySlot(key);
|
SlotId sid = KeySlot(key);
|
||||||
db.slots_stats[sid].key_count += 1;
|
db.slots_stats[sid].key_count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -696,7 +695,7 @@ void DbSlice::FlushSlotsFb(const cluster::SlotSet& slot_ids) {
|
||||||
std::string tmp;
|
std::string tmp;
|
||||||
auto del_entry_cb = [&](PrimeTable::iterator it) {
|
auto del_entry_cb = [&](PrimeTable::iterator it) {
|
||||||
std::string_view key = it->first.GetSlice(&tmp);
|
std::string_view key = it->first.GetSlice(&tmp);
|
||||||
cluster::SlotId sid = cluster::KeySlot(key);
|
SlotId sid = KeySlot(key);
|
||||||
if (slot_ids.Contains(sid) && it.GetVersion() < next_version) {
|
if (slot_ids.Contains(sid) && it.GetVersion() < next_version) {
|
||||||
PerformDeletion(Iterator::FromPrime(it), db_arr_[0].get());
|
PerformDeletion(Iterator::FromPrime(it), db_arr_[0].get());
|
||||||
}
|
}
|
||||||
|
@ -1073,8 +1072,8 @@ void DbSlice::PostUpdate(DbIndex db_ind, Iterator it, std::string_view key, size
|
||||||
|
|
||||||
++events_.update;
|
++events_.update;
|
||||||
|
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
db.slots_stats[cluster::KeySlot(key)].total_writes += 1;
|
db.slots_stats[KeySlot(key)].total_writes += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SendInvalidationTrackingMessage(key);
|
SendInvalidationTrackingMessage(key);
|
||||||
|
@ -1377,7 +1376,7 @@ void DbSlice::InvalidateDbWatches(DbIndex db_indx) {
|
||||||
|
|
||||||
void DbSlice::InvalidateSlotWatches(const cluster::SlotSet& slot_ids) {
|
void DbSlice::InvalidateSlotWatches(const cluster::SlotSet& slot_ids) {
|
||||||
for (const auto& [key, conn_list] : db_arr_[0]->watched_keys) {
|
for (const auto& [key, conn_list] : db_arr_[0]->watched_keys) {
|
||||||
cluster::SlotId sid = cluster::KeySlot(key);
|
SlotId sid = KeySlot(key);
|
||||||
if (!slot_ids.Contains(sid)) {
|
if (!slot_ids.Contains(sid)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1500,8 +1499,8 @@ void DbSlice::PerformDeletion(Iterator del_it, ExpIterator exp_it, DbTable* tabl
|
||||||
--stats.listpack_blob_cnt;
|
--stats.listpack_blob_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
cluster::SlotId sid = cluster::KeySlot(del_it.key());
|
SlotId sid = KeySlot(del_it.key());
|
||||||
table->slots_stats[sid].key_count -= 1;
|
table->slots_stats[sid].key_count -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -239,7 +239,7 @@ class DbSlice {
|
||||||
Stats GetStats() const;
|
Stats GetStats() const;
|
||||||
|
|
||||||
// Returns slot statistics for db 0.
|
// Returns slot statistics for db 0.
|
||||||
SlotStats GetSlotStats(cluster::SlotId sid) const;
|
SlotStats GetSlotStats(SlotId sid) const;
|
||||||
|
|
||||||
void UpdateExpireBase(uint64_t now, unsigned generation) {
|
void UpdateExpireBase(uint64_t now, unsigned generation) {
|
||||||
expire_base_[generation & 1] = now;
|
expire_base_[generation & 1] = now;
|
||||||
|
|
|
@ -726,7 +726,7 @@ optional<DebugCmd::PopulateOptions> DebugCmd::ParsePopulateArgs(CmdArgList args,
|
||||||
if (!absl::SimpleAtoi(slot_str, &slot_id)) {
|
if (!absl::SimpleAtoi(slot_str, &slot_id)) {
|
||||||
return facade::OpStatus::INVALID_INT;
|
return facade::OpStatus::INVALID_INT;
|
||||||
}
|
}
|
||||||
if (slot_id > cluster::kMaxSlotNum) {
|
if (slot_id > kMaxSlotNum) {
|
||||||
return facade::OpStatus::INVALID_VALUE;
|
return facade::OpStatus::INVALID_VALUE;
|
||||||
}
|
}
|
||||||
return slot_id;
|
return slot_id;
|
||||||
|
@ -742,8 +742,8 @@ optional<DebugCmd::PopulateOptions> DebugCmd::ParsePopulateArgs(CmdArgList args,
|
||||||
builder->SendError(end.status());
|
builder->SendError(end.status());
|
||||||
return nullopt;
|
return nullopt;
|
||||||
}
|
}
|
||||||
options.slot_range = cluster::SlotRange{.start = static_cast<cluster::SlotId>(start.value()),
|
options.slot_range = cluster::SlotRange{.start = static_cast<SlotId>(start.value()),
|
||||||
.end = static_cast<cluster::SlotId>(end.value())};
|
.end = static_cast<SlotId>(end.value())};
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
builder->SendError(kSyntaxErr);
|
builder->SendError(kSyntaxErr);
|
||||||
|
@ -815,7 +815,7 @@ void DebugCmd::PopulateRangeFiber(uint64_t from, uint64_t num_of_keys,
|
||||||
// <key_prefix>:<from+total_count+num_of_keys-1> and continue until num_of_keys are added.
|
// <key_prefix>:<from+total_count+num_of_keys-1> and continue until num_of_keys are added.
|
||||||
|
|
||||||
// Add keys only in slot range.
|
// Add keys only in slot range.
|
||||||
cluster::SlotId sid = cluster::KeySlot(key);
|
SlotId sid = KeySlot(key);
|
||||||
if (sid < options.slot_range->start || sid > options.slot_range->end) {
|
if (sid < options.slot_range->start || sid > options.slot_range->end) {
|
||||||
++index;
|
++index;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -260,7 +260,7 @@ __thread EngineShard* EngineShard::shard_ = nullptr;
|
||||||
uint64_t TEST_current_time_ms = 0;
|
uint64_t TEST_current_time_ms = 0;
|
||||||
|
|
||||||
ShardId Shard(string_view v, ShardId shard_num) {
|
ShardId Shard(string_view v, ShardId shard_num) {
|
||||||
if (cluster::IsClusterShardedByTag()) {
|
if (IsClusterShardedByTag()) {
|
||||||
v = LockTagOptions::instance().Tag(v);
|
v = LockTagOptions::instance().Tag(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ extern "C" {
|
||||||
#include "redis/rdb.h"
|
#include "redis/rdb.h"
|
||||||
#include "server/acl/acl_commands_def.h"
|
#include "server/acl/acl_commands_def.h"
|
||||||
#include "server/blocking_controller.h"
|
#include "server/blocking_controller.h"
|
||||||
#include "server/cluster/cluster_defs.h"
|
|
||||||
#include "server/command_registry.h"
|
#include "server/command_registry.h"
|
||||||
#include "server/conn_context.h"
|
#include "server/conn_context.h"
|
||||||
#include "server/container_utils.h"
|
#include "server/container_utils.h"
|
||||||
|
@ -1652,7 +1651,7 @@ void GenericFamily::Select(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
if (!absl::SimpleAtoi(key, &index)) {
|
if (!absl::SimpleAtoi(key, &index)) {
|
||||||
return builder->SendError(kInvalidDbIndErr);
|
return builder->SendError(kInvalidDbIndErr);
|
||||||
}
|
}
|
||||||
if (cluster::IsClusterEnabled() && index != 0) {
|
if (IsClusterEnabled() && index != 0) {
|
||||||
return builder->SendError("SELECT is not allowed in cluster mode");
|
return builder->SendError("SELECT is not allowed in cluster mode");
|
||||||
}
|
}
|
||||||
if (index < 0 || index >= absl::GetFlag(FLAGS_dbnum)) {
|
if (index < 0 || index >= absl::GetFlag(FLAGS_dbnum)) {
|
||||||
|
|
|
@ -84,7 +84,7 @@ LSN Journal::GetLsn() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Journal::RecordEntry(TxId txid, Op opcode, DbIndex dbid, unsigned shard_cnt,
|
void Journal::RecordEntry(TxId txid, Op opcode, DbIndex dbid, unsigned shard_cnt,
|
||||||
std::optional<cluster::SlotId> slot, Entry::Payload payload) {
|
std::optional<SlotId> slot, Entry::Payload payload) {
|
||||||
journal_slice.AddLogRecord(Entry{txid, opcode, dbid, shard_cnt, slot, std::move(payload)});
|
journal_slice.AddLogRecord(Entry{txid, opcode, dbid, shard_cnt, slot, std::move(payload)});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ class Journal {
|
||||||
LSN GetLsn() const;
|
LSN GetLsn() const;
|
||||||
|
|
||||||
void RecordEntry(TxId txid, Op opcode, DbIndex dbid, unsigned shard_cnt,
|
void RecordEntry(TxId txid, Op opcode, DbIndex dbid, unsigned shard_cnt,
|
||||||
std::optional<cluster::SlotId> slot, Entry::Payload payload);
|
std::optional<SlotId> slot, Entry::Payload payload);
|
||||||
|
|
||||||
void SetFlushMode(bool allow_flush);
|
void SetFlushMode(bool allow_flush);
|
||||||
|
|
||||||
|
|
|
@ -278,10 +278,10 @@ bool RestoreStreamer::ShouldWrite(const journal::JournalItem& item) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RestoreStreamer::ShouldWrite(std::string_view key) const {
|
bool RestoreStreamer::ShouldWrite(std::string_view key) const {
|
||||||
return ShouldWrite(cluster::KeySlot(key));
|
return ShouldWrite(KeySlot(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RestoreStreamer::ShouldWrite(cluster::SlotId slot_id) const {
|
bool RestoreStreamer::ShouldWrite(SlotId slot_id) const {
|
||||||
return my_slots_.Contains(slot_id);
|
return my_slots_.Contains(slot_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ class RestoreStreamer : public JournalStreamer {
|
||||||
void OnDbChange(DbIndex db_index, const DbSlice::ChangeReq& req);
|
void OnDbChange(DbIndex db_index, const DbSlice::ChangeReq& req);
|
||||||
bool ShouldWrite(const journal::JournalItem& item) const override;
|
bool ShouldWrite(const journal::JournalItem& item) const override;
|
||||||
bool ShouldWrite(std::string_view key) const;
|
bool ShouldWrite(std::string_view key) const;
|
||||||
bool ShouldWrite(cluster::SlotId slot_id) const;
|
bool ShouldWrite(SlotId slot_id) const;
|
||||||
|
|
||||||
// Returns whether anything was written
|
// Returns whether anything was written
|
||||||
void WriteBucket(PrimeTable::bucket_iterator it);
|
void WriteBucket(PrimeTable::bucket_iterator it);
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "server/journal/types.h"
|
#include "server/journal/types.h"
|
||||||
|
|
||||||
#include "server/cluster/cluster_defs.h"
|
|
||||||
|
|
||||||
namespace dfly::journal {
|
namespace dfly::journal {
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
|
||||||
#include "server/cluster/cluster_defs.h"
|
|
||||||
#include "server/common.h"
|
#include "server/common.h"
|
||||||
#include "server/table.h"
|
#include "server/table.h"
|
||||||
|
|
||||||
|
@ -30,7 +29,7 @@ struct EntryBase {
|
||||||
DbIndex dbid;
|
DbIndex dbid;
|
||||||
uint32_t shard_cnt; // This field is no longer used by the replica, but we continue to serialize
|
uint32_t shard_cnt; // This field is no longer used by the replica, but we continue to serialize
|
||||||
// and deserialize it to maintain backward compatibility.
|
// and deserialize it to maintain backward compatibility.
|
||||||
std::optional<cluster::SlotId> slot;
|
std::optional<SlotId> slot;
|
||||||
LSN lsn{0};
|
LSN lsn{0};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,12 +51,12 @@ struct Entry : public EntryBase {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Entry(TxId txid, Op opcode, DbIndex dbid, uint32_t shard_cnt,
|
Entry(TxId txid, Op opcode, DbIndex dbid, uint32_t shard_cnt, std::optional<SlotId> slot_id,
|
||||||
std::optional<cluster::SlotId> slot_id, Payload pl)
|
Payload pl)
|
||||||
: EntryBase{txid, opcode, dbid, shard_cnt, slot_id}, payload{pl} {
|
: EntryBase{txid, opcode, dbid, shard_cnt, slot_id}, payload{pl} {
|
||||||
}
|
}
|
||||||
|
|
||||||
Entry(journal::Op opcode, DbIndex dbid, std::optional<cluster::SlotId> slot_id)
|
Entry(journal::Op opcode, DbIndex dbid, std::optional<SlotId> slot_id)
|
||||||
: EntryBase{0, opcode, dbid, 0, slot_id, 0} {
|
: EntryBase{0, opcode, dbid, 0, slot_id, 0} {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +64,7 @@ struct Entry : public EntryBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
Entry(TxId txid, journal::Op opcode, DbIndex dbid, uint32_t shard_cnt,
|
Entry(TxId txid, journal::Op opcode, DbIndex dbid, uint32_t shard_cnt,
|
||||||
std::optional<cluster::SlotId> slot_id)
|
std::optional<SlotId> slot_id)
|
||||||
: EntryBase{txid, opcode, dbid, shard_cnt, slot_id, 0} {
|
: EntryBase{txid, opcode, dbid, shard_cnt, slot_id, 0} {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +92,7 @@ struct JournalItem {
|
||||||
Op opcode;
|
Op opcode;
|
||||||
std::string data;
|
std::string data;
|
||||||
std::string_view cmd;
|
std::string_view cmd;
|
||||||
std::optional<cluster::SlotId> slot;
|
std::optional<SlotId> slot;
|
||||||
};
|
};
|
||||||
|
|
||||||
using ChangeCallback = std::function<void(const JournalItem&, bool await)>;
|
using ChangeCallback = std::function<void(const JournalItem&, bool await)>;
|
||||||
|
|
|
@ -39,7 +39,6 @@ extern "C" {
|
||||||
#include "server/bloom_family.h"
|
#include "server/bloom_family.h"
|
||||||
#include "server/channel_store.h"
|
#include "server/channel_store.h"
|
||||||
#include "server/cluster/cluster_family.h"
|
#include "server/cluster/cluster_family.h"
|
||||||
#include "server/cluster/cluster_utility.h"
|
|
||||||
#include "server/conn_context.h"
|
#include "server/conn_context.h"
|
||||||
#include "server/error.h"
|
#include "server/error.h"
|
||||||
#include "server/generic_family.h"
|
#include "server/generic_family.h"
|
||||||
|
@ -573,15 +572,13 @@ void ClusterHtmlPage(const http::QueryArgs& args, HttpContext* send,
|
||||||
|
|
||||||
auto print_kb = [&](string_view k, bool v) { print_kv(k, v ? "True" : "False"); };
|
auto print_kb = [&](string_view k, bool v) { print_kv(k, v ? "True" : "False"); };
|
||||||
|
|
||||||
print_kv("Mode", cluster::IsClusterEmulated() ? "Emulated"
|
print_kv("Mode", IsClusterEmulated() ? "Emulated" : IsClusterEnabled() ? "Enabled" : "Disabled");
|
||||||
: cluster::IsClusterEnabled() ? "Enabled"
|
|
||||||
: "Disabled");
|
|
||||||
|
|
||||||
if (cluster::IsClusterEnabledOrEmulated()) {
|
if (IsClusterEnabledOrEmulated()) {
|
||||||
print_kb("Lock on hashtags", LockTagOptions::instance().enabled);
|
print_kb("Lock on hashtags", LockTagOptions::instance().enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
if (cluster::ClusterFamily::cluster_config() == nullptr) {
|
if (cluster::ClusterFamily::cluster_config() == nullptr) {
|
||||||
resp.body() += "<h2>Not yet configured.</h2>\n";
|
resp.body() += "<h2>Not yet configured.</h2>\n";
|
||||||
} else {
|
} else {
|
||||||
|
@ -932,11 +929,11 @@ optional<ErrorReply> Service::CheckKeysOwnership(const CommandId* cid, CmdArgLis
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& key_index = *key_index_res;
|
const auto& key_index = *key_index_res;
|
||||||
optional<cluster::SlotId> keys_slot;
|
optional<SlotId> keys_slot;
|
||||||
bool cross_slot = false;
|
bool cross_slot = false;
|
||||||
// Iterate keys and check to which slot they belong.
|
// Iterate keys and check to which slot they belong.
|
||||||
for (string_view key : key_index.Range(args)) {
|
for (string_view key : key_index.Range(args)) {
|
||||||
if (cluster::SlotId slot = cluster::KeySlot(key); keys_slot && slot != *keys_slot) {
|
if (SlotId slot = KeySlot(key); keys_slot && slot != *keys_slot) {
|
||||||
cross_slot = true; // keys belong to different slots
|
cross_slot = true; // keys belong to different slots
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1104,7 +1101,7 @@ std::optional<ErrorReply> Service::VerifyCommandState(const CommandId* cid, CmdA
|
||||||
return ErrorReply{absl::StrCat("'", cmd_name, "' inside MULTI is not allowed")};
|
return ErrorReply{absl::StrCat("'", cmd_name, "' inside MULTI is not allowed")};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
if (auto err = CheckKeysOwnership(cid, tail_args, dfly_cntx); err)
|
if (auto err = CheckKeysOwnership(cid, tail_args, dfly_cntx); err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -1935,7 +1932,7 @@ void Service::EvalInternal(CmdArgList args, const EvalArgs& eval_args, Interpret
|
||||||
|
|
||||||
optional<ShardId> sid;
|
optional<ShardId> sid;
|
||||||
|
|
||||||
cluster::UniqueSlotChecker slot_checker;
|
UniqueSlotChecker slot_checker;
|
||||||
for (size_t i = 0; i < eval_args.keys.size(); ++i) {
|
for (size_t i = 0; i < eval_args.keys.size(); ++i) {
|
||||||
string_view key = ArgS(eval_args.keys, i);
|
string_view key = ArgS(eval_args.keys, i);
|
||||||
slot_checker.Add(key);
|
slot_checker.Add(key);
|
||||||
|
@ -2255,7 +2252,7 @@ void Service::Exec(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Service::Publish(CmdArgList args, const CommandContext& cmd_cntx) {
|
void Service::Publish(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
return cmd_cntx.rb->SendError("PUBLISH is not supported in cluster mode yet");
|
return cmd_cntx.rb->SendError("PUBLISH is not supported in cluster mode yet");
|
||||||
}
|
}
|
||||||
string_view channel = ArgS(args, 0);
|
string_view channel = ArgS(args, 0);
|
||||||
|
@ -2266,7 +2263,7 @@ void Service::Publish(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Service::Subscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
void Service::Subscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
return cmd_cntx.rb->SendError("SUBSCRIBE is not supported in cluster mode yet");
|
return cmd_cntx.rb->SendError("SUBSCRIBE is not supported in cluster mode yet");
|
||||||
}
|
}
|
||||||
cmd_cntx.conn_cntx->ChangeSubscription(true /*add*/, true /* reply*/, std::move(args),
|
cmd_cntx.conn_cntx->ChangeSubscription(true /*add*/, true /* reply*/, std::move(args),
|
||||||
|
@ -2275,7 +2272,7 @@ void Service::Subscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
|
|
||||||
void Service::Unsubscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
void Service::Unsubscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
return cmd_cntx.rb->SendError("UNSUBSCRIBE is not supported in cluster mode yet");
|
return cmd_cntx.rb->SendError("UNSUBSCRIBE is not supported in cluster mode yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2289,7 +2286,7 @@ void Service::Unsubscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
void Service::PSubscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
void Service::PSubscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
||||||
|
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
return rb->SendError("PSUBSCRIBE is not supported in cluster mode yet");
|
return rb->SendError("PSUBSCRIBE is not supported in cluster mode yet");
|
||||||
}
|
}
|
||||||
cmd_cntx.conn_cntx->ChangePSubscription(true, true, args, rb);
|
cmd_cntx.conn_cntx->ChangePSubscription(true, true, args, rb);
|
||||||
|
@ -2298,7 +2295,7 @@ void Service::PSubscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
void Service::PUnsubscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
void Service::PUnsubscribe(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
||||||
|
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
return rb->SendError("PUNSUBSCRIBE is not supported in cluster mode yet");
|
return rb->SendError("PUNSUBSCRIBE is not supported in cluster mode yet");
|
||||||
}
|
}
|
||||||
if (args.size() == 0) {
|
if (args.size() == 0) {
|
||||||
|
@ -2353,7 +2350,7 @@ void Service::Monitor(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
void Service::Pubsub(CmdArgList args, const CommandContext& cmd_cntx) {
|
void Service::Pubsub(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
||||||
|
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
return rb->SendError("PUBSUB is not supported in cluster mode yet");
|
return rb->SendError("PUBSUB is not supported in cluster mode yet");
|
||||||
}
|
}
|
||||||
if (args.size() < 1) {
|
if (args.size() < 1) {
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include "base/logging.h"
|
#include "base/logging.h"
|
||||||
#include "core/overloaded.h"
|
#include "core/overloaded.h"
|
||||||
#include "facade/dragonfly_connection.h"
|
#include "facade/dragonfly_connection.h"
|
||||||
#include "server/cluster/cluster_utility.h"
|
|
||||||
#include "server/command_registry.h"
|
#include "server/command_registry.h"
|
||||||
#include "server/conn_context.h"
|
#include "server/conn_context.h"
|
||||||
#include "server/engine_shard_set.h"
|
#include "server/engine_shard_set.h"
|
||||||
|
@ -79,7 +78,7 @@ MultiCommandSquasher::MultiCommandSquasher(absl::Span<StoredCmd> cmds, Connectio
|
||||||
}
|
}
|
||||||
|
|
||||||
MultiCommandSquasher::ShardExecInfo& MultiCommandSquasher::PrepareShardInfo(
|
MultiCommandSquasher::ShardExecInfo& MultiCommandSquasher::PrepareShardInfo(
|
||||||
ShardId sid, optional<cluster::SlotId> slot_id) {
|
ShardId sid, optional<SlotId> slot_id) {
|
||||||
if (sharded_.empty())
|
if (sharded_.empty())
|
||||||
sharded_.resize(shard_set->size());
|
sharded_.resize(shard_set->size());
|
||||||
|
|
||||||
|
@ -122,7 +121,7 @@ MultiCommandSquasher::SquashResult MultiCommandSquasher::TrySquash(StoredCmd* cm
|
||||||
return SquashResult::NOT_SQUASHED;
|
return SquashResult::NOT_SQUASHED;
|
||||||
|
|
||||||
// Check if all commands belong to one shard
|
// Check if all commands belong to one shard
|
||||||
cluster::UniqueSlotChecker slot_checker;
|
UniqueSlotChecker slot_checker;
|
||||||
ShardId last_sid = kInvalidSid;
|
ShardId last_sid = kInvalidSid;
|
||||||
|
|
||||||
for (string_view key : keys->Range(args)) {
|
for (string_view key : keys->Range(args)) {
|
||||||
|
|
|
@ -52,7 +52,7 @@ class MultiCommandSquasher {
|
||||||
bool verify_commands, bool error_abort);
|
bool verify_commands, bool error_abort);
|
||||||
|
|
||||||
// Lazy initialize shard info.
|
// Lazy initialize shard info.
|
||||||
ShardExecInfo& PrepareShardInfo(ShardId sid, std::optional<cluster::SlotId> slot_id);
|
ShardExecInfo& PrepareShardInfo(ShardId sid, std::optional<SlotId> slot_id);
|
||||||
|
|
||||||
// Retrun squash flags
|
// Retrun squash flags
|
||||||
SquashResult TrySquash(StoredCmd* cmd);
|
SquashResult TrySquash(StoredCmd* cmd);
|
||||||
|
|
|
@ -34,7 +34,6 @@ extern "C" {
|
||||||
#include "core/sorted_map.h"
|
#include "core/sorted_map.h"
|
||||||
#include "core/string_map.h"
|
#include "core/string_map.h"
|
||||||
#include "core/string_set.h"
|
#include "core/string_set.h"
|
||||||
#include "server/cluster/cluster_defs.h"
|
|
||||||
#include "server/cluster/cluster_family.h"
|
#include "server/cluster/cluster_family.h"
|
||||||
#include "server/container_utils.h"
|
#include "server/container_utils.h"
|
||||||
#include "server/engine_shard_set.h"
|
#include "server/engine_shard_set.h"
|
||||||
|
@ -2464,7 +2463,7 @@ error_code RdbLoader::HandleAux() {
|
||||||
if (absl::SimpleAtoi(auxval, &usedmem)) {
|
if (absl::SimpleAtoi(auxval, &usedmem)) {
|
||||||
VLOG(1) << "RDB memory usage when created " << strings::HumanReadableNumBytes(usedmem);
|
VLOG(1) << "RDB memory usage when created " << strings::HumanReadableNumBytes(usedmem);
|
||||||
if (usedmem > ssize_t(max_memory_limit)) {
|
if (usedmem > ssize_t(max_memory_limit)) {
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
LOG(INFO) << "Attempting to load a snapshot of size " << usedmem
|
LOG(INFO) << "Attempting to load a snapshot of size " << usedmem
|
||||||
<< ", despite memory limit of " << max_memory_limit;
|
<< ", despite memory limit of " << max_memory_limit;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2709,7 +2708,7 @@ error_code RdbLoader::LoadKeyValPair(int type, ObjSettings* settings) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RdbLoader::ShouldDiscardKey(std::string_view key, ObjSettings* settings) const {
|
bool RdbLoader::ShouldDiscardKey(std::string_view key, ObjSettings* settings) const {
|
||||||
if (!load_unowned_slots_ && cluster::IsClusterEnabled()) {
|
if (!load_unowned_slots_ && IsClusterEnabled()) {
|
||||||
const cluster::ClusterConfig* cluster_config = cluster::ClusterFamily::cluster_config();
|
const cluster::ClusterConfig* cluster_config = cluster::ClusterFamily::cluster_config();
|
||||||
if (cluster_config != nullptr && !cluster_config->IsMySlot(key)) {
|
if (cluster_config != nullptr && !cluster_config->IsMySlot(key)) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -583,7 +583,7 @@ std::string_view GetOSString() {
|
||||||
}
|
}
|
||||||
|
|
||||||
string_view GetRedisMode() {
|
string_view GetRedisMode() {
|
||||||
return cluster::IsClusterEnabledOrEmulated() ? "cluster"sv : "standalone"sv;
|
return IsClusterEnabledOrEmulated() ? "cluster"sv : "standalone"sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ReplicaOfArgs {
|
struct ReplicaOfArgs {
|
||||||
|
@ -622,7 +622,7 @@ optional<ReplicaOfArgs> ReplicaOfArgs::FromCmdArgs(CmdArgList args, SinkReplyBui
|
||||||
return nullopt;
|
return nullopt;
|
||||||
}
|
}
|
||||||
if (parser.HasNext()) {
|
if (parser.HasNext()) {
|
||||||
auto [slot_start, slot_end] = parser.Next<cluster::SlotId, cluster::SlotId>();
|
auto [slot_start, slot_end] = parser.Next<SlotId, SlotId>();
|
||||||
replicaof_args.slot_range = cluster::SlotRange{slot_start, slot_end};
|
replicaof_args.slot_range = cluster::SlotRange{slot_start, slot_end};
|
||||||
if (auto err = parser.Error(); err || !replicaof_args.slot_range->IsValid()) {
|
if (auto err = parser.Error(); err || !replicaof_args.slot_range->IsValid()) {
|
||||||
builder->SendError("Invalid slot range");
|
builder->SendError("Invalid slot range");
|
||||||
|
@ -2636,7 +2636,7 @@ void ServerFamily::Info(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (should_enter("CLUSTER")) {
|
if (should_enter("CLUSTER")) {
|
||||||
append("cluster_enabled", cluster::IsClusterEnabledOrEmulated());
|
append("cluster_enabled", IsClusterEnabledOrEmulated());
|
||||||
}
|
}
|
||||||
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
||||||
rb->SendVerbatimString(info);
|
rb->SendVerbatimString(info);
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
#include "base/flags.h"
|
#include "base/flags.h"
|
||||||
#include "base/logging.h"
|
#include "base/logging.h"
|
||||||
#include "server/cluster/cluster_defs.h"
|
#include "server/cluster_support.h"
|
||||||
#include "server/server_state.h"
|
#include "server/server_state.h"
|
||||||
|
|
||||||
ABSL_FLAG(bool, enable_top_keys_tracking, false,
|
ABSL_FLAG(bool, enable_top_keys_tracking, false,
|
||||||
|
@ -86,8 +86,8 @@ DbTable::DbTable(PMR_NS::memory_resource* mr, DbIndex db_index)
|
||||||
mcflag(0, detail::ExpireTablePolicy{}, mr),
|
mcflag(0, detail::ExpireTablePolicy{}, mr),
|
||||||
top_keys({.enabled = absl::GetFlag(FLAGS_enable_top_keys_tracking)}),
|
top_keys({.enabled = absl::GetFlag(FLAGS_enable_top_keys_tracking)}),
|
||||||
index(db_index) {
|
index(db_index) {
|
||||||
if (cluster::IsClusterEnabled()) {
|
if (IsClusterEnabled()) {
|
||||||
slots_stats.resize(cluster::kMaxSlotNum + 1);
|
slots_stats.resize(kMaxSlotNum + 1);
|
||||||
}
|
}
|
||||||
thread_index = ServerState::tlocal()->thread_index();
|
thread_index = ServerState::tlocal()->thread_index();
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,8 +184,7 @@ Transaction::Transaction(const CommandId* cid) : cid_{cid} {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Transaction::Transaction(const Transaction* parent, ShardId shard_id,
|
Transaction::Transaction(const Transaction* parent, ShardId shard_id, std::optional<SlotId> slot_id)
|
||||||
std::optional<cluster::SlotId> slot_id)
|
|
||||||
: multi_{make_unique<MultiData>()},
|
: multi_{make_unique<MultiData>()},
|
||||||
txid_{parent->txid()},
|
txid_{parent->txid()},
|
||||||
unique_shard_cnt_{1},
|
unique_shard_cnt_{1},
|
||||||
|
@ -1017,7 +1016,7 @@ ShardId Transaction::GetUniqueShard() const {
|
||||||
return unique_shard_id_;
|
return unique_shard_id_;
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<cluster::SlotId> Transaction::GetUniqueSlotId() const {
|
optional<SlotId> Transaction::GetUniqueSlotId() const {
|
||||||
return unique_slot_checker_.GetUniqueSlotId();
|
return unique_slot_checker_.GetUniqueSlotId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#include "core/intent_lock.h"
|
#include "core/intent_lock.h"
|
||||||
#include "core/tx_queue.h"
|
#include "core/tx_queue.h"
|
||||||
#include "facade/op_status.h"
|
#include "facade/op_status.h"
|
||||||
#include "server/cluster/cluster_utility.h"
|
|
||||||
#include "server/common.h"
|
#include "server/common.h"
|
||||||
#include "server/journal/types.h"
|
#include "server/journal/types.h"
|
||||||
#include "server/namespaces.h"
|
#include "server/namespaces.h"
|
||||||
|
@ -184,8 +183,7 @@ class Transaction {
|
||||||
explicit Transaction(const CommandId* cid);
|
explicit Transaction(const CommandId* cid);
|
||||||
|
|
||||||
// Initialize transaction for squashing placed on a specific shard with a given parent tx
|
// Initialize transaction for squashing placed on a specific shard with a given parent tx
|
||||||
explicit Transaction(const Transaction* parent, ShardId shard_id,
|
explicit Transaction(const Transaction* parent, ShardId shard_id, std::optional<SlotId> slot_id);
|
||||||
std::optional<cluster::SlotId> slot_id);
|
|
||||||
|
|
||||||
// Initialize from command (args) on specific db.
|
// Initialize from command (args) on specific db.
|
||||||
OpStatus InitByArgs(Namespace* ns, DbIndex index, CmdArgList args);
|
OpStatus InitByArgs(Namespace* ns, DbIndex index, CmdArgList args);
|
||||||
|
@ -290,7 +288,7 @@ class Transaction {
|
||||||
// This method is meaningless if GetUniqueShardCnt() != 1.
|
// This method is meaningless if GetUniqueShardCnt() != 1.
|
||||||
ShardId GetUniqueShard() const;
|
ShardId GetUniqueShard() const;
|
||||||
|
|
||||||
std::optional<cluster::SlotId> GetUniqueSlotId() const;
|
std::optional<SlotId> GetUniqueSlotId() const;
|
||||||
|
|
||||||
bool IsMulti() const {
|
bool IsMulti() const {
|
||||||
return bool(multi_);
|
return bool(multi_);
|
||||||
|
@ -633,7 +631,7 @@ class Transaction {
|
||||||
|
|
||||||
uint32_t unique_shard_cnt_{0}; // Number of unique shards active
|
uint32_t unique_shard_cnt_{0}; // Number of unique shards active
|
||||||
ShardId unique_shard_id_{kInvalidSid}; // Set if unique_shard_cnt_ = 1
|
ShardId unique_shard_id_{kInvalidSid}; // Set if unique_shard_cnt_ = 1
|
||||||
cluster::UniqueSlotChecker unique_slot_checker_;
|
UniqueSlotChecker unique_slot_checker_;
|
||||||
|
|
||||||
// Barrier for waking blocking transactions that ensures exclusivity of waking operation.
|
// Barrier for waking blocking transactions that ensures exclusivity of waking operation.
|
||||||
BatonBarrier blocking_barrier_{};
|
BatonBarrier blocking_barrier_{};
|
||||||
|
|
|
@ -66,7 +66,7 @@ void RecordExpiry(DbIndex dbid, string_view key) {
|
||||||
auto journal = EngineShard::tlocal()->journal();
|
auto journal = EngineShard::tlocal()->journal();
|
||||||
CHECK(journal);
|
CHECK(journal);
|
||||||
|
|
||||||
journal->RecordEntry(0, journal::Op::EXPIRED, dbid, 1, cluster::KeySlot(key),
|
journal->RecordEntry(0, journal::Op::EXPIRED, dbid, 1, KeySlot(key),
|
||||||
Payload("DEL", ArgSlice{key}));
|
Payload("DEL", ArgSlice{key}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue