Details
-
Bug
-
Resolution: Fixed
-
Critical
-
Lustre 2.15.0
-
None
-
3
-
9223372036854775807
Description
thread 1: mv dir1/10 dir2/10
thread 2: mv dir2/11 dir2/2
where dir1/10 is hardlink to dir2/2 and dir2/10 is hardlink to dir2/11
so thread 1 and thread2 try to take those locks in reverse order with the predictable result
This is reproduced with non-dne racer run here: http://testing.linuxhacker.ru:3333/lustre-reports/21289/testresults/racer-long-zfs-centos7_x86_64-centos7_x86_64-retry3/
deadlock report reports:
Deadlock! ungranted lock -- Lock: 0xffff8800a93f5b00/0x539a6d335586e266 (pid: 6606) Node: local, ns lustre-MDT0000 Resource: [0x200000401:0x9fd9:0x0].0 Req mode: EX, grant mode: --, read: 0, write: 1 Bits: 0x3 waits for granted lock -- Lock: 0xffff8800af61e1c0/0x539a6d335586e235 (pid: 14160) Node: local, ns lustre-MDT0000 Resource: [0x200000401:0x9fd9:0x0].0 Req mode: EX, grant mode: EX, read: 0, write: 1 Bits: 0x21 but holder is blocked waiting on another lock -- Lock: 0xffff880114890900/0x539a6d335586e258 (pid: 14160) Node: local, ns lustre-MDT0000 Resource: [0x200000401:0xa0b7:0x0].0 Req mode: EX, grant mode: --, read: 0, write: 1 Bits: 0x3 that is held by the first thread wanting the first lock in the chain -- Lock: 0xffff8800a93f61c0/0x539a6d335586e23c (pid: 6606) Node: local, ns lustre-MDT0000 Resource: [0x200000401:0xa0b7:0x0].0 Req mode: EX, grant mode: EX, read: 0, write: 1 Bits: 0x21 Deadlock! ungranted lock -- Lock: 0xffff880114890900/0x539a6d335586e258 (pid: 14160) Node: local, ns lustre-MDT0000 Resource: [0x200000401:0xa0b7:0x0].0 Req mode: EX, grant mode: --, read: 0, write: 1 Bits: 0x3 waits for granted lock -- Lock: 0xffff8800a93f61c0/0x539a6d335586e23c (pid: 6606) Node: local, ns lustre-MDT0000 Resource: [0x200000401:0xa0b7:0x0].0 Req mode: EX, grant mode: EX, read: 0, write: 1 Bits: 0x21 but holder is blocked waiting on another lock -- Lock: 0xffff8800a93f5b00/0x539a6d335586e266 (pid: 6606) Node: local, ns lustre-MDT0000 Resource: [0x200000401:0x9fd9:0x0].0 Req mode: EX, grant mode: --, read: 0, write: 1 Bits: 0x3 that is held by the first thread wanting the first lock in the chain -- Lock: 0xffff8800af61e1c0/0x539a6d335586e235 (pid: 14160) Node: local, ns lustre-MDT0000 Resource: [0x200000401:0x9fd9:0x0].0 Req mode: EX, grant mode: EX, read: 0, write: 1 Bits: 0x21
thread info for pid 6606 at 0xffff8800d3c6e000:
mti_rr = { rr_opcode = REINT_RENAME, rr_open_handle = 0x0, rr_lease_handle = 0x0, rr_fid1 = 0xffff880116b15000, rr_fid2 = 0xffff880116b15010, rr_name = { ln_name = 0xffff880116b15060 "10", ln_namelen = 2 }, rr_tgt_name = { ln_name = 0xffff880116b15068 "10", ln_namelen = 2 }, crash> p *(struct ll_fid *)0xffff880116b15000 $3 = { id = 8589935617, generation = 1, f_type = 0 } crash> p *(struct ll_fid *)0xffff880116b15010 $4 = { id = 8589935618, generation = 41273, f_type = 0 }
thread info for pid 14160 at 0xffff88010f554000
mti_rr = { rr_opcode = REINT_RENAME, rr_open_handle = 0x0, rr_lease_handle = 0x0, rr_fid1 = 0xffff880116b15c20, rr_fid2 = 0xffff880116b15c30, rr_name = { ln_name = 0xffff880116b15c80 "11", ln_namelen = 2 }, rr_tgt_name = { ln_name = 0xffff880116b15c88 "2", ln_namelen = 1 }, crash> p *(struct ll_fid *)0xffff880116b15c20 $6 = { id = 8589935617, generation = 1, f_type = 0 } crash> p *(struct ll_fid *)0xffff880116b15c30 $7 = { id = 8589935617, generation = 1, f_type = 0 }
And indeed in mdt_reint_rename() we see:
lock_ibits = MDS_INODELOCK_LOOKUP | MDS_INODELOCK_XATTR; rc = mdt_rename_source_lock(info, msrcdir, mold, lh_oldp, lh_rmt, lock_ibits, cos_incompat);
aka 0x21 lock bit for mold
lh_newp = &info->mti_lh[MDT_LH_NEW];
mdt_lock_reg_init(lh_newp, LCK_EX);
lock_ibits = MDS_INODELOCK_LOOKUP | MDS_INODELOCK_UPDATE;
... // skip remote check
rc = mdt_reint_object_lock(info, mnew, lh_newp, lock_ibits,
cos_incompat);
aka 0x3 lock bit
vmcore is available in the report (the server one) if you want to marvel at the coincidence