diff options
-rw-r--r-- | tests/bugs/bug-978794.t | 29 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 5 |
2 files changed, 33 insertions, 1 deletions
diff --git a/tests/bugs/bug-978794.t b/tests/bugs/bug-978794.t new file mode 100644 index 000000000..d22d3cde3 --- /dev/null +++ b/tests/bugs/bug-978794.t @@ -0,0 +1,29 @@ +#!/bin/bash +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc +. $(dirname $0)/../fileio.rc + + +# This test opens 100 fds and triggers graph switches to check if fsync +# as part of graph-switch causes crash or not. + +cleanup; + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{0,1} +TEST $CLI volume start $V0 +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 +TEST touch $M0/{1..100} +for i in {1..100}; do fd[$i]=`fd_available`; fd_open ${fd[$i]} 'w' $M0/$i; done +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{2,3} +TEST $CLI volume rebalance $V0 start force +EXPECT_WITHIN 120 "completed" rebalance_status_field $V0 +TEST cat $M0/{1..100} +for i in {1..100}; do fd_write ${fd[$i]} 'abc'; done +TEST $CLI volume add-brick $V0 $H0:$B0/${V0}{4,5} +TEST $CLI volume rebalance $V0 start force +EXPECT_WITHIN 120 "completed" rebalance_status_field $V0 +for i in {1..100}; do fd_write ${fd[$i]} 'abc'; done +TEST cat $M0/{1..100} +cleanup diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 8f3673ace..0ae4fe477 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -1402,6 +1402,8 @@ afr_fd_has_witnessed_unstable_write (xlator_t *this, fd_t *fd) gf_boolean_t witness = _gf_false; fdctx = afr_fd_ctx_get (fd, this); + if (!fdctx) + return _gf_true; LOCK(&fd->lock); { @@ -1568,7 +1570,7 @@ afr_delayed_changelog_post_op (xlator_t *this, call_frame_t *frame, fd_t *fd, fd_ctx = afr_fd_ctx_get (fd, this); if (!fd_ctx) - return; + goto out; delta.tv_sec = priv->post_op_delay_secs; delta.tv_usec = 0; @@ -1590,6 +1592,7 @@ afr_delayed_changelog_post_op (xlator_t *this, call_frame_t *frame, fd_t *fd, unlock: pthread_mutex_unlock (&fd_ctx->delay_lock); +out: if (prev_frame) { local = prev_frame->local; local->transaction.resume_stub = stub; |