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