]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: Add a paramter:purge_on_error in ImageCtx::invalidate_cache(). 5767/head
authorJianpeng Ma <jianpeng.ma@intel.com>
Mon, 9 Mar 2015 06:23:23 +0000 (14:23 +0800)
committerLoic Dachary <ldachary@redhat.com>
Sun, 6 Sep 2015 12:07:55 +0000 (14:07 +0200)
If bh_write met error, it will try again. For closing image, if met this
issue, it will trigger a assert:
>>2015-02-03 15:22:49.198292 7ff62d537800 -1 osdc/ObjectCacher.cc: In
function 'ObjectCacher::~ObjectCacher()' thread 7ff62d537800 time
>>2015-02-03 15:22:49.195927osdc/ObjectCacher.cc: 551: FAILED
>>assert(i->empty())

Now add purge_on_error, when shutdown_cache it set true.
In ImageCtx::invalidate_cache, if met error and purge_on_error is true,
purge the dirty bh.

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
(cherry picked from commit 35def5c81f7fc83d55d18320e4860c6a63d4c7f5)

Conflicts:
src/librbd/ImageCtx.cc : trivial resolution

src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h

index ebdd184616bdbe6a519f00053df47dc70fdb1dbe..0f5d46a56f468132a25e5f80dae9ccc9f22298c1 100644 (file)
@@ -683,14 +683,26 @@ public:
     flush_async_operations();
 
     RWLock::RLocker owner_locker(owner_lock);
-    invalidate_cache();
+    invalidate_cache(true);
     object_cacher->stop();
   }
 
-  int ImageCtx::invalidate_cache() {
+  int ImageCtx::invalidate_cache(bool purge_on_error) {
+    int result;
     C_SaferCond ctx;
     invalidate_cache(&ctx);
-    return ctx.wait();
+    result = ctx.wait();
+
+    if (result && purge_on_error) {
+      cache_lock.Lock();
+      if (object_cacher != NULL) {
+       lderr(cct) << "invalidate cache met error " << cpp_strerror(result) << " !Purging cache..." << dendl;
+       object_cacher->purge_set(object_set);
+      }
+      cache_lock.Unlock();
+    }
+
+    return result;
   }
 
   void ImageCtx::invalidate_cache(Context *on_finish) {
index 1022474e8a5b7a689154e345f1d0aaa3ff93cd73..238b0ab6bd85775dc972207df627d2d316c51f32 100644 (file)
@@ -195,7 +195,7 @@ namespace librbd {
     void flush_cache_aio(Context *onfinish);
     int flush_cache();
     void shutdown_cache();
-    int invalidate_cache();
+    int invalidate_cache(bool purge_on_error=false);
     void invalidate_cache(Context *on_finish);
     void invalidate_cache_completion(int r, Context *on_finish);
     void clear_nonexistence_cache();