Dual channel replication should not update lastbgsave_status when transfer error (#811)

Currently lastbgsave_status is used in bgsave or disk-replication,
and the target is the disk. In #60, we update it when transfer error,
i think it is mainly used in tests, so we can use log to replace it.

It changes lastbgsave_status to err in this case, but it is strange
that it does not set ok or err in the above if and the following else.
Also noted this will affect stop-writes-on-bgsave-error.

Signed-off-by: Binbin <binloveplay1314@qq.com>
This commit is contained in:
Binbin 2024-08-13 02:25:55 +08:00 committed by GitHub
parent 5166d489da
commit 929283fc6f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 10 additions and 24 deletions

View File

@ -3450,10 +3450,9 @@ static void backgroundSaveDoneHandlerSocket(int exitcode, int bysignal) {
if (!bysignal && exitcode == 0) {
serverLog(LL_NOTICE, "Background RDB transfer terminated with success");
} else if (!bysignal && exitcode != 0) {
serverLog(LL_WARNING, "Background transfer error");
server.lastbgsave_status = C_ERR;
serverLog(LL_WARNING, "Background RDB transfer error");
} else {
serverLog(LL_WARNING, "Background transfer terminated by signal %d", bysignal);
serverLog(LL_WARNING, "Background RDB transfer terminated by signal %d", bysignal);
}
if (server.rdb_child_exit_pipe != -1) close(server.rdb_child_exit_pipe);
if (server.rdb_pipe_read > 0) {

View File

@ -890,6 +890,7 @@ start_server {tags {"dual-channel-replication external:skip"}} {
$primary debug log "killing replica main connection"
set replica_main_conn_id [get_client_id_by_last_cmd $primary "psync"]
assert {$replica_main_conn_id != ""}
set loglines [count_log_lines -1]
$primary client kill id $replica_main_conn_id
# Wait for primary to abort the sync
wait_for_condition 50 1000 {
@ -897,11 +898,7 @@ start_server {tags {"dual-channel-replication external:skip"}} {
} else {
fail "Primary did not free repl buf block after sync failure"
}
wait_for_condition 1000 10 {
[s -1 rdb_last_bgsave_status] eq "err"
} else {
fail "bgsave did not stop in time"
}
wait_for_log_messages -1 {"*Background RDB transfer error*"} $loglines 1000 10
}
test "Test dual channel replication slave of no one after main conn kill" {
@ -927,14 +924,10 @@ start_server {tags {"dual-channel-replication external:skip"}} {
$primary debug log "killing replica rdb connection"
set replica_rdb_channel_id [get_client_id_by_last_cmd $primary "sync"]
assert {$replica_rdb_channel_id != ""}
set loglines [count_log_lines -1]
$primary client kill id $replica_rdb_channel_id
# Wait for primary to abort the sync
wait_for_condition 1000 10 {
[s -1 rdb_bgsave_in_progress] eq 0 &&
[s -1 rdb_last_bgsave_status] eq "err"
} else {
fail "Primary should abort sync"
}
wait_for_log_messages -1 {"*Background RDB transfer error*"} $loglines 1000 10
}
test "Test dual channel replication slave of no one after rdb conn kill" {
@ -1073,6 +1066,7 @@ start_server {tags {"dual-channel-replication external:skip"}} {
$primary debug log "killing replica rdb connection"
set replica_rdb_channel_id [get_client_id_by_last_cmd $primary "sync"]
assert {$replica_rdb_channel_id != ""}
set loglines [count_log_lines -1]
$primary client kill id $replica_rdb_channel_id
# Wait for primary to abort the sync
wait_for_condition 50 1000 {
@ -1080,11 +1074,7 @@ start_server {tags {"dual-channel-replication external:skip"}} {
} else {
fail "Primary did not free repl buf block after sync failure"
}
wait_for_condition 1000 10 {
[s -1 rdb_last_bgsave_status] eq "err"
} else {
fail "bgsave did not stop in time"
}
wait_for_log_messages -1 {"*Background RDB transfer error*"} $loglines 1000 10
# Replica should retry
verify_replica_online $primary 0 500
stop_write_load $load_handle
@ -1111,6 +1101,7 @@ start_server {tags {"dual-channel-replication external:skip"}} {
$primary debug log "killing replica main connection"
set replica_main_conn_id [get_client_id_by_last_cmd $primary "sync"]
assert {$replica_main_conn_id != ""}
set loglines [count_log_lines -1]
$primary client kill id $replica_main_conn_id
# Wait for primary to abort the sync
wait_for_condition 50 1000 {
@ -1118,11 +1109,7 @@ start_server {tags {"dual-channel-replication external:skip"}} {
} else {
fail "Primary did not free repl buf block after sync failure"
}
wait_for_condition 1000 10 {
[s -1 rdb_last_bgsave_status] eq "err"
} else {
fail "bgsave did not stop in time"
}
wait_for_log_messages -1 {"*Background RDB transfer error*"} $loglines 1000 10
# Replica should retry
verify_replica_online $primary 0 500
stop_write_load $load_handle