Skip to content

Commit 4b0676c

Browse files
mkaruzaromange
authored andcommitted
fix(set_family): Transfer TTL flag from DenseLink object in delete (#4947)
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 cac8da7 commit 4b0676c

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
@@ -633,6 +633,8 @@ void DenseSet::Delete(DensePtr* prev, DensePtr* ptr) {
633633

634634
DenseLinkKey* plink = prev->AsLink();
635635
DensePtr tmp = DensePtr::From(plink);
636+
// Transfer TTL flag
637+
tmp.SetTtl(prev->HasTtl());
636638
DCHECK(ObjectAllocSize(tmp.GetObject()));
637639

638640
FreeLink(plink);

src/core/string_set_test.cc

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

709+
TEST_F(StringSetTest, TransferTTLFlagLinkToObjectOnDelete) {
710+
for (size_t i = 0; i < 10; i++) {
711+
EXPECT_TRUE(ss_->Add(absl::StrCat(i), 1));
712+
}
713+
for (size_t i = 0; i < 9; i++) {
714+
EXPECT_TRUE(ss_->Erase(absl::StrCat(i)));
715+
}
716+
auto it = ss_->Find("9"sv);
717+
EXPECT_TRUE(it.HasExpiry());
718+
EXPECT_EQ(1u, it.ExpiryTime());
719+
}
720+
709721
} // 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)