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;
|
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)
|
IniFullContext *ini_ctx, const SFElectionQuorum def_quorum)
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
|
@ -143,3 +143,28 @@ int sf_load_quorum_config_ex(SFElectionQuorum *quorum,
|
||||||
|
|
||||||
return 0;
|
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);
|
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)
|
const SFElectionQuorum quorum)
|
||||||
{
|
{
|
||||||
switch (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) \
|
#define sf_load_read_rule_config(rule, ini_ctx) \
|
||||||
sf_load_read_rule_config_ex(rule, ini_ctx, sf_data_read_rule_master_only)
|
sf_load_read_rule_config_ex(rule, ini_ctx, sf_data_read_rule_master_only)
|
||||||
|
|
||||||
#define sf_load_quorum_config(quorum, ini_ctx) \
|
#define sf_load_election_quorum_config(quorum, ini_ctx) \
|
||||||
sf_load_quorum_config_ex(quorum, ini_ctx, sf_election_quorum_auto)
|
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, \
|
#define SF_QUORUM_NEED_REQUEST_VOTE_NODE(quorum, vote_node_enabled, \
|
||||||
server_count, active_count) \
|
server_count, active_count) \
|
||||||
|
|
|
||||||
|
|
@ -250,4 +250,10 @@ typedef enum sf_election_quorum {
|
||||||
sf_election_quorum_majority,
|
sf_election_quorum_majority,
|
||||||
} SFElectionQuorum;
|
} SFElectionQuorum;
|
||||||
|
|
||||||
|
typedef enum sf_replication_quorum {
|
||||||
|
sf_replication_quorum_auto,
|
||||||
|
sf_replication_quorum_any,
|
||||||
|
sf_replication_quorum_majority,
|
||||||
|
} SFReplicationQuorum;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue