From a8c1e5cd4a26f27986b8f4a1e8768f709eb24e64 Mon Sep 17 00:00:00 2001 From: Roman Gershman Date: Mon, 13 Mar 2023 09:44:29 +0200 Subject: [PATCH] feat: increase expiry period to 8 years. Related to #923. Signed-off-by: Roman Gershman --- docs/differences.md | 6 +++--- src/server/common.h | 2 +- src/server/generic_family_test.cc | 6 +++++- src/server/string_family.cc | 2 +- src/server/string_family_test.cc | 2 ++ 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/differences.md b/docs/differences.md index b6b6acd24..517bc5c7a 100644 --- a/docs/differences.md +++ b/docs/differences.md @@ -11,9 +11,9 @@ Indices (say in GETRANGE and SETRANGE commands) should be signed 32 bit integers SORT does not take any locale into account. ## Expiry ranges. -Expirations are limited to 4 years. For commands with millisecond precision like PEXPIRE or PSETEX, -expirations greater than 2^27ms are quietly rounded to the nearest second loosing precision of less than 0.001%. +Expirations are limited to 8 years. For commands with millisecond precision like PEXPIRE or PSETEX, +expirations greater than 2^28ms are quietly rounded to the nearest second loosing precision of less than 0.001%. ## Lua We use lua 5.4.4 that has been released in 2022. -That means we also support [lua integers](https://github.com/redis/redis/issues/5261). \ No newline at end of file +That means we also support [lua integers](https://github.com/redis/redis/issues/5261). diff --git a/src/server/common.h b/src/server/common.h index 7f7a0e836..f88c98199 100644 --- a/src/server/common.h +++ b/src/server/common.h @@ -22,7 +22,7 @@ namespace dfly { enum class ListDir : uint8_t { LEFT, RIGHT }; // Dependent on ExpirePeriod representation of the value. -constexpr int64_t kMaxExpireDeadlineSec = (1u << 27) - 1; +constexpr int64_t kMaxExpireDeadlineSec = (1u << 28) - 1; using DbIndex = uint16_t; using ShardId = uint16_t; diff --git a/src/server/generic_family_test.cc b/src/server/generic_family_test.cc index 05926b723..2f038cf55 100644 --- a/src/server/generic_family_test.cc +++ b/src/server/generic_family_test.cc @@ -30,8 +30,12 @@ class GenericFamilyTest : public BaseFamilyTest {}; TEST_F(GenericFamilyTest, Expire) { Run({"set", "key", "val"}); - auto resp = Run({"expire", "key", "1"}); + // sideqik expiry limit + auto resp = Run({"expire", "key", absl::StrCat(5 * 365 * 24 * 3600)}); + EXPECT_THAT(resp, IntArg(1)); + + resp = Run({"expire", "key", "1"}); EXPECT_THAT(resp, IntArg(1)); AdvanceTime(1000); resp = Run({"get", "key"}); diff --git a/src/server/string_family.cc b/src/server/string_family.cc index d3f906318..73584af97 100644 --- a/src/server/string_family.cc +++ b/src/server/string_family.cc @@ -1040,7 +1040,7 @@ void StringFamily::SetExGeneric(bool seconds, CmdArgList args, ConnectionContext return (*cntx)->SendError(kInvalidIntErr); } - if (unit_vals < 1) { + if (unit_vals < 1 || unit_vals >= kMaxExpireDeadlineSec) { ToLower(&args[0]); return (*cntx)->SendError(InvalidExpireTime(ArgS(args, 0))); } diff --git a/src/server/string_family_test.cc b/src/server/string_family_test.cc index 9a7c6052e..d38e4e837 100644 --- a/src/server/string_family_test.cc +++ b/src/server/string_family_test.cc @@ -362,6 +362,8 @@ TEST_F(StringFamilyTest, SetEx) { ASSERT_EQ(Run({"setex", "key", "10", "val"}), "OK"); ASSERT_THAT(Run({"ttl", "key"}), IntArg(10)); ASSERT_THAT(Run({"setex", "key", "0", "val"}), ErrArg("invalid expire time")); + ASSERT_EQ(Run({"setex", "key", StrCat(5 * 365 * 24 * 3600), "val"}), "OK"); + ASSERT_THAT(Run({"setex", "key", StrCat(1 << 30), "val"}), ErrArg("invalid expire time")); } TEST_F(StringFamilyTest, Range) {