diff options
author | Han Zhou <hzhou@ovn.org> | 2020-02-28 18:07:06 -0800 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2020-03-06 13:47:15 -0800 |
commit | 2833885f7ab565ce07f40de2ab8d415dc0390329 (patch) | |
tree | 82184e726a8e14de3c6dc4f7d002f65e476e1cf4 /ovsdb/raft.c | |
parent | bda1f6b60588a45b71fa812f260921793df39aef (diff) | |
download | openvswitch-2833885f7ab565ce07f40de2ab8d415dc0390329.tar.gz |
raft: Fix raft_is_connected() when there is no leader yet.
If there is never a leader known by the current server, it's status
should be "disconnected" to the cluster. Without this patch, when
a server in cluster is restarted, before it successfully connecting
back to the cluster it will appear as connected, which is wrong.
Signed-off-by: Han Zhou <hzhou@ovn.org>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ovsdb/raft.c')
-rw-r--r-- | ovsdb/raft.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/ovsdb/raft.c b/ovsdb/raft.c index 4789bc4f2..6cd7b0041 100644 --- a/ovsdb/raft.c +++ b/ovsdb/raft.c @@ -298,6 +298,11 @@ struct raft { bool had_leader; /* There has been leader elected since last election initiated. This is to help setting candidate_retrying. */ + + /* For all. */ + bool ever_had_leader; /* There has been leader elected since the raft + is initialized, meaning it is ever + connected. */ }; /* All Raft structures. */ @@ -1024,7 +1029,8 @@ raft_is_connected(const struct raft *raft) && !raft->joining && !raft->leaving && !raft->left - && !raft->failed); + && !raft->failed + && raft->ever_had_leader); VLOG_DBG("raft_is_connected: %s\n", ret? "true": "false"); return ret; } @@ -2519,7 +2525,7 @@ static void raft_set_leader(struct raft *raft, const struct uuid *sid) { raft->leader_sid = *sid; - raft->had_leader = true; + raft->ever_had_leader = raft->had_leader = true; raft->candidate_retrying = false; } |