From 3b6b0f5436c37144ff083ad93203845a7c4e844c Mon Sep 17 00:00:00 2001 From: Roy Jacobson Date: Wed, 19 Jul 2023 14:21:14 +0200 Subject: [PATCH] fix(rdb): Fix loading of small integers and remove code duplication (#1571) * fix(rdb): Fix loading of small integers and remove code duplication * Add a test --- src/server/rdb_load.cc | 18 ++++++------------ src/server/rdb_test.cc | 8 ++++++++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/server/rdb_load.cc b/src/server/rdb_load.cc index ac5b500ba..825130e6e 100644 --- a/src/server/rdb_load.cc +++ b/src/server/rdb_load.cc @@ -1165,20 +1165,14 @@ auto RdbLoaderBase::FetchLzfStringObject() -> io::Result { } auto RdbLoaderBase::FetchIntegerObject(int enctype) -> io::Result { - long long val; + io::Result val = ReadIntObj(enctype); - if (enctype == RDB_ENC_INT8) { - SET_OR_UNEXPECT(FetchInt(), val); - } else if (enctype == RDB_ENC_INT16) { - SET_OR_UNEXPECT(FetchInt(), val); - } else if (enctype == RDB_ENC_INT32) { - SET_OR_UNEXPECT(FetchInt(), val); - } else { - return Unexpected(errc::invalid_encoding); + if (!val.has_value()) { + return val.get_unexpected(); } char buf[32]; - absl::numbers_internal::FastIntToBuffer(val, buf); + absl::numbers_internal::FastIntToBuffer(*val, buf); return string(buf); } @@ -1323,9 +1317,9 @@ io::Result RdbLoaderBase::ReadIntObj(int enctype) { if (enctype == RDB_ENC_INT8) { SET_OR_UNEXPECT(FetchInt(), val); } else if (enctype == RDB_ENC_INT16) { - SET_OR_UNEXPECT(FetchInt(), val); + SET_OR_UNEXPECT(FetchInt(), val); } else if (enctype == RDB_ENC_INT32) { - SET_OR_UNEXPECT(FetchInt(), val); + SET_OR_UNEXPECT(FetchInt(), val); } else { return Unexpected(errc::invalid_encoding); } diff --git a/src/server/rdb_test.cc b/src/server/rdb_test.cc index f8bbb2b8f..9dd1f7f12 100644 --- a/src/server/rdb_test.cc +++ b/src/server/rdb_test.cc @@ -220,6 +220,10 @@ TEST_F(RdbTest, Reload) { Run({"zadd", "zs1", "1.1", "a", "-1.1", "b"}); Run({"zadd", "zs2", "1.1", string(510, 'a'), "-1.1", string(502, 'b')}); + Run({"hset", "large_keyname", string(240, 'X'), "-5"}); + Run({"hset", "large_keyname", string(240, 'Y'), "-500"}); + Run({"hset", "large_keyname", string(240, 'Z'), "-50000"}); + auto resp = Run({"debug", "reload"}); ASSERT_EQ(resp, "OK"); @@ -230,6 +234,10 @@ TEST_F(RdbTest, Reload) { EXPECT_EQ(4, CheckedInt({"LLEN", "list_key2"})); EXPECT_EQ(2, CheckedInt({"ZCARD", "zs1"})); EXPECT_EQ(2, CheckedInt({"ZCARD", "zs2"})); + + EXPECT_EQ(-5, CheckedInt({"hget", "large_keyname", string(240, 'X')})); + EXPECT_EQ(-500, CheckedInt({"hget", "large_keyname", string(240, 'Y')})); + EXPECT_EQ(-50000, CheckedInt({"hget", "large_keyname", string(240, 'Z')})); } TEST_F(RdbTest, ReloadTtl) {