Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor setting the node with the same type #2091

Merged
merged 1 commit into from
Oct 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 17 additions & 9 deletions src/admin/admin_executor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3967,25 +3967,30 @@ QueryResult AdminExecutor::ShowCurrentNode(QueryContext *query_context, const Ad
}

QueryResult AdminExecutor::SetRole(QueryContext *query_context, const AdminStatement *admin_statement) {
//TODO: check if current role is same as the target role.
// TODO: check if current role is same as the target role.
Vector<SharedPtr<ColumnDef>> column_defs = {
MakeShared<ColumnDef>(0, MakeShared<DataType>(LogicalType::kInteger), "OK", std::set<ConstraintType>())};

AdminNodeRole admin_server_role = admin_statement->admin_node_role_.value();
Status status;
NodeRole target_node_role = admin_statement->node_role_.value();
QueryResult query_result;
switch (admin_server_role) {
case AdminNodeRole::kAdmin: {
NodeRole current_node_role = InfinityContext::instance().GetServerRole();
if (current_node_role == target_node_role) {
query_result.status_ = Status::InvalidNodeRole(fmt::format("Infinity is already the role of {}", ToString(current_node_role)));
return query_result;
}
Status status;
switch (target_node_role) {
case NodeRole::kAdmin: {
status = InfinityContext::instance().ChangeRole(NodeRole::kAdmin);
LOG_INFO("Start in ADMIN mode");
break;
}
case AdminNodeRole::kStandalone: {
case NodeRole::kStandalone: {
status = InfinityContext::instance().ChangeRole(NodeRole::kStandalone);
LOG_INFO("Start in STANDALONE mode");
break;
}
case AdminNodeRole::kLeader: {
case NodeRole::kLeader: {
String node_name = admin_statement->node_name_.value();
switch (IdentifierValidation(node_name)) {
case IdentifierValidationStatus::kOk:
Expand Down Expand Up @@ -4019,7 +4024,7 @@ QueryResult AdminExecutor::SetRole(QueryContext *query_context, const AdminState
}
break;
}
case AdminNodeRole::kFollower: {
case NodeRole::kFollower: {
String node_name = admin_statement->node_name_.value();
switch (IdentifierValidation(node_name)) {
case IdentifierValidationStatus::kOk:
Expand Down Expand Up @@ -4062,7 +4067,7 @@ QueryResult AdminExecutor::SetRole(QueryContext *query_context, const AdminState
}
break;
}
case AdminNodeRole::kLearner: {
case NodeRole::kLearner: {
String node_name = admin_statement->node_name_.value();
switch (IdentifierValidation(node_name)) {
case IdentifierValidationStatus::kOk:
Expand Down Expand Up @@ -4105,6 +4110,9 @@ QueryResult AdminExecutor::SetRole(QueryContext *query_context, const AdminState
}
break;
}
default: {
UnrecoverableError("Unsupported role");
}
}

if (status.ok()) {
Expand Down
2 changes: 1 addition & 1 deletion src/executor/operator/physical_show.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ import memindex_tracer;
import persistence_manager;
import global_resource_usage;
import infinity_context;
import peer_task;
import cleanup_scanner;
import obj_status;
import admin_statement;

namespace infinity {

Expand Down
18 changes: 16 additions & 2 deletions src/main/cluster_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import infinity_exception;
import peer_server_thrift_types;
import wal_manager;
import wal_entry;
import admin_statement;

namespace infinity {

Expand Down Expand Up @@ -131,7 +132,7 @@ Status ClusterManager::UnInit(bool not_unregister) {
}

std::unique_lock<std::mutex> lock(mutex_);
if(!not_unregister) {
if (!not_unregister) {
Status status = UnregisterToLeaderNoLock();
}

Expand Down Expand Up @@ -377,7 +378,20 @@ Status ClusterManager::GetReadersInfo(Vector<SharedPtr<NodeInfo>> &followers,

Status ClusterManager::AddNodeInfo(const SharedPtr<NodeInfo> &node_info) {
// Only used by Leader on follower/learner registration.
// TODO: check if the node was already connected before doing other things.
{
std::unique_lock<std::mutex> lock(mutex_);
if (this_node_->node_role_ != NodeRole::kLeader) {
String error_message = "Non-leader role can't add other node.";
UnrecoverableError(error_message);
}

// Add by register
auto iter = other_node_map_.find(node_info->node_name_);
if (iter != other_node_map_.end()) {
// Duplicated node
return Status::DuplicateNode(node_info->node_name_);
}
}

// Connect to follower/learner server.
auto [client_to_follower, client_status] =
Expand Down
10 changes: 5 additions & 5 deletions src/main/infinity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1258,7 +1258,7 @@ QueryResult Infinity::AdminSetAdmin() {

auto admin_statement = MakeUnique<AdminStatement>();
admin_statement->admin_type_ = AdminStmtType::kSetRole;
admin_statement->admin_node_role_ = AdminNodeRole::kAdmin;
admin_statement->node_role_ = NodeRole::kAdmin;
QueryResult result = query_context_ptr->QueryStatement(admin_statement.get());
return result;
}
Expand All @@ -1274,7 +1274,7 @@ QueryResult Infinity::AdminSetStandalone() {

auto admin_statement = MakeUnique<AdminStatement>();
admin_statement->admin_type_ = AdminStmtType::kSetRole;
admin_statement->admin_node_role_ = AdminNodeRole::kStandalone;
admin_statement->node_role_ = NodeRole::kStandalone;
QueryResult result = query_context_ptr->QueryStatement(admin_statement.get());
return result;
}
Expand All @@ -1290,7 +1290,7 @@ QueryResult Infinity::AdminSetLeader(String node_name) {

auto admin_statement = MakeUnique<AdminStatement>();
admin_statement->admin_type_ = AdminStmtType::kSetRole;
admin_statement->admin_node_role_ = AdminNodeRole::kLeader;
admin_statement->node_role_ = NodeRole::kLeader;
ToLower(node_name);
admin_statement->node_name_ = node_name;
QueryResult result = query_context_ptr->QueryStatement(admin_statement.get());
Expand All @@ -1308,7 +1308,7 @@ QueryResult Infinity::AdminSetFollower(String node_name, const String &leader_ad

auto admin_statement = MakeUnique<AdminStatement>();
admin_statement->admin_type_ = AdminStmtType::kSetRole;
admin_statement->admin_node_role_ = AdminNodeRole::kFollower;
admin_statement->node_role_ = NodeRole::kFollower;
admin_statement->leader_address_ = leader_address;
ToLower(node_name);
admin_statement->node_name_ = node_name;
Expand All @@ -1327,7 +1327,7 @@ QueryResult Infinity::AdminSetLearner(String node_name, const String &leader_add

auto admin_statement = MakeUnique<AdminStatement>();
admin_statement->admin_type_ = AdminStmtType::kSetRole;
admin_statement->admin_node_role_ = AdminNodeRole::kLearner;
admin_statement->node_role_ = NodeRole::kLearner;
admin_statement->leader_address_ = leader_address;
ToLower(node_name);
admin_statement->node_name_ = node_name;
Expand Down
2 changes: 1 addition & 1 deletion src/main/infinity_context.cppm
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import third_party;
import global_resource_usage;
import status;
import cluster_manager;
import peer_task;
import admin_statement;

namespace infinity {

Expand Down
1 change: 0 additions & 1 deletion src/network/http_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ import status;
import constant_expr;
import command_statement;
import physical_import;
import peer_task;

namespace {

Expand Down
1 change: 1 addition & 0 deletions src/network/peer_server_thrift_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import peer_task;
import status;
import infinity_exception;
import cluster_manager;
import admin_statement;

namespace infinity {

Expand Down
17 changes: 0 additions & 17 deletions src/network/peer_task.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,6 @@ import third_party;

namespace infinity {

String ToString(NodeRole role) {
switch (role) {
case NodeRole::kUnInitialized:
return "uninitialized";
case NodeRole::kAdmin:
return "admin";
case NodeRole::kStandalone:
return "standalone";
case NodeRole::kLeader:
return "leader";
case NodeRole::kFollower:
return "follower";
case NodeRole::kLearner:
return "learner";
}
}

String ToString(NodeStatus status) {
switch (status) {
case NodeStatus::kAlive:
Expand Down
12 changes: 1 addition & 11 deletions src/network/peer_task.cppm
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,10 @@ module;
export module peer_task;

import stl;
import admin_statement;

namespace infinity {

export enum class NodeRole {
kUnInitialized,
kAdmin,
kStandalone,
kLeader,
kFollower,
kLearner,
};

export String ToString(NodeRole);

export enum class PeerTaskType {
kInvalid,
kTerminate,
Expand Down
1 change: 1 addition & 0 deletions src/network/peer_thrift_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import infinity_exception;
import peer_task;
import infinity_context;
import cluster_manager;
import admin_statement;

namespace infinity {

Expand Down
10 changes: 5 additions & 5 deletions src/parser/parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7004,7 +7004,7 @@ YYLTYPE yylloc = yyloc_default;
{
(yyval.admin_stmt) = new infinity::AdminStatement();
(yyval.admin_stmt)->admin_type_ = infinity::AdminStmtType::kSetRole;
(yyval.admin_stmt)->admin_node_role_ = infinity::AdminNodeRole::kAdmin;
(yyval.admin_stmt)->node_role_ = infinity::NodeRole::kAdmin;
}
#line 7010 "parser.cpp"
break;
Expand All @@ -7014,7 +7014,7 @@ YYLTYPE yylloc = yyloc_default;
{
(yyval.admin_stmt) = new infinity::AdminStatement();
(yyval.admin_stmt)->admin_type_ = infinity::AdminStmtType::kSetRole;
(yyval.admin_stmt)->admin_node_role_ = infinity::AdminNodeRole::kStandalone;
(yyval.admin_stmt)->node_role_ = infinity::NodeRole::kStandalone;
}
#line 7020 "parser.cpp"
break;
Expand All @@ -7024,7 +7024,7 @@ YYLTYPE yylloc = yyloc_default;
{
(yyval.admin_stmt) = new infinity::AdminStatement();
(yyval.admin_stmt)->admin_type_ = infinity::AdminStmtType::kSetRole;
(yyval.admin_stmt)->admin_node_role_ = infinity::AdminNodeRole::kLeader;
(yyval.admin_stmt)->node_role_ = infinity::NodeRole::kLeader;
(yyval.admin_stmt)->node_name_ = (yyvsp[0].str_value);
free((yyvsp[0].str_value));
}
Expand All @@ -7036,7 +7036,7 @@ YYLTYPE yylloc = yyloc_default;
{
(yyval.admin_stmt) = new infinity::AdminStatement();
(yyval.admin_stmt)->admin_type_ = infinity::AdminStmtType::kSetRole;
(yyval.admin_stmt)->admin_node_role_ = infinity::AdminNodeRole::kFollower;
(yyval.admin_stmt)->node_role_ = infinity::NodeRole::kFollower;
(yyval.admin_stmt)->leader_address_ = (yyvsp[-4].str_value);
(yyval.admin_stmt)->node_name_ = (yyvsp[0].str_value);
free((yyvsp[-4].str_value));
Expand All @@ -7050,7 +7050,7 @@ YYLTYPE yylloc = yyloc_default;
{
(yyval.admin_stmt) = new infinity::AdminStatement();
(yyval.admin_stmt)->admin_type_ = infinity::AdminStmtType::kSetRole;
(yyval.admin_stmt)->admin_node_role_ = infinity::AdminNodeRole::kLearner;
(yyval.admin_stmt)->node_role_ = infinity::NodeRole::kLearner;
(yyval.admin_stmt)->leader_address_ = (yyvsp[-4].str_value);
(yyval.admin_stmt)->node_name_ = (yyvsp[0].str_value);
free((yyvsp[-4].str_value));
Expand Down
10 changes: 5 additions & 5 deletions src/parser/parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -2527,24 +2527,24 @@ admin_statement: ADMIN SHOW CATALOGS {
| ADMIN SET ADMIN {
$$ = new infinity::AdminStatement();
$$->admin_type_ = infinity::AdminStmtType::kSetRole;
$$->admin_node_role_ = infinity::AdminNodeRole::kAdmin;
$$->node_role_ = infinity::NodeRole::kAdmin;
}
| ADMIN SET STANDALONE {
$$ = new infinity::AdminStatement();
$$->admin_type_ = infinity::AdminStmtType::kSetRole;
$$->admin_node_role_ = infinity::AdminNodeRole::kStandalone;
$$->node_role_ = infinity::NodeRole::kStandalone;
}
| ADMIN SET LEADER USING STRING {
$$ = new infinity::AdminStatement();
$$->admin_type_ = infinity::AdminStmtType::kSetRole;
$$->admin_node_role_ = infinity::AdminNodeRole::kLeader;
$$->node_role_ = infinity::NodeRole::kLeader;
$$->node_name_ = $5;
free($5);
}
| ADMIN CONNECT STRING AS FOLLOWER USING STRING {
$$ = new infinity::AdminStatement();
$$->admin_type_ = infinity::AdminStmtType::kSetRole;
$$->admin_node_role_ = infinity::AdminNodeRole::kFollower;
$$->node_role_ = infinity::NodeRole::kFollower;
$$->leader_address_ = $3;
$$->node_name_ = $7;
free($3);
Expand All @@ -2553,7 +2553,7 @@ admin_statement: ADMIN SHOW CATALOGS {
| ADMIN CONNECT STRING AS LEARNER USING STRING {
$$ = new infinity::AdminStatement();
$$->admin_type_ = infinity::AdminStmtType::kSetRole;
$$->admin_node_role_ = infinity::AdminNodeRole::kLearner;
$$->node_role_ = infinity::NodeRole::kLearner;
$$->leader_address_ = $3;
$$->node_name_ = $7;
free($3);
Expand Down
17 changes: 17 additions & 0 deletions src/parser/statement/admin_statement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,21 @@ std::string AdminStatement::ToString() const {
return ss.str();
}

std::string ToString(NodeRole role) {
switch (role) {
case NodeRole::kUnInitialized:
return "uninitialized";
case NodeRole::kAdmin:
return "admin";
case NodeRole::kStandalone:
return "standalone";
case NodeRole::kLeader:
return "leader";
case NodeRole::kFollower:
return "follower";
case NodeRole::kLearner:
return "learner";
}
}

} // namespace infinity
5 changes: 3 additions & 2 deletions src/parser/statement/admin_statement.cppm
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ export module admin_statement;
namespace infinity {

export using infinity::AdminStatement;
export using infinity::AdminNodeRole;
export using infinity::NodeRole;
export using infinity::AdminStmtType;
export using infinity::ToString;

}
} // namespace infinity
9 changes: 6 additions & 3 deletions src/parser/statement/admin_statement.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,17 @@ enum class AdminStmtType {
kInvalid,
};

enum class AdminNodeRole {
enum class NodeRole {
kAdmin,
kStandalone,
kLeader,
kFollower,
kLearner
kLearner,
kUnInitialized
};

std::string ToString(NodeRole);

class AdminStatement : public BaseStatement {
public:
explicit AdminStatement() : BaseStatement(StatementType::kAdmin) {}
Expand All @@ -79,7 +82,7 @@ class AdminStatement : public BaseStatement {
std::optional<int64_t> index_entry_index_{};
std::optional<int64_t> log_file_index_{};
std::optional<int64_t> log_index_in_file_{};
std::optional<AdminNodeRole> admin_node_role_{};
std::optional<NodeRole> node_role_{};
std::optional<std::string> leader_address_{};
std::optional<std::string> variable_name_{};
std::optional<std::string> node_name_{};
Expand Down
2 changes: 1 addition & 1 deletion src/storage/meta/catalog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ import chunk_index_entry;
import log_file;
import persist_result_handler;
import local_file_handle;
import peer_task;
import admin_statement;

namespace infinity {

Expand Down
Loading
Loading