diff --git a/src/sf_configs.c b/src/sf_configs.c index 4f02ee2..880e30b 100644 --- a/src/sf_configs.c +++ b/src/sf_configs.c @@ -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; +} diff --git a/src/sf_configs.h b/src/sf_configs.h index 6ca56d4..19a615f 100644 --- a/src/sf_configs.h +++ b/src/sf_configs.h @@ -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) \ diff --git a/src/sf_types.h b/src/sf_types.h index 2062e93..7805da6 100644 --- a/src/sf_types.h +++ b/src/sf_types.h @@ -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