From 78e321f4ad797e55faa5b635bac3e94240800602 Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Thu, 21 Apr 2022 11:29:43 +0800 Subject: [PATCH] election quorum support sf_election_quorum_auto --- src/sf_configs.c | 2 ++ src/sf_configs.h | 24 +++++++++++++++++++++++- src/sf_types.h | 5 +++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/sf_configs.c b/src/sf_configs.c index f088515..4f02ee2 100644 --- a/src/sf_configs.c +++ b/src/sf_configs.c @@ -128,6 +128,8 @@ int sf_load_quorum_config_ex(SFElectionQuorum *quorum, "quorum", ini_ctx->context); if (str == NULL) { *quorum = def_quorum; + } else if (strncasecmp(str, "auto", 4) == 0) { + *quorum = sf_election_quorum_auto; } else if (strncasecmp(str, "any", 3) == 0) { *quorum = sf_election_quorum_any; } else if (strncasecmp(str, "majority", 8) == 0) { diff --git a/src/sf_configs.h b/src/sf_configs.h index b8887ac..a0a71ee 100644 --- a/src/sf_configs.h +++ b/src/sf_configs.h @@ -92,6 +92,8 @@ static inline const char *sf_get_quorum_caption( const SFElectionQuorum quorum) { switch (quorum) { + case sf_election_quorum_auto: + return "auto"; case sf_election_quorum_any: return "any"; case sf_election_quorum_majority: @@ -101,11 +103,31 @@ static inline const char *sf_get_quorum_caption( } } +static inline bool sf_election_quorum_check(const SFElectionQuorum quorum, + const int total_count, const int active_count) +{ + switch (quorum) { + case sf_election_quorum_any: + return active_count > 0; + case sf_election_quorum_auto: + if (total_count % 2 == 0) { //same as sf_election_quorum_any + return active_count > 0; + } + //continue + case sf_election_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_majority) + sf_load_quorum_config_ex(quorum, ini_ctx, sf_election_quorum_auto) #define SF_NET_RETRY_FINISHED(retry_times, counter, result) \ !((SF_IS_RETRIABLE_ERROR(result) && ((retry_times > 0 && \ diff --git a/src/sf_types.h b/src/sf_types.h index ec3f3ba..2062e93 100644 --- a/src/sf_types.h +++ b/src/sf_types.h @@ -245,8 +245,9 @@ typedef struct sf_synchronize_context { } SFSynchronizeContext; typedef enum sf_election_quorum { - sf_election_quorum_any = 1, - sf_election_quorum_majority + sf_election_quorum_auto, + sf_election_quorum_any, + sf_election_quorum_majority, } SFElectionQuorum; #endif