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