Merge branch 'redis_merge' into keydb_pro_merge

Former-commit-id: e10d9de29059f42193560712991df0950eeef679
This commit is contained in:
John Sully 2020-01-29 13:43:45 -05:00
commit 81b616bfbb
2 changed files with 57 additions and 21 deletions

View File

@ -1879,17 +1879,21 @@ void readSyncBulkPayload(connection *conn) {
/* We need to stop any AOF rewriting child before flusing and parsing /* We need to stop any AOF rewriting child before flusing and parsing
* the RDB, otherwise we'll create a copy-on-write disaster. */ * the RDB, otherwise we'll create a copy-on-write disaster. */
if (g_pserver->aof_state != AOF_OFF) stopAppendOnly(); if (g_pserver->aof_state != AOF_OFF) stopAppendOnly();
signalFlushedDb(-1);
/* When diskless RDB loading is used by replicas, it may be configured if (!fUpdate)
* in order to save the current DB instead of throwing it away,
* so that we can restore it in case of failed transfer. */
if (use_diskless_load &&
g_pserver->repl_diskless_load == REPL_DISKLESS_LOAD_SWAPDB)
{ {
diskless_load_backup = disklessLoadMakeBackups(); signalFlushedDb(-1);
/* When diskless RDB loading is used by replicas, it may be configured
* in order to save the current DB instead of throwing it away,
* so that we can restore it in case of failed transfer. */
if (use_diskless_load &&
g_pserver->repl_diskless_load == REPL_DISKLESS_LOAD_SWAPDB)
{
diskless_load_backup = disklessLoadMakeBackups();
}
emptyDb(-1,empty_db_flags,replicationEmptyDbCallback);
} }
emptyDb(-1,empty_db_flags,replicationEmptyDbCallback);
/* Before loading the DB into memory we need to delete the readable /* Before loading the DB into memory we need to delete the readable
* handler, otherwise it will get called recursively since * handler, otherwise it will get called recursively since
@ -1916,13 +1920,15 @@ void readSyncBulkPayload(connection *conn) {
"from socket"); "from socket");
cancelReplicationHandshake(mi); cancelReplicationHandshake(mi);
rioFreeConn(&rdb, NULL); rioFreeConn(&rdb, NULL);
if (g_pserver->repl_diskless_load == REPL_DISKLESS_LOAD_SWAPDB) { if (!fUpdate) {
/* Restore the backed up databases. */ if (g_pserver->repl_diskless_load == REPL_DISKLESS_LOAD_SWAPDB) {
disklessLoadRestoreBackups(diskless_load_backup,1); /* Restore the backed up databases. */
} else { disklessLoadRestoreBackups(diskless_load_backup,1);
/* Remove the half-loaded data in case we started with } else {
* an empty replica. */ /* Remove the half-loaded data in case we started with
emptyDb(-1,empty_db_flags,replicationEmptyDbCallback); * an empty replica. */
emptyDb(-1,empty_db_flags,replicationEmptyDbCallback);
}
} }
/* Note that there's no point in restarting the AOF on SYNC /* Note that there's no point in restarting the AOF on SYNC
@ -1932,12 +1938,14 @@ void readSyncBulkPayload(connection *conn) {
} }
stopLoading(1); stopLoading(1);
/* RDB loading succeeded if we reach this point. */ if (!fUpdate) {
if (g_pserver->repl_diskless_load == REPL_DISKLESS_LOAD_SWAPDB) { /* RDB loading succeeded if we reach this point. */
/* Delete the backup databases we created before starting to load if (g_pserver->repl_diskless_load == REPL_DISKLESS_LOAD_SWAPDB) {
* the new RDB. Now the RDB was loaded with success so the old /* Delete the backup databases we created before starting to load
* data is useless. */ * the new RDB. Now the RDB was loaded with success so the old
disklessLoadRestoreBackups(diskless_load_backup,0); * data is useless. */
disklessLoadRestoreBackups(diskless_load_backup,0);
}
} }
/* Verify the end mark is correct. */ /* Verify the end mark is correct. */

View File

@ -129,3 +129,31 @@ start_server {tags {"active-repl"} overrides {active-replica yes}} {
} }
} }
} }
foreach mdl {no yes} {
foreach sdl {disabled swapdb} {
start_server {tags {"active-repl"} overrides {active-replica yes}} {
set master [srv 0 client]
$master config set repl-diskless-sync $mdl
set master_host [srv 0 host]
set master_port [srv 0 port]
r set masterkey foo
start_server {overrides {active-replica yes}} {
test "Active replication databases are merged, master diskless=$mdl, replica diskless=$sdl" {
r config set repl-diskless-load $sdl
r set slavekey bar
r replicaof $master_host $master_port
wait_for_condition 50 400 {
[string match *state=online* [$master info]]
} else {
fail "Replica never came online"
}
assert_equal bar [r get slavekey]
assert_equal foo [r get masterkey]
}
}
}
}
}