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

ofd_create_hdl returns 0 instead of ENOSPC causing ESTALE on MDS

Details

    • 3
    • 9223372036854775807

    Description

       

      During code analysis I found that LU-6401 brakes ENOSPC handling logic in OSP. 

      osp_precreate_send() returns -ESTALE when OST can't precreate objects i.e. -ENOSPACE:

              if (osp_fid_diff(fid, &d->opd_pre_used_fid) <= 0) {
                      CERROR("%s: precreate fid "DFID" < local used fid "DFID": rc = %d\n", d->opd_obd->obd_name,
                             PFID(fid), PFID(&d->opd_pre_used_fid), -ESTALE);
                      GOTO(out_req, rc = -ESTALE);
              }
      

      However it is not correct. In case of -ENOSPC on OST, MDS should get -ENOSPC.
      For example osp_precreat_reserve() forces local commit to release space and waits for OBD_TIMEOUT.
      I think "LU-6401 uapi: fix up lustre_ostid.h and lustre_fid.h" broke this logic:

      @@ -1781,7 +1781,7 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
                               granted = 0;
                       }
       
      -                ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
      +                rc = ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
               }
               EXIT;
      

      After the patch OST returns 0 in case when osp_precreate_objects() returns -ENOSPC.
       

      Attachments

        Issue Links

          Activity

            [LU-11536] ofd_create_hdl returns 0 instead of ENOSPC causing ESTALE on MDS
            ys Yang Sheng made changes -
            Link New: This issue is related to LCZ-7 [ LCZ-7 ]
            mdiep Minh Diep made changes -
            Labels Original: LTS
            mdiep Minh Diep made changes -
            Fix Version/s New: Lustre 2.10.7 [ 14401 ]
            pjones Peter Jones made changes -
            Link New: This issue is related to JFC-17 [ JFC-17 ]
            pjones Peter Jones made changes -
            Link New: This issue is duplicated by CAM-72 [ CAM-72 ]
            pjones Peter Jones made changes -
            Fix Version/s New: Lustre 2.12.0 [ 13495 ]
            Resolution New: Fixed [ 1 ]
            Status Original: Open [ 1 ] New: Resolved [ 5 ]
            adilger Andreas Dilger made changes -
            Labels New: LTS
            adilger Andreas Dilger made changes -
            Description Original:  

            During code analysis I found that LU-6401 brakes ENOSPC handling logic in OSP. 

            osp_precreate_send returns ESTALE when OST can't precreate objects i.e. ENOSPACE:
            {noformat}
             if (osp_fid_diff(fid, &d->opd_pre_used_fid) <= 0) {
             CERROR("%s: precreate fid "DFID" < local used fid "DFID
             ": rc = %d\n", d->opd_obd->obd_name,
             PFID(fid), PFID(&d->opd_pre_used_fid), -ESTALE);
             GOTO(out_req, rc = -ESTALE);
             }
            {noformat}
             However it is not correct. In case of ENOSPC on OST MDS should get ENOSPC.
            For example osp_precreat_reserve forces local commit to release space and waits for OBD_TIMEOUT.
            I think "LU-6401 uapi: fix up lustre_ostid.h and lustre_fid.h" broke this logic:
            {noformat}
            @@ -1781,7 +1781,7 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
             granted = 0;
             }
             
            - ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
            + rc = ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
             }
             EXIT;{noformat}
            After the patch OST returns 0 in case when osp_precreate_objects returns -28.
             
            New:  

            During code analysis I found that LU-6401 brakes ENOSPC handling logic in OSP. 

            {{osp_precreate_send()}} returns {{-ESTALE}} when OST can't precreate objects i.e. {{-ENOSPACE}}:
            {noformat}
                    if (osp_fid_diff(fid, &d->opd_pre_used_fid) <= 0) {
                            CERROR("%s: precreate fid "DFID" < local used fid "DFID": rc = %d\n", d->opd_obd->obd_name,
                                   PFID(fid), PFID(&d->opd_pre_used_fid), -ESTALE);
                            GOTO(out_req, rc = -ESTALE);
                    }
            {noformat}
            However it is not correct. In case of {{-ENOSPC}} on OST, MDS should get {{-ENOSPC}}.
             For example {{osp_precreat_reserve()}} forces local commit to release space and waits for {{OBD_TIMEOUT}}.
             I think "{{LU-6401 uapi: fix up lustre_ostid.h and lustre_fid.h"}} broke this logic:
            {noformat}
            @@ -1781,7 +1781,7 @@ static int ofd_create_hdl(struct tgt_session_info *tsi)
                                     granted = 0;
                             }
             
            - ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
            + rc = ostid_set_id(&rep_oa->o_oi, ofd_seq_last_oid(oseq));
                     }
                     EXIT;
            {noformat}
            After the patch OST returns 0 in case when {{osp_precreate_objects()}} returns {{-ENOSPC}}.
              
            adilger Andreas Dilger made changes -
            Link New: This issue is duplicated by LU-11588 [ LU-11588 ]
            pjones Peter Jones made changes -
            Assignee Original: WC Triage [ wc-triage ] New: Sergey Cheremencev [ scherementsev ]

            People

              scherementsev Sergey Cheremencev
              scherementsev Sergey Cheremencev
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: