Skip to content

Commit

Permalink
ovsdb raft: Fix the problem when cluster restarted after DB compaction.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
hzhou8 authored and blp committed Dec 20, 2019
1 parent 6d03405 commit 7efc698
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 9 deletions.
2 changes: 1 addition & 1 deletion ovsdb/raft.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
8 changes: 0 additions & 8 deletions tests/ovsdb-cluster.at
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand Down

0 comments on commit 7efc698

Please sign in to comment.