Skip to content

Commit

Permalink
cls/rbd: GroupSnapshotNamespace comparator violates ordering rules
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
idryomov committed Feb 14, 2022
1 parent 481093b commit 830e72a
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions src/cls/rbd/cls_rbd_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
};

Expand Down

0 comments on commit 830e72a

Please sign in to comment.