From 830e72ab9d66c8f5703ea27da5249b02dd16ccd0 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Mon, 14 Feb 2022 13:04:00 +0100 Subject: [PATCH] cls/rbd: GroupSnapshotNamespace comparator violates ordering rules For GroupSnapshotNamespace a(1, "group-1", "snap-2"); GroupSnapshotNamespace b(1, "group-2", "snap-1"); both a < b and b < a evaluate to true. This violates STL strict weak ordering requirements which is a problem because GroupSnapshotNamespace is used as a key in std::map (ictx->snap_ids at least), etc. Fixes: https://tracker.ceph.com/issues/49792 Signed-off-by: Ilya Dryomov --- src/cls/rbd/cls_rbd_types.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/cls/rbd/cls_rbd_types.h b/src/cls/rbd/cls_rbd_types.h index 3e7ca77fa87c0..645861b2d8fd7 100644 --- a/src/cls/rbd/cls_rbd_types.h +++ b/src/cls/rbd/cls_rbd_types.h @@ -475,14 +475,13 @@ struct GroupSnapshotNamespace { } inline bool operator<(const GroupSnapshotNamespace& gsn) const { - if (group_pool < gsn.group_pool) { - return true; - } else if (group_id < gsn.group_id) { - return true; - } else { - return (group_snapshot_id < gsn.group_snapshot_id); + if (group_pool != gsn.group_pool) { + return group_pool < gsn.group_pool; } - return false; + if (group_id != gsn.group_id) { + return group_id < gsn.group_id; + } + return group_snapshot_id < gsn.group_snapshot_id; } }; -- 2.39.5