summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Durgin <josh.durgin@inktank.com>2013-01-04 13:37:29 -0800
committerJosh Durgin <josh.durgin@inktank.com>2013-01-04 13:37:36 -0800
commit6a3d475cf08eb3051e8cdbce10b17b53c92b9cb5 (patch)
tree473c2a3796be530956382e3c721fc4256f491ca0
parentf1e0305f0d2c31aa38f417a5f22eef34a7ec1511 (diff)
parentc4370ff03f8ab655a009cfd9ba3a0827d8c58b11 (diff)
downloadceph-6a3d475cf08eb3051e8cdbce10b17b53c92b9cb5.tar.gz
Merge remote branch 'origin/wip-rbd-watch'
Reviewed-by: Dan Mick <dan.mick@inktank.com>
-rwxr-xr-xqa/workunits/rbd/watch_correct_version.sh31
-rw-r--r--src/librbd/ImageCtx.cc16
-rw-r--r--src/librbd/ImageCtx.h2
-rw-r--r--src/librbd/internal.cc26
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)