Uploaded image for project: 'Lustre'
  1. Lustre
  2. LU-15491

rename deadlock

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Critical Critical
    • Lustre 2.16.0
    • Lustre 2.15.0
    • None
    • 3
    • 9223372036854775807

      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

            hongchao.zhang Hongchao Zhang
            green Oleg Drokin
            Votes:
            0 Vote for this issue
            Watchers:
            12 Start watching this issue

              Created:
              Updated:
              Resolved: