Whamcloud - gitweb
LU-15107 mdt: Exclusive create isn't replayed 54/45254/6
authorAndriy Skulysh <c17819@cray.com>
Wed, 16 Sep 2020 11:38:41 +0000 (14:38 +0300)
committerOleg Drokin <green@whamcloud.com>
Sun, 21 Nov 2021 20:51:48 +0000 (20:51 +0000)
mdt_finish_open() fails on exclusive create check as
there isn't an infrormation that the file was created.

Set DISP_OPEN_CREATE for exclusive open replay,
as we know that the original request has succeeded.

Change-Id: Idc71db76b757670b91b3bb1718870a018a805ed2
HPE-bug-id: LUS-9358
Signed-off-by: Andriy Skulysh <c17819@cray.com>
Reviewed-by: Vitaly Fertman <c17818@cray.com>
Reviewed-by: Alexander Zarochentsev <c17826@cray.com>
Reviewed-on: https://review.whamcloud.com/45254
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mdt/mdt_open.c
lustre/tests/replay-single.sh

index bc5ad6a..d59e92d 100644 (file)
@@ -780,6 +780,11 @@ static int mdt_open_by_fid(struct mdt_thread_info *info, struct ldlm_reply *rep)
                        mdt_set_disposition(info, rep, (DISP_IT_EXECD |
                                                        DISP_LOOKUP_EXECD |
                                                        DISP_LOOKUP_POS));
+                       if ((open_flags & MDS_OPEN_EXCL) &&
+                           (open_flags & MDS_OPEN_CREAT))
+                               mdt_set_disposition(info, rep,
+                                                   DISP_OPEN_CREATE);
+
                        mdt_prep_ma_buf_from_rep(info, o, ma);
                        rc = mdt_attr_get_complex(info, o, ma);
                        if (rc == 0)
index 8ff29c9..a2c290f 100755 (executable)
@@ -134,6 +134,23 @@ test_2d() {
 }
 run_test 2d "setdirstripe replay"
 
+test_2e() {
+       testid=$(echo $TESTNAME | tr '_' ' ')
+       #define OBD_FAIL_MDS_CLOSE_NET_REP       0x13b
+       do_facet $SINGLEMDS "$LCTL set_param fail_loc=0x8000013b"
+       openfile -f O_CREAT:O_EXCL $DIR/$tfile &
+       sleep 1
+       replay_barrier $SINGLEMDS
+       fail $SINGLEMDS
+       wait
+       $CHECKSTAT -t file $DIR/$tfile ||
+               error "$CHECKSTAT $DIR/$tfile attribute check failed"
+       dmesg | tac | sed "/$testid/,$ d" | \
+               grep "Open request replay failed with -17" &&
+               error "open replay failed" || true
+}
+run_test 2e "O_CREAT|O_EXCL create replay"
+
 test_3a() {
        local file=$DIR/$tfile
        replay_barrier $SINGLEMDS