From: Ilya Dryomov Date: Mon, 14 Feb 2022 12:04:00 +0000 (+0100) Subject: cls/rbd: GroupSnapshotNamespace comparator violates ordering rules X-Git-Tag: v18.0.0~1374^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=830e72ab9d66c8f5703ea27da5249b02dd16ccd0;p=ceph.git 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 --- diff --git a/src/cls/rbd/cls_rbd_types.h b/src/cls/rbd/cls_rbd_types.h index 3e7ca77fa87c..645861b2d8fd 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; } };