]> git.proxmox.com Git - mirror_ovs.git/commitdiff
ovsdb raft: Fix the problem when cluster restarted after DB compaction.
authorHan Zhou <hzhou@ovn.org>
Wed, 4 Dec 2019 01:57:20 +0000 (17:57 -0800)
committerBen Pfaff <blp@ovn.org>
Fri, 20 Dec 2019 20:57:38 +0000 (12:57 -0800)
Cluster doesn't work after all nodes restarted after DB compaction,
unless there is any transaction after DB compaction before the restart.

Error log is like:
raft|ERR|internal error: deferred vote_request message completed but not ready
to send because message index 9 is past last synced index 0: s2 vote_request:
term=6 last_log_index=9 last_log_term=4

The root cause is that the log_synced member is not initialized when
reading the raft header. This patch fixes it and remove the XXX
from the test case.

Signed-off-by: Han Zhou <hzhou@ovn.org>
Signed-off-by: Ben Pfaff <blp@ovn.org>
ovsdb/raft.c
tests/ovsdb-cluster.at

index f354d50a51832cee7456df54a3a7c371e3196397..4789bc4f22e83fa0088e227cbd0d2321d974df6c 100644 (file)
@@ -849,7 +849,7 @@ raft_read_header(struct raft *raft)
     } else {
         raft_entry_clone(&raft->snap, &h.snap);
         raft->log_start = raft->log_end = h.snap_index + 1;
-        raft->commit_index = h.snap_index;
+        raft->log_synced = raft->commit_index = h.snap_index;
         raft->last_applied = h.snap_index - 1;
     }
 
index 79c851e3ee19c6acb9b3227a03599695a2895194..3a0bd4579e4161825b803afe90814f2fd85d5472 100644 (file)
@@ -246,14 +246,6 @@ for i in `seq $n`; do
     AT_CHECK([ovs-appctl -t "`pwd`"/s$i ovsdb-server/compact])
 done
 
-# XXX: Insert data after compact, because otherwise vote will fail after
-# cluster restart after compact. There will be error logs like:
-# raft|ERR|internal error: deferred vote_request message completed but not ready to send because message index 9 is past last synced index 0: s2 vote_request: term=6 last_log_index=9 last_log_term=4
-AT_CHECK([ovsdb-client transact unix:s1.ovsdb '[["idltest",
-      {"op": "insert",
-       "table": "simple",
-       "row": {"i": 1}}]]'], [0], [ignore], [ignore])
-
 for i in `seq $n`; do
     printf "\ns$i: stopping\n"
     OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/s$i], [s$i.pid])