Unverified Commit 733123ab authored by Ozan Tezcan's avatar Ozan Tezcan Committed by GitHub
Browse files

Propagate persist_metadata() failure (#138)

Propagate error codes from persist_metadata() callback
parent e79d3b6a
...@@ -509,7 +509,10 @@ int raft_become_candidate(raft_server_t *me) ...@@ -509,7 +509,10 @@ int raft_become_candidate(raft_server_t *me)
} }
if (raft_node_is_voting(me->node)) { if (raft_node_is_voting(me->node)) {
raft_vote(me, me->node); e = raft_vote(me, me->node);
if (e != 0) {
return e;
}
} }
me->leader_id = RAFT_NODE_ID_NONE; me->leader_id = RAFT_NODE_ID_NONE;
...@@ -1867,16 +1870,19 @@ int raft_begin_load_snapshot(raft_server_t *me, ...@@ -1867,16 +1870,19 @@ int raft_begin_load_snapshot(raft_server_t *me,
return RAFT_ERR_SNAPSHOT_ALREADY_LOADED; return RAFT_ERR_SNAPSHOT_ALREADY_LOADED;
} }
if (last_included_term > me->current_term) {
int e = raft_set_current_term(me, last_included_term);
if (e != 0) {
return e;
}
}
me->log_impl->reset(me->log, last_included_index + 1, last_included_term); me->log_impl->reset(me->log, last_included_index + 1, last_included_term);
if (last_included_index > me->commit_idx) { if (last_included_index > me->commit_idx) {
raft_set_commit_idx(me, last_included_index); raft_set_commit_idx(me, last_included_index);
} }
if (last_included_term > me->current_term) {
raft_set_current_term(me, last_included_term);
}
me->last_applied_term = last_included_term; me->last_applied_term = last_included_term;
me->last_applied_idx = last_included_index; me->last_applied_idx = last_included_index;
me->next_snapshot_last_term = last_included_term; me->next_snapshot_last_term = last_included_term;
......
...@@ -4988,6 +4988,45 @@ void TestRaft_delete_configuration_change_entries(CuTest *tc) ...@@ -4988,6 +4988,45 @@ void TestRaft_delete_configuration_change_entries(CuTest *tc)
CuAssertIntEquals(tc, 0, raft_recv_entry(r, ety, NULL)); CuAssertIntEquals(tc, 0, raft_recv_entry(r, ety, NULL));
} }
static int fail_sequence = 0;
static int cb_persist_metadata_fail(raft_server_t *raft, void *udata,
raft_term_t term, raft_node_id_t vote)
{
if (--fail_sequence >= 0) {
return 0;
}
return -1;
}
void TestRaft_propagate_persist_metadata_failure(CuTest *tc)
{
int e;
raft_cbs_t funcs = {
.persist_metadata = cb_persist_metadata_fail,
};
raft_server_t *r = raft_new();
raft_set_callbacks(r, &funcs, NULL);
raft_add_node(r, NULL, 1, 1);
raft_add_node(r, NULL, 2, 0);
/* This will fail when we increment the term. */
e = raft_become_candidate(r);
CuAssertIntEquals(tc, e, -1);
/* This will fail when we vote for ourselves. */
fail_sequence = 1;
e = raft_become_candidate(r);
CuAssertIntEquals(tc, e, -1);
fail_sequence = 0;
e = raft_begin_load_snapshot(r, 2, 10);
CuAssertIntEquals(tc, e, -1);
}
int main(void) int main(void)
{ {
CuString *output = CuStringNew(); CuString *output = CuStringNew();
...@@ -5141,6 +5180,7 @@ int main(void) ...@@ -5141,6 +5180,7 @@ int main(void)
SUITE_ADD_TEST(suite, TestRaft_test_metadata_on_restart); SUITE_ADD_TEST(suite, TestRaft_test_metadata_on_restart);
SUITE_ADD_TEST(suite, TestRaft_rebuild_config_after_restart); SUITE_ADD_TEST(suite, TestRaft_rebuild_config_after_restart);
SUITE_ADD_TEST(suite, TestRaft_delete_configuration_change_entries); SUITE_ADD_TEST(suite, TestRaft_delete_configuration_change_entries);
SUITE_ADD_TEST(suite, TestRaft_propagate_persist_metadata_failure);
CuSuiteRun(suite); CuSuiteRun(suite);
CuSuiteDetails(suite, output); CuSuiteDetails(suite, output);
printf("%s\n", output->buffer); printf("%s\n", output->buffer);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment