From 35def5c81f7fc83d55d18320e4860c6a63d4c7f5 Mon Sep 17 00:00:00 2001 From: Jianpeng Ma Date: Mon, 9 Mar 2015 14:23:23 +0800 Subject: [PATCH] librbd: Add a paramter:purge_on_error in ImageCtx::invalidate_cache(). 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 --- src/librbd/ImageCtx.cc | 18 +++++++++++++++--- src/librbd/ImageCtx.h | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index befb452ea459..9f4b006a3747 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -616,14 +616,26 @@ namespace librbd { void ImageCtx::shutdown_cache() { flush_async_operations(); - 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) { diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index 21ae7a051866..b805199179c0 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -187,7 +187,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(); -- 2.47.3