add replication quorum type and functions
parent
e344feb092
commit
e8e6cfc64a
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue