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 <idryomov@gmail.com>
This commit is contained in:
Ilya Dryomov 2022-02-14 13:04:00 +01:00
parent 481093b7f6
commit 830e72ab9d

View File

@ -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;
}
};