From 6b75efab390b3019e404f007090e9031328e1301 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 27 Oct 2017 09:57:43 -0400 Subject: [PATCH] cls/journal: fixed possible infinite loop in expire_tags Fixes: http://tracker.ceph.com/issues/21956 Signed-off-by: Jason Dillaman (cherry picked from commit 9e66dca49591e50b9cab5df311f1dc217eb58fcc) --- src/cls/journal/cls_journal.cc | 1 + src/test/cls_journal/test_cls_journal.cc | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/cls/journal/cls_journal.cc b/src/cls/journal/cls_journal.cc index dfcba9813a3a3..2f1d18d0d79c8 100644 --- a/src/cls/journal/cls_journal.cc +++ b/src/cls/journal/cls_journal.cc @@ -188,6 +188,7 @@ int expire_tags(cls_method_context_t hctx, const std::string *skip_client_id) { if (tag.tid >= minimum_tag_tid) { // no need to check for tag classes beyond this point vals.clear(); + more = false; break; } } diff --git a/src/test/cls_journal/test_cls_journal.cc b/src/test/cls_journal/test_cls_journal.cc index d9cdb6b7754f1..7d948c976e62d 100644 --- a/src/test/cls_journal/test_cls_journal.cc +++ b/src/test/cls_journal/test_cls_journal.cc @@ -322,15 +322,21 @@ TEST_F(TestClsJournal, ClientUnregisterPruneTags) { bufferlist())); ASSERT_EQ(0, client::tag_create(ioctx, oid, 1, Tag::TAG_CLASS_NEW, bufferlist())); - ASSERT_EQ(0, client::tag_create(ioctx, oid, 2, 1, bufferlist())); + + for (uint32_t i = 2; i <= 96; ++i) { + ASSERT_EQ(0, client::tag_create(ioctx, oid, i, 1, bufferlist())); + } librados::ObjectWriteOperation op1; - client::client_commit(&op1, "id1", {{{1, 2, 120}}}); + client::client_commit(&op1, "id1", {{{1, 32, 120}}}); ASSERT_EQ(0, ioctx.operate(oid, &op1)); ASSERT_EQ(0, client::client_unregister(ioctx, oid, "id2")); - std::set expected_tags = {{0, 0, {}}, {2, 1, {}}}; + std::set expected_tags = {{0, 0, {}}}; + for (uint32_t i = 32; i <= 96; ++i) { + expected_tags.insert({i, 1, {}}); + } std::set tags; ASSERT_EQ(0, client::tag_list(ioctx, oid, "id1", boost::optional(), &tags)); -- 2.39.5