diff --git a/deps/rocksdb b/deps/rocksdb index c3034fce3..e3169e3ea 160000 --- a/deps/rocksdb +++ b/deps/rocksdb @@ -1 +1 @@ -Subproject commit c3034fce329017036c807e01261729bfc11a5d62 +Subproject commit e3169e3ea8762d2f34880742106858a23c8dc8b7 diff --git a/src/config.cpp b/src/config.cpp index 6147bc429..794d65ee0 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -2852,6 +2852,7 @@ standardConfig configs[] = { createULongConfig("loading-process-events-interval-bytes", NULL, MODIFIABLE_CONFIG, 0, LONG_MAX, g_pserver->loading_process_events_interval_bytes, 2*1024*1024, MEMORY_CONFIG, NULL, NULL), createBoolConfig("multi-master-no-forward", NULL, MODIFIABLE_CONFIG, cserver.multimaster_no_forward, 0, validateMultiMasterNoForward, NULL), createBoolConfig("allow-write-during-load", NULL, MODIFIABLE_CONFIG, g_pserver->fWriteDuringActiveLoad, 0, NULL, NULL), + createBoolConfig("force-backlog-disk-reserve", NULL, MODIFIABLE_CONFIG, cserver.force_backlog_disk, 0, NULL, NULL), #ifdef USE_OPENSSL createIntConfig("tls-port", NULL, MODIFIABLE_CONFIG, 0, 65535, g_pserver->tls_port, 0, INTEGER_CONFIG, NULL, updateTLSPort), /* TCP port. */ diff --git a/src/replication.cpp b/src/replication.cpp index d64bec35f..27f5af503 100644 --- a/src/replication.cpp +++ b/src/replication.cpp @@ -220,7 +220,12 @@ void createReplicationBacklog(void) { serverLog(LL_WARNING, "Failed to create disk backlog, will use memory only"); } } - g_pserver->repl_backlog = (char*)zmalloc(g_pserver->repl_backlog_size, MALLOC_LOCAL); + if (cserver.force_backlog_disk && g_pserver->repl_backlog_disk != nullptr) { + g_pserver->repl_backlog = g_pserver->repl_backlog_disk; + g_pserver->repl_backlog_size = cserver.repl_backlog_disk_size; + } else { + g_pserver->repl_backlog = (char*)zmalloc(g_pserver->repl_backlog_size, MALLOC_LOCAL); + } g_pserver->repl_backlog_histlen = 0; g_pserver->repl_backlog_idx = 0; g_pserver->repl_backlog_start = g_pserver->master_repl_offset; @@ -272,7 +277,7 @@ void resizeReplicationBacklog(long long newsize) { newsize = std::max(newsize, g_pserver->master_repl_offset - earliest_off); if (cserver.repl_backlog_disk_size != 0) { - if (newsize > g_pserver->repl_backlog_config_size) { + if (newsize > g_pserver->repl_backlog_config_size || cserver.force_backlog_disk) { if (g_pserver->repl_backlog == g_pserver->repl_backlog_disk) return; // Can't do anything more serverLog(LL_NOTICE, "Switching to disk backed replication backlog due to exceeding memory limits"); @@ -5718,6 +5723,8 @@ void trimReplicationBacklog() { return; // We're already a good size if (g_pserver->repl_lowest_off > 0 && (g_pserver->master_repl_offset - g_pserver->repl_lowest_off + 1) > g_pserver->repl_backlog_config_size) return; // There is untransmitted data we can't truncate + if (cserver.force_backlog_disk && g_pserver->repl_backlog == g_pserver->repl_backlog_disk) + return; // We're already in the disk backlog and we're told to stay there serverLog(LL_NOTICE, "Reclaiming %lld replication backlog bytes", g_pserver->repl_backlog_size - g_pserver->repl_backlog_config_size); resizeReplicationBacklog(g_pserver->repl_backlog_config_size); diff --git a/src/server.h b/src/server.h index 466221f61..31cf398d0 100644 --- a/src/server.h +++ b/src/server.h @@ -2178,6 +2178,7 @@ struct redisServerConst { int fForkBgSave = false; int time_thread_priority = false; long long repl_backlog_disk_size = 0; + int force_backlog_disk = 0; }; struct redisServer {