Commit 2e5181ef authored by Josh Hershberg's avatar Josh Hershberg
Browse files

Cluster refactor: Add failover cmd support to cluster api



The failover command is up until now not supported
in cluster mode. This commit allows a cluster
implementation to support the command. The legacy
clustering implementation still does not support
this command.
Signed-off-by: default avatarJosh Hershberg <yehoshua@redis.com>
parent c6157b35
......@@ -96,6 +96,8 @@ char* clusterNodeHostname(clusterNode *node);
const char *getPreferredEndpoint(clusterNode *n);
void migrateCommand(client *c);
long long getReplOffset(clusterNode *node);
int clusterAllowFailoverCmd(client *c);
void clusterPromoteSelfToMaster(void);
char **clusterDebugCommandHelp(void);
ConnectionType *connTypeOfCluster(void);
......
......@@ -6400,11 +6400,27 @@ long long getReplOffset(clusterNode *node) {
}
const char *getPreferredEndpoint(clusterNode *n) {
char* hostname = clusterNodeHostname(n);
switch(server.cluster_preferred_endpoint_type) {
case CLUSTER_ENDPOINT_TYPE_IP: return clusterNodeIp(n);
case CLUSTER_ENDPOINT_TYPE_HOSTNAME: return (hostname != NULL && hostname[0] != '\0') ? hostname : "?";
case CLUSTER_ENDPOINT_TYPE_UNKNOWN_ENDPOINT: return "";
char *hostname = clusterNodeHostname(n);
switch (server.cluster_preferred_endpoint_type) {
case CLUSTER_ENDPOINT_TYPE_IP:
return clusterNodeIp(n);
case CLUSTER_ENDPOINT_TYPE_HOSTNAME:
return (hostname != NULL && hostname[0] != '\0') ? hostname : "?";
case CLUSTER_ENDPOINT_TYPE_UNKNOWN_ENDPOINT:
return "";
}
return "unknown";
}
int clusterAllowFailoverCmd(client *c) {
if (!server.cluster_enabled) {
return 1;
}
addReplyError(c,"FAILOVER not allowed in cluster mode. "
"Use CLUSTER FAILOVER command instead.");
return 0;
}
void clusterPromoteSelfToMaster(void) {
replicationUnsetMaster();
}
......@@ -951,7 +951,11 @@ void syncCommand(client *c) {
}
if (!strcasecmp(c->argv[1]->ptr,server.replid)) {
replicationUnsetMaster();
if (server.cluster_enabled) {
clusterPromoteSelfToMaster();
} else {
replicationUnsetMaster();
}
sds client = catClientInfoString(sdsempty(),c);
serverLog(LL_NOTICE,
"MASTER MODE enabled (failover request from '%s')",client);
......@@ -4061,12 +4065,10 @@ void abortFailover(const char *err) {
* will attempt forever and must be manually aborted.
*/
void failoverCommand(client *c) {
if (server.cluster_enabled) {
addReplyError(c,"FAILOVER not allowed in cluster mode. "
"Use CLUSTER FAILOVER command instead.");
if (!clusterAllowFailoverCmd(c)) {
return;
}
/* Handle special case for abort */
if ((c->argc == 2) && !strcasecmp(c->argv[1]->ptr,"abort")) {
if (server.failover_state == NO_FAILOVER) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment