diff options
| -rw-r--r-- | tests/bugs/bitrot/bug-1227996.t | 58 | ||||
| -rw-r--r-- | xlators/features/bit-rot/src/stub/bit-rot-stub.c | 11 | 
2 files changed, 66 insertions, 3 deletions
diff --git a/tests/bugs/bitrot/bug-1227996.t b/tests/bugs/bitrot/bug-1227996.t new file mode 100644 index 00000000000..47ebc4235cf --- /dev/null +++ b/tests/bugs/bitrot/bug-1227996.t @@ -0,0 +1,58 @@ +#!/bin/bash + +## Test case for bitrot +## Tunable object signing waiting time value for bitrot. + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../cluster.rc + +SLEEP_TIME=3 + +cleanup; +## Start glusterd +TEST glusterd; +TEST pidof glusterd; + +## Lets create and start the volume +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 +TEST $CLI volume start $V0 + +## Enable bitrot on volume $V0 +TEST $CLI volume bitrot $V0 enable + +EXPECT_WITHIN $PROCESS_UP_TIMEOUT "1" get_bitd_count + +# wait a bit for oneshot crawler to finish +sleep $SLEEP_TIME + +## Set object expiry time value +TEST $CLI volume bitrot $V0 signing-time $SLEEP_TIME + +## Mount the volume +TEST $GFS --volfile-server=$H0 --volfile-id=$V0 $M0; + +# create and check object signature +fname="$M0/filezero" +echo "ZZZ" > $fname + +# wait till the object is signed +sleep `expr $SLEEP_TIME \* 2` + +backpath=$(get_backend_paths $fname) +TEST getfattr -m . -n trusted.bit-rot.signature $backpath + +## for now just remove the signature xattr to test for signing +## upon truncate() +TEST setfattr -x trusted.bit-rot.signature $backpath + +## overwrite the file (truncate(), write()) +echo "XYX" > $fname + +# wait till the object is signed +sleep `expr $SLEEP_TIME \* 2` + +# test for new signature +TEST getfattr -m . -n trusted.bit-rot.signature $backpath + +cleanup; diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.c b/xlators/features/bit-rot/src/stub/bit-rot-stub.c index 69e326b17e1..4f0605da0c4 100644 --- a/xlators/features/bit-rot/src/stub/bit-rot-stub.c +++ b/xlators/features/bit-rot/src/stub/bit-rot-stub.c @@ -1434,6 +1434,9 @@ int32_t  br_stub_truncate_resume (call_frame_t *frame, xlator_t *this, loc_t *loc,                            off_t offset, dict_t *xdata)  { +        br_stub_local_t *local = frame->local; + +        fd_unref (local->u.context.fd);          STACK_WIND (frame, br_stub_ftruncate_cbk, FIRST_CHILD(this),                      FIRST_CHILD(this)->fops->truncate, loc, offset, xdata);          return 0; @@ -1482,14 +1485,14 @@ br_stub_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc,          ret = br_stub_need_versioning (this, fd, &inc_version, &modified, &ctx);          if (ret) -                goto unwind; +                goto cleanup_fd;          if (!inc_version && modified)                  goto wind;          ret = br_stub_versioning_prep (frame, this, fd, ctx);          if (ret) -                goto unwind; +                goto cleanup_fd;          local = frame->local;          if (!inc_version) { @@ -1513,12 +1516,14 @@ br_stub_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc,   wind:          STACK_WIND (frame, cbk, FIRST_CHILD(this),                      FIRST_CHILD(this)->fops->truncate, loc, offset, xdata); +        fd_unref (fd);          return 0;   cleanup_local:          br_stub_cleanup_local (local);          br_stub_dealloc_local (local); - + cleanup_fd: +        fd_unref (fd);   unwind:          frame->local = NULL;          STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno, NULL, NULL,  | 
