add replication quorum type and functions

replication_quorum
YuQing 2022-06-16 16:01:01 +08:00
parent e344feb092
commit e8e6cfc64a
3 changed files with 78 additions and 5 deletions

View File

@ -119,7 +119,7 @@ int sf_load_read_rule_config_ex(SFDataReadRule *rule,
return 0;
}
int sf_load_quorum_config_ex(SFElectionQuorum *quorum,
int sf_load_election_quorum_config_ex(SFElectionQuorum *quorum,
IniFullContext *ini_ctx, const SFElectionQuorum def_quorum)
{
char *str;
@ -143,3 +143,28 @@ int sf_load_quorum_config_ex(SFElectionQuorum *quorum,
return 0;
}
int sf_load_replication_quorum_config_ex(SFReplicationQuorum *quorum,
IniFullContext *ini_ctx, const SFReplicationQuorum def_quorum)
{
char *str;
str = iniGetStrValue(ini_ctx->section_name,
"quorum", ini_ctx->context);
if (str == NULL) {
*quorum = def_quorum;
} else if (strncasecmp(str, "auto", 4) == 0) {
*quorum = sf_replication_quorum_auto;
} else if (strncasecmp(str, "any", 3) == 0) {
*quorum = sf_replication_quorum_any;
} else if (strncasecmp(str, "majority", 8) == 0) {
*quorum = sf_replication_quorum_majority;
} else {
logError("file: "__FILE__", line: %d, "
"config file: %s, unkown quorum: %s",
__LINE__, ini_ctx->filename, str);
return EINVAL;
}
return 0;
}

View File

@ -85,10 +85,10 @@ static inline const char *sf_get_read_rule_caption(
}
}
int sf_load_quorum_config_ex(SFElectionQuorum *quorum,
int sf_load_election_quorum_config_ex(SFElectionQuorum *quorum,
IniFullContext *ini_ctx, const SFElectionQuorum def_quorum);
static inline const char *sf_get_quorum_caption(
static inline const char *sf_get_election_quorum_caption(
const SFElectionQuorum quorum)
{
switch (quorum) {
@ -124,12 +124,54 @@ static inline bool sf_election_quorum_check(const SFElectionQuorum quorum,
}
}
int sf_load_replication_quorum_config_ex(SFReplicationQuorum *quorum,
IniFullContext *ini_ctx, const SFReplicationQuorum def_quorum);
static inline const char *sf_get_replication_quorum_caption(
const SFReplicationQuorum quorum)
{
switch (quorum) {
case sf_replication_quorum_auto:
return "auto";
case sf_replication_quorum_any:
return "any";
case sf_replication_quorum_majority:
return "majority";
default:
return "unknown";
}
}
static inline bool sf_replication_quorum_check(const SFReplicationQuorum quorum,
const bool vote_node_enabled, const int total_count,
const int active_count)
{
switch (quorum) {
case sf_replication_quorum_any:
return active_count > 0;
case sf_replication_quorum_auto:
if (total_count % 2 == 0 && !vote_node_enabled) {
return active_count > 0; //same as sf_replication_quorum_any
}
//continue
case sf_replication_quorum_majority:
if (active_count == total_count) {
return true;
} else {
return active_count > total_count / 2;
}
}
}
#define sf_load_read_rule_config(rule, ini_ctx) \
sf_load_read_rule_config_ex(rule, ini_ctx, sf_data_read_rule_master_only)
#define sf_load_quorum_config(quorum, ini_ctx) \
sf_load_quorum_config_ex(quorum, ini_ctx, sf_election_quorum_auto)
#define sf_load_election_quorum_config(quorum, ini_ctx) \
sf_load_election_quorum_config_ex(quorum, ini_ctx, sf_election_quorum_auto)
#define sf_load_replication_quorum_config(quorum, ini_ctx) \
sf_load_replication_quorum_config_ex(quorum, ini_ctx, \
sf_replication_quorum_auto)
#define SF_QUORUM_NEED_REQUEST_VOTE_NODE(quorum, vote_node_enabled, \
server_count, active_count) \

View File

@ -250,4 +250,10 @@ typedef enum sf_election_quorum {
sf_election_quorum_majority,
} SFElectionQuorum;
typedef enum sf_replication_quorum {
sf_replication_quorum_auto,
sf_replication_quorum_any,
sf_replication_quorum_majority,
} SFReplicationQuorum;
#endif