Details
-
Bug
-
Resolution: Fixed
-
Critical
-
Lustre 2.7.0
-
None
-
3
-
9223372036854775807
Description
t seems osd_id_map is not safe to use right now. So the pair of [FID, OID] is added to cache after lookup, but if another thread delete the object, it will only invalidate the cache in its own thread info.
int osd_oi_delete(struct osd_thread_info *info, struct osd_device *osd, const struct lu_fid *fid, handle_t *th, enum oi_check_flags flags) { struct lu_fid *oi_fid = &info->oti_fid2; /* clear idmap cache */ if (lu_fid_eq(fid, &info->oti_cache.oic_fid)) fid_zero(&info->oti_cache.oic_fid); ..............
And other threads can still get the OID from the cache, and if the inode has been reused by other object, then we will see bunch of
Lustre: lustre-MDT0003-osd: FID [0x2c0000404:0x1f34:0x0] != self_fid [0x2c0000404:0x281c:0x0]
Unfortunately, it will also trigger osd-scrub in this case, this is what I saw in the DNE2 failover test.