Whamcloud - gitweb
LU-17933 target: do not break grants on RPC failure 47/56547/5
authorVladimir Saveliev <vladimir.saveliev@hpe.com>
Wed, 12 Mar 2025 10:13:43 +0000 (13:13 +0300)
committerOleg Drokin <green@whamcloud.com>
Fri, 2 May 2025 02:17:42 +0000 (02:17 +0000)
commitdf2b5d99adfc6117a327f8e9102ba30076253213
tree1376b649e16c7f89fe11f82f2f16365cad05ac86
parenta2e3a2f5a3a891fc3fed391023b3cdb65af2d427
LU-17933 target: do not break grants on RPC failure

When write RPC fails it may leave grant accounting inaccurate.
Grants are allocated in:
  tgt_brw_write
    obd_preprw
      ofd_preprw
        ofd_preprw_write
          tgt_grant_prepare_write
            oa->o_grant = tgt_grant_alloc()
              tgd->tgd_tot_granted += grant;
              ted->ted_grant += grant;
              return grant;
If further it happens to return error, oa->o_grant is zeroed:
  ofd_preprw_write
    ..
  out:
    tgt_grant_prepare_read
      oa->o_grant = 0;

This results in a mismatch between grants owned by a client and grants
the server thinks the client owns.

Clients used to skip grant accounting update in case of write RPC
failure:
ptlrpc_req_interpret
  brw_interpret
    osc_brw_fini_request
      if (rc < 0 && rc != -EDQUOT)
        return rc
     osc_update_grant
       __osc_update_grant(cli, body->oa.o_grant)

Have server to take care of correct grant accounting in case of RPC
failure.

Test to illustrate the issue is added. This test needs zero lost
grants. Sync write on start is to get rid of those.

Signed-off-by: Vladimir Saveliev <vladimir.saveliev@hpe.com>
Change-Id: Ic835eb0b7f1894207637ec541b1d39c59bde286d
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56547
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Alexander Boyko <alexander.boyko@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/include/lu_target.h
lustre/include/obd_support.h
lustre/mdt/mdt_io.c
lustre/ofd/ofd_io.c
lustre/target/tgt_grant.c
lustre/tests/sanity.sh