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 <jianpeng.ma@intel.com>
This commit is contained in:
Jianpeng Ma 2015-03-09 14:23:23 +08:00
parent 101440a412
commit 35def5c81f
2 changed files with 16 additions and 4 deletions

View File

@ -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) {

View File

@ -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();