summaryrefslogtreecommitdiff
path: root/ovsdb/raft.c
diff options
context:
space:
mode:
authorHan Zhou <hzhou@ovn.org>2020-02-28 18:07:06 -0800
committerBen Pfaff <blp@ovn.org>2020-03-06 13:47:15 -0800
commit2833885f7ab565ce07f40de2ab8d415dc0390329 (patch)
tree82184e726a8e14de3c6dc4f7d002f65e476e1cf4 /ovsdb/raft.c
parentbda1f6b60588a45b71fa812f260921793df39aef (diff)
downloadopenvswitch-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.c10
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;
}