Skip to content

Commit 32f15b4

Browse files
committed
fix(set_family): Transfer TTL flag from link to object in delete
When extracting DensePtr from LinkObject we need to transfer TTL flag before this DensePtr is assigned. Fixes #3915 Signed-off-by: mkaruza <[email protected]>
1 parent 95147fb commit 32f15b4

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

src/core/dense_set.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,8 @@ void DenseSet::Delete(DensePtr* prev, DensePtr* ptr) {
648648

649649
DenseLinkKey* plink = prev->AsLink();
650650
DensePtr tmp = DensePtr::From(plink);
651+
// Transfer TTL flag
652+
tmp.SetTtl(prev->HasTtl());
651653
DCHECK(ObjectAllocSize(tmp.GetObject()));
652654

653655
FreeLink(plink);

src/core/string_set_test.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,4 +767,16 @@ TEST_F(StringSetTest, ReallocIfNeeded) {
767767
EXPECT_EQ(*ss_->Find(build_str(i * 10)), build_str(i * 10));
768768
}
769769

770+
TEST_F(StringSetTest, TransferTTLFlagLinkToObjectOnDelete) {
771+
for (size_t i = 0; i < 10; i++) {
772+
EXPECT_TRUE(ss_->Add(absl::StrCat(i), 1));
773+
}
774+
for (size_t i = 0; i < 9; i++) {
775+
EXPECT_TRUE(ss_->Erase(absl::StrCat(i)));
776+
}
777+
auto it = ss_->Find("9"sv);
778+
EXPECT_TRUE(it.HasExpiry());
779+
EXPECT_EQ(1u, it.ExpiryTime());
780+
}
781+
770782
} // namespace dfly

src/server/set_family_test.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,4 +412,17 @@ TEST_F(SetFamilyTest, SAddEx) {
412412
EXPECT_THAT(Run({"saddex", "key", "KEEPTTL", "2"}), ErrArg("wrong number of arguments"));
413413
}
414414

415+
TEST_F(SetFamilyTest, CheckSetLinkExpiryTransfer) {
416+
for (int i = 0; i < 10; i++) {
417+
EXPECT_THAT(Run({"SADDEX", "key", "5", absl::StrCat(i)}), IntArg(1));
418+
}
419+
for (int i = 0; i < 9; i++) {
420+
Run({"SREM", "key", absl::StrCat(i)});
421+
}
422+
EXPECT_THAT(Run({"SCARD", "key"}), IntArg(1));
423+
AdvanceTime(6000);
424+
Run({"SMEMBERS", "key"});
425+
EXPECT_THAT(Run({"SCARD", "key"}), IntArg(0));
426+
}
427+
415428
} // namespace dfly

0 commit comments

Comments
 (0)