From: Jason Dillaman Date: Fri, 27 Oct 2017 13:57:43 +0000 (-0400) Subject: cls/journal: fixed possible infinite loop in expire_tags X-Git-Tag: v13.0.1~380^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9e66dca49591e50b9cab5df311f1dc217eb58fcc;p=ceph.git cls/journal: fixed possible infinite loop in expire_tags Fixes: http://tracker.ceph.com/issues/21956 Signed-off-by: Jason Dillaman --- diff --git a/src/cls/journal/cls_journal.cc b/src/cls/journal/cls_journal.cc index 091fac1feef1..e8646116e981 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 29bf4250faa8..9df173d62027 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));