From ad3ebf61d212bf8169fa3fd7f83a210e76cc83fc Mon Sep 17 00:00:00 2001 From: Shahar Mike Date: Thu, 15 Aug 2024 14:56:40 +0300 Subject: [PATCH] feat(cluster): Allow appending RDB to existing store (#3505) * feat(cluster): Allow appending RDB to existing store The goal of this PR is to support the loadoing of multiple RDB files into a single server, like when migrating from a Valkey cluster to Dragonfly with a different number of nodes. It makes the following changes: * Removes `DEBUG LOAD`, as we already have `DFLY LOAD` * Adds `APPEND` option to `DFLY LOAD` (i.e. `DFLY LOAD APPEND`) that loads an RDB without first flushing the data store, overriding existing keys * Does not load keys belonging to unowned slots, if in cluster mode Fixes #2840 --- src/server/cluster/cluster_family_test.cc | 2 +- src/server/debugcmd.cc | 65 +++++------------------ src/server/debugcmd.h | 3 -- src/server/dflycmd.cc | 65 +++++++++++++++++++++-- src/server/dflycmd.h | 2 + src/server/rdb_load.cc | 11 +++- src/server/rdb_load.h | 11 ++++ src/server/rdb_test.cc | 28 ++++++++-- src/server/replica.cc | 2 + src/server/server_family.cc | 46 +++++++++++++--- src/server/server_family.h | 8 ++- tests/dragonfly/snapshot_test.py | 10 ++-- 12 files changed, 175 insertions(+), 78 deletions(-) diff --git a/src/server/cluster/cluster_family_test.cc b/src/server/cluster/cluster_family_test.cc index feaa1d6d5..a2489e1e9 100644 --- a/src/server/cluster/cluster_family_test.cc +++ b/src/server/cluster/cluster_family_test.cc @@ -597,7 +597,7 @@ TEST_F(ClusterFamilyTest, ClusterFirstConfigCallDropsEntriesNotOwnedByNode) { EXPECT_EQ(Run({"save", "df"}), "OK"); auto save_info = service_->server_family().GetLastSaveInfo(); - EXPECT_EQ(Run({"debug", "load", save_info.file_name}), "OK"); + EXPECT_EQ(Run({"dfly", "load", save_info.file_name}), "OK"); EXPECT_EQ(CheckedInt({"dbsize"}), 50000); ConfigSingleNodeCluster("abcd1234"); diff --git a/src/server/debugcmd.cc b/src/server/debugcmd.cc index 2f66b9a2c..acdc0789b 100644 --- a/src/server/debugcmd.cc +++ b/src/server/debugcmd.cc @@ -373,7 +373,6 @@ void DebugCmd::Run(CmdArgList args) { " arguments. Each descriptor is prefixed by its frequency count", "OBJECT [COMPRESS]", " Show low-level info about `key` and associated value.", - "LOAD ", "RELOAD [option ...]", " Save the RDB on disk and reload it back to memory. Valid