diff options
author | Josh Durgin <josh.durgin@inktank.com> | 2013-01-04 13:37:29 -0800 |
---|---|---|
committer | Josh Durgin <josh.durgin@inktank.com> | 2013-01-04 13:37:36 -0800 |
commit | 6a3d475cf08eb3051e8cdbce10b17b53c92b9cb5 (patch) | |
tree | 473c2a3796be530956382e3c721fc4256f491ca0 | |
parent | f1e0305f0d2c31aa38f417a5f22eef34a7ec1511 (diff) | |
parent | c4370ff03f8ab655a009cfd9ba3a0827d8c58b11 (diff) | |
download | ceph-6a3d475cf08eb3051e8cdbce10b17b53c92b9cb5.tar.gz |
Merge remote branch 'origin/wip-rbd-watch'
Reviewed-by: Dan Mick <dan.mick@inktank.com>
-rwxr-xr-x | qa/workunits/rbd/watch_correct_version.sh | 31 | ||||
-rw-r--r-- | src/librbd/ImageCtx.cc | 16 | ||||
-rw-r--r-- | src/librbd/ImageCtx.h | 2 | ||||
-rw-r--r-- | src/librbd/internal.cc | 26 |
4 files changed, 15 insertions, 60 deletions
diff --git a/qa/workunits/rbd/watch_correct_version.sh b/qa/workunits/rbd/watch_correct_version.sh deleted file mode 100755 index 602cf619b67..00000000000 --- a/qa/workunits/rbd/watch_correct_version.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -ex - -resize_image() { - for i in $(seq 1 1000) - do - rbd resize --size $i test - done -} - -rm -f test.exported || true -rbd rm test || true -rbd create -s 1 --order 25 test -resize_image & - -for i in $(seq 1 1000) -do - rbd export test test.exported --debug-rbd 20 2>export.log - rm -f test.exported - MATCHED=`cat export.log | tr -d '\n' | (grep -c 'watching header object returned -34.*watching header object returned 0' || true)` - rm -f export.log - if [ "$MATCHED" == "1" ] - then - echo OK - exit 0 - fi -done -rbd rm test - -echo "No race detected" -echo OK -exit 0 diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 80f19d23550..7a44a6a53e8 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -39,7 +39,6 @@ namespace librbd { wctx(NULL), refresh_seq(0), last_refresh(0), - last_header_version(0), md_lock("librbd::ImageCtx::md_lock"), cache_lock("librbd::ImageCtx::cache_lock"), snap_lock("librbd::ImageCtx::snap_lock"), @@ -556,20 +555,7 @@ namespace librbd { int ImageCtx::register_watch() { assert(!wctx); wctx = new WatchCtx(this); - - int r = 0; - do { - md_lock.Lock(); - if (r == -ERANGE) - ictx_refresh(this); - uint64_t last_read = last_header_version; - md_lock.Unlock(); - - md_ctx.set_assert_version(last_read); - r = md_ctx.watch(header_oid, 0, &(wctx->cookie), wctx); - ldout(cct, 20) << "watching header object returned " << r << dendl; - } while (r == -ERANGE); - return r; + return md_ctx.watch(header_oid, 0, &(wctx->cookie), wctx); } void ImageCtx::unregister_watch() { diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index bd0ba87862c..ed03846fcde 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -54,8 +54,6 @@ namespace librbd { WatchCtx *wctx; int refresh_seq; ///< sequence for refresh requests int last_refresh; ///< last completed refresh - uint64_t last_header_version; ///< last version of the header object - ///< read from librados /** * Lock ordering: diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index ee8966cb40e..0b788136b0d 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1601,7 +1601,6 @@ reprotect_and_return_err: lderr(cct) << "Error reading header: " << cpp_strerror(r) << dendl; return r; } - ictx->last_header_version = ictx->md_ctx.get_last_version(); r = cls_client::old_snapshot_list(&ictx->md_ctx, ictx->header_oid, &snap_names, &snap_sizes, &new_snapc); if (r < 0) { @@ -1639,7 +1638,6 @@ reprotect_and_return_err: << dendl; return r; } - ictx->last_header_version = ictx->md_ctx.get_last_version(); uint64_t unsupported = incompatible_features & ~RBD_FEATURES_ALL; if (unsupported) { @@ -1915,25 +1913,29 @@ reprotect_and_return_err: if (r < 0) return r; - ictx->md_lock.Lock(); - r = ictx_refresh(ictx); - ictx->md_lock.Unlock(); - if (r < 0) - return r; - - _snap_set(ictx, ictx->snap_name.c_str()); - if (!ictx->read_only) { r = ictx->register_watch(); if (r < 0) { lderr(ictx->cct) << "error registering a watch: " << cpp_strerror(r) << dendl; - close_image(ictx); - return r; + goto err_close; } } + ictx->md_lock.Lock(); + r = ictx_refresh(ictx); + ictx->md_lock.Unlock(); + if (r < 0) + goto err_close; + + if ((r = _snap_set(ictx, ictx->snap_name.c_str())) < 0) + goto err_close; + return 0; + + err_close: + close_image(ictx); + return r; } void close_image(ImageCtx *ictx) |