From dc9267188d1aaa5d4529563bb7db0dabe451c04c Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Tue, 2 Aug 2022 16:22:54 +0800 Subject: [PATCH] replication quorum support smart mode --- src/sf_configs.c | 2 ++ src/sf_configs.h | 10 +++++++--- src/sf_types.h | 3 ++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/sf_configs.c b/src/sf_configs.c index 880e30b..0140663 100644 --- a/src/sf_configs.c +++ b/src/sf_configs.c @@ -159,6 +159,8 @@ int sf_load_replication_quorum_config_ex(SFReplicationQuorum *quorum, *quorum = sf_replication_quorum_any; } else if (strncasecmp(str, "majority", 8) == 0) { *quorum = sf_replication_quorum_majority; + } else if (strncasecmp(str, "smart", 5) == 0) { + *quorum = sf_replication_quorum_smart; } else { logError("file: "__FILE__", line: %d, " "config file: %s, unkown quorum: %s", diff --git a/src/sf_configs.h b/src/sf_configs.h index e7a4504..0d0ef1a 100644 --- a/src/sf_configs.h +++ b/src/sf_configs.h @@ -137,6 +137,8 @@ static inline const char *sf_get_replication_quorum_caption( return "any"; case sf_replication_quorum_majority: return "majority"; + case sf_replication_quorum_smart: + return "smart"; default: return "unknown"; } @@ -156,6 +158,7 @@ static inline bool sf_replication_quorum_check(const SFReplicationQuorum return true; //same as sf_replication_quorum_any } //continue + case sf_replication_quorum_smart: case sf_replication_quorum_majority: return SF_REPLICATION_QUORUM_MAJORITY( server_count, success_count); @@ -183,10 +186,11 @@ static inline bool sf_replication_quorum_check(const SFReplicationQuorum && server_count % 2 == 0) #define SF_REPLICATION_QUORUM_NEED_MAJORITY(quorum, server_count) \ - (server_count > 1 && (quorum == sf_replication_quorum_majority || \ - (quorum == sf_replication_quorum_auto && \ - server_count % 2 == 1))) + (server_count > 1 && (quorum != sf_replication_quorum_any)) +#define SF_REPLICATION_QUORUM_NEED_DETECT(quorum, server_count) \ + (server_count % 2 == 0 && (quorum == sf_replication_quorum_smart || \ + quorum == sf_replication_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 66d7baf..08573e1 100644 --- a/src/sf_types.h +++ b/src/sf_types.h @@ -247,13 +247,14 @@ typedef struct sf_synchronize_context { typedef enum sf_election_quorum { sf_election_quorum_auto, sf_election_quorum_any, - sf_election_quorum_majority, + sf_election_quorum_majority } SFElectionQuorum; typedef enum sf_replication_quorum { sf_replication_quorum_auto, sf_replication_quorum_any, sf_replication_quorum_majority, + sf_replication_quorum_smart } SFReplicationQuorum; #endif