scrub_info();
scrub_infop->scrub_in_progress = true;
- scrub_infop->uninline_in_progress = true;
+ scrub_infop->uninline_in_progress = false;
scrub_infop->queued_frags.clear();
scrub_infop->header = header;
header->inc_num_pending();
// right now we don't handle remote inodes
}
+void CInode::uninline_initialize()
+{
+ dout(20) << __func__ << " with scrub_version " << get_version() << dendl;
+ scrub_infop->uninline_in_progress = true;
+}
+
void CInode::scrub_aborted() {
dout(20) << __func__ << dendl;
ceph_assert(scrub_is_in_progress());
scrub_maybe_delete_info();
}
+void CInode::common_finished() {
+ if (!scrub_is_in_progress()) {
+ scrub_infop->last_scrub_version = get_version();
+ scrub_infop->last_scrub_stamp = ceph_clock_now();
+ scrub_infop->last_scrub_dirty = true;
+ scrub_infop->header->dec_num_pending();
+ }
+}
+
void CInode::scrub_finished() {
dout(20) << __func__ << dendl;
ceph_assert(scrub_is_in_progress());
- scrub_infop->last_scrub_version = get_version();
- scrub_infop->last_scrub_stamp = ceph_clock_now();
- scrub_infop->last_scrub_dirty = true;
scrub_infop->scrub_in_progress = false;
- scrub_infop->header->dec_num_pending();
+ common_finished();
+}
+
+void CInode::uninline_finished() {
+ dout(20) << __func__ << dendl;
+ ceph_assert(scrub_is_in_progress());
+
+ scrub_infop->uninline_in_progress = false;
+ common_finished();
}
int64_t CInode::get_backtrace_pool() const
* directory's get_projected_version())
*/
void scrub_initialize(ScrubHeaderRef& header);
+ void uninline_initialize();
/**
* Call this once the scrub has been completed, whether it's a full
* recursive scrub on a directory or simply the data on a file (or
* be complete()ed.
*/
void scrub_finished();
+ void uninline_finished();
+ void common_finished();
void scrub_aborted();
dout(20) << "(uninline_data) log submission succeeded for " << *in << dendl;
in->mdcache->logger->inc(l_mdc_uninline_succeeded);
}
- const_cast<CInode::scrub_info_t*>(in->scrub_info())->uninline_in_progress = false;
+ in->uninline_finished();
mdr->apply();
mds->server->respond_to_request(mdr, r);
in->mdcache->logger->inc(l_mdc_uninline_write_failed);
ceph_assert(in->get_scrub_header());
in->get_scrub_header()->record_uninline_status(in->ino(), r);
+ in->uninline_finished();
+ mdr->apply();
mds->server->respond_to_request(mdr, r);
return;
}
if (!in->has_inline_data()) {
dout(20) << "(uninline_data) inode doesn't have inline data anymore " << *in << dendl;
- const_cast<CInode::scrub_info_t*>(in->scrub_info())->uninline_in_progress = false;
+ in->uninline_finished();
+ mdr->apply();
mds->server->respond_to_request(mdr, 0);
return;
}
logger->inc(l_mdc_uninline_started);
+ in->uninline_initialize();
auto ino = [&]() { return in->ino(); };
auto pi = in->get_projected_inode();
dout(10) << __func__ << " with {" << *in << "}" << ", top=" << top << dendl;
in->scrub_initialize(header);
+ in->uninline_initialize();
} else if (CDir *dir = dynamic_cast<CDir*>(obj)) {
if (dir->scrub_is_in_progress()) {
dout(10) << __func__ << " with {" << *dir << "}" << ", already in scrubbing" << dendl;
if (done) {
dout(20) << __func__ << " dir inode, done" << dendl;
dequeue(in);
+ in->uninline_finished();
}
if (added_children) {
// dirfrags were queued at top of stack
const auto& header = in->get_scrub_header();
header->set_epoch_last_forwarded(scrub_epoch);
in->scrub_finished();
+ in->uninline_finished();
kick_off_scrubs();
}
friend std::ostream &operator<<(std::ostream &os, const State &state);
friend class C_InodeValidated;
+ friend class C_IO_DataUninlined;
+ friend class C_MDC_DataUninlinedSubmitted;
+ friend class MDCache;
int _enqueue(MDSCacheObject *obj, ScrubHeaderRef& header, bool top);
/**