Prematurely delted the bh which was in Tx state may lead the object can't
be closed before its writer of this bh callback. Thus if inode's ref call
put_inode decrease ref to zero and release inode's oset.An assert fail occur
beacuse the oset can't be emptied.
If gather.has_subs() is true, we can't call flush_set_callback() because
this would cause a double drop of FILE_CACHE | FILE_BUFFER.
Fixes:http://tracker.ceph.com/issues/23837
Signed-off-by: Guan yunfei <yunfei.guan@xtaotech.com>
(cherry picked from commit
07e3bceea78dc8ecd76abb1cafca5c9d1fde521e)
if (cct->_conf->client_oc) {
vector<ObjectExtent> ls;
Striper::file_to_extents(cct, in->ino, &in->layout, off, len, in->truncate_size, ls);
- objectcacher->discard_set(&in->oset, ls);
+ objectcacher->discard_writeback(&in->oset, ls, nullptr);
}
_schedule_invalidate_callback(in, off, len);
bh->bl.clear();
bh->set_nocache(true);
oc->mark_zero(bh);
- return;
+ // we should mark all Rx bh to zero
+ continue;
} else {
assert(bh->waitfor_read.empty());
}
if (gather.has_subs()) {
gather.set_finisher(new FunctionContext(
- [this, oset, was_dirty, on_finish](int) {
- _discard_finish(oset, was_dirty, on_finish);
+ [this, oset, on_finish](int) {
+ _discard_finish(oset, false, on_finish);
}));
gather.activate();
return;