void try_to_expire(MDSRank *mds, MDSGatherBuilder &gather_bld, int op_prio);
void purge_inodes_finish(interval_set<inodeno_t>& inos){
- purge_inodes.subtract(inos);
+ purging_inodes.subtract(inos);
if (NULL != purged_cb &&
- purge_inodes.empty())
+ purging_inodes.empty())
purged_cb->complete(0);
}
void set_purged_cb(MDSContext* c){
elist<CInode*> dirty_dirfrag_dirfragtree;
set<CInode*> truncating_inodes;
- interval_set<inodeno_t> purge_inodes;
+ interval_set<inodeno_t> purging_inodes;
MDSContext* purged_cb = nullptr;
map<int, ceph::unordered_set<version_t> > pending_commit_tids; // mdstable
class C_MDS_purge_completed_finish : public MDCacheLogContext {
interval_set<inodeno_t> inos;
- version_t inotablev;
LogSegment *ls;
+ version_t inotablev;
public:
- C_MDS_purge_completed_finish(MDCache *m,
- interval_set<inodeno_t> i,
- version_t iv,
- LogSegment *_ls)
- : MDCacheLogContext(m),
- inos(std::move(i)),
- inotablev(iv),
- ls(_ls) {}
+ C_MDS_purge_completed_finish(MDCache *m, const interval_set<inodeno_t>& _inos,
+ LogSegment *_ls, version_t iv)
+ : MDCacheLogContext(m), inos(_inos), ls(_ls), inotablev(iv) {}
void finish(int r) override {
assert(r == 0);
if (inotablev) {
- ls->purge_inodes_finish(inos);
- mdcache->mds->inotable->apply_release_ids(inos);
- assert(mdcache->mds->inotable->get_version() == inotablev);
+ get_mds()->inotable->apply_release_ids(inos);
+ assert(get_mds()->inotable->get_version() == inotablev);
}
+ ls->purge_inodes_finish(inos);
}
};
dout(10) << "start_purge_inodes" << dendl;
for (auto& p : mds->mdlog->segments){
LogSegment *ls = p.second;
- if (ls->purge_inodes.size()){
- purge_inodes(ls->purge_inodes, ls);
+ if (ls->purging_inodes.size()){
+ purge_inodes(ls->purging_inodes, ls);
}
}
}
void MDCache::purge_inodes(const interval_set<inodeno_t>& inos, LogSegment *ls)
{
+ dout(10) << __func__ << " purging inos " << inos << " logseg " << ls->seq << dendl;
+ // FIXME: handle non-default data pool and namespace
+
auto cb = new LambdaContext([this, inos, ls](int r){
assert(r == 0 || r == -2);
mds->inotable->project_release_ids(inos);
version_t piv = mds->inotable->get_projected_version();
assert(piv != 0);
- mds->mdlog->start_submit_entry(new EPurged(inos, piv, ls->seq),
- new C_MDS_purge_completed_finish(this, inos, piv, ls));
+ mds->mdlog->start_submit_entry(new EPurged(inos, ls->seq, piv),
+ new C_MDS_purge_completed_finish(this, inos, ls, piv));
mds->mdlog->flush();
});
- dout(10) << __func__ << " start purge data : " << inos << dendl;
C_GatherBuilder gather(g_ceph_context,
- new C_OnFinisher( new MDSIOContextWrapper(mds, cb), mds->finisher));
+ new C_OnFinisher(new MDSIOContextWrapper(mds, cb), mds->finisher));
SnapContext nullsnapc;
- uint64_t num = Striper::get_num_objects(default_file_layout, default_file_layout.get_period());
- for (auto p = inos.begin();
- p != inos.end();
- ++p){
- dout(10) << __func__
- << " prealloc_inos : " << inos.size()
- << " start : " << p.get_start().val
- << " length : " << p.get_len() << " "
- << " seq : " << ls->seq << dendl;
-
- for (_inodeno_t i = 0; i < p.get_len(); i++){
- dout(20) << __func__ << " : " << p.get_start() + i << dendl;
- filer.purge_range(p.get_start() + i,
- &default_file_layout,
- nullsnapc,
- 0, num,
- ceph::real_clock::now(),
- 0, gather.new_sub());
+ for (const auto& [start, len] : inos) {
+ for (auto i = start; i < start + len ; i += 1) {
+ filer.purge_range(i, &default_file_layout, nullsnapc, 0, 1,
+ ceph::real_clock::now(), 0, gather.new_sub());
}
}
gather.activate();
uint64_t state_seq;
bool open;
version_t cmapv;
- interval_set<inodeno_t> inos;
+ interval_set<inodeno_t> inos_to_free;
version_t inotablev;
- interval_set<inodeno_t> purge_inos;
+ interval_set<inodeno_t> inos_to_purge;
LogSegment *ls = nullptr;
Context *fin;
public:
- C_MDS_session_finish(Server *srv, Session *se, uint64_t sseq, bool s, version_t mv, Context *fin_ = NULL) :
+ C_MDS_session_finish(Server *srv, Session *se, uint64_t sseq, bool s, version_t mv, Context *fin_ = nullptr) :
ServerLogContext(srv), session(se), state_seq(sseq), open(s), cmapv(mv), inotablev(0), fin(fin_) { }
- C_MDS_session_finish(Server *srv, Session *se, uint64_t sseq, bool s, version_t mv, interval_set<inodeno_t> i, version_t iv, Context *fin_ = NULL) :
- ServerLogContext(srv), session(se), state_seq(sseq), open(s), cmapv(mv), inos(std::move(i)), inotablev(iv), fin(fin_) { }
- C_MDS_session_finish(Server *srv, Session *se, uint64_t sseq, bool s, version_t mv, interval_set<inodeno_t> i, version_t iv,
- interval_set<inodeno_t> _purge_inos, LogSegment *_ls, Context *fin_ = NULL) :
- ServerLogContext(srv), session(se), state_seq(sseq), open(s), cmapv(mv), inos(std::move(i)), inotablev(iv), purge_inos(std::move(_purge_inos)), ls(_ls), fin(fin_){}
+ C_MDS_session_finish(Server *srv, Session *se, uint64_t sseq, bool s, version_t mv,
+ const interval_set<inodeno_t>& to_free, version_t iv, Context *fin_ = nullptr) :
+ ServerLogContext(srv), session(se), state_seq(sseq), open(s), cmapv(mv),
+ inos_to_free(to_free), inotablev(iv), fin(fin_) { }
+ C_MDS_session_finish(Server *srv, Session *se, uint64_t sseq, bool s, version_t mv,
+ const interval_set<inodeno_t>& to_free, version_t iv,
+ const interval_set<inodeno_t>& to_purge, LogSegment *_ls, Context *fin_ = nullptr) :
+ ServerLogContext(srv), session(se), state_seq(sseq), open(s), cmapv(mv),
+ inos_to_free(to_free), inotablev(iv), inos_to_purge(to_purge), ls(_ls), fin(fin_) {}
void finish(int r) override {
ceph_assert(r == 0);
- server->_session_logged(session, state_seq, open, cmapv, inos, inotablev, purge_inos, ls);
+ server->_session_logged(session, state_seq, open, cmapv, inos_to_free, inotablev, inos_to_purge, ls);
if (fin) {
fin->complete(r);
}
}
void Server::_session_logged(Session *session, uint64_t state_seq, bool open, version_t pv,
- const interval_set<inodeno_t>& inos, version_t piv,
- const interval_set<inodeno_t>& purge_inos, LogSegment *ls)
+ const interval_set<inodeno_t>& inos_to_free, version_t piv,
+ const interval_set<inodeno_t>& inos_to_purge, LogSegment *ls)
{
dout(10) << "_session_logged " << session->info.inst
<< " state_seq " << state_seq
- << " " << (open ? "open":"close")
- << " " << pv
- << " purge_inos : " << purge_inos << dendl;
+ << " " << (open ? "open":"close") << " " << pv
+ << " inos_to_free " << inos_to_free << " inotablev " << piv
+ << " inos_to_purge " << inos_to_purge << dendl;
- if (NULL != ls) {
- dout(10) << "_session_logged seq : " << ls->seq << dendl;
- if (purge_inos.size()){
- session->info.prealloc_inos.subtract(purge_inos);
- ls->purge_inodes.insert(purge_inos);
- mdcache->purge_inodes(purge_inos, ls);
- }
+ if (inos_to_purge.size()){
+ ceph_assert(ls);
+ session->info.prealloc_inos.subtract(inos_to_purge);
+ ls->purging_inodes.insert(inos_to_purge);
+ mdcache->purge_inodes(inos_to_purge, ls);
}
if (piv) {
ceph_assert(session->is_closing() || session->is_killing() ||
session->is_opening()); // re-open closing session
- session->info.prealloc_inos.subtract(inos);
+ session->info.prealloc_inos.subtract(inos_to_free);
session->delegated_inos.clear();
- mds->inotable->apply_release_ids(inos);
+ mds->inotable->apply_release_ids(inos_to_free);
ceph_assert(mds->inotable->get_version() == piv);
}
}
void handle_client_session(const cref_t<MClientSession> &m);
- void _session_logged(Session *session, uint64_t state_seq,
- bool open, version_t pv, const interval_set<inodeno_t>& inos,version_t piv,
- const interval_set<inodeno_t>& purge_inos, LogSegment *ls);
+ void _session_logged(Session *session, uint64_t state_seq, bool open, version_t pv,
+ const interval_set<inodeno_t>& inos_to_free, version_t piv,
+ const interval_set<inodeno_t>& inos_to_purge, LogSegment *ls);
version_t prepare_force_open_sessions(map<client_t,entity_inst_t> &cm,
map<client_t,client_metadata_t>& cmm,
map<client_t,pair<Session*,uint64_t> >& smap);
#include "../LogEvent.h"
class EPurged : public LogEvent {
-
- protected:
- interval_set<inodeno_t> inos;
- version_t inotablev{0};
- LogSegment::seq_t seq;
- public:
- EPurged() : LogEvent(EVENT_PURGED) {
- }
- EPurged(interval_set<inodeno_t> i, version_t iv, LogSegment::seq_t _seq = 0) :
- LogEvent(EVENT_PURGED), inos(std::move(i)), inotablev(iv), seq(_seq) {
- }
- void encode(bufferlist& bl, uint64_t features) const override;
- void decode(bufferlist::const_iterator& bl) override;
- void dump(Formatter *f) const override;
- void print(ostream& out) const override {
-
- if (inotablev)
- out << "Eurge complete";
- else
- out << "Eurge inodes ";
- }
-
- void update_segment() override;
- void replay(MDSRank *mds) override;
+public:
+ EPurged() : LogEvent(EVENT_PURGED) { }
+ EPurged(const interval_set<inodeno_t>& _inos, LogSegment::seq_t _seq, version_t iv)
+ : LogEvent(EVENT_PURGED), inos(_inos), seq(_seq), inotablev(iv) {
+ }
+ void encode(bufferlist& bl, uint64_t features) const override;
+ void decode(bufferlist::const_iterator& bl) override;
+ void dump(Formatter *f) const override;
+ void print(ostream& out) const override {
+ out << "Eurged " << inos.size() << " inos, inotable v" << inotablev;
+ }
+
+ void update_segment() override;
+ void replay(MDSRank *mds) override;
+
+protected:
+ interval_set<inodeno_t> inos;
+ LogSegment::seq_t seq;
+ version_t inotablev{0};
};
WRITE_CLASS_ENCODER_FEATURES(EPurged)
bool open; // open or close
version_t cmapv{0}; // client map version
- interval_set<inodeno_t> inos;
+ interval_set<inodeno_t> inos_to_free;
version_t inotablev{0};
- interval_set<inodeno_t> purge_inos;
+ interval_set<inodeno_t> inos_to_purge;
// Client metadata stored during open
client_metadata_t client_metadata;
client_inst(inst), open(o), cmapv(v), inotablev(0),
client_metadata(cm) { }
ESession(const entity_inst_t& inst, bool o, version_t v,
- interval_set<inodeno_t> i, version_t iv,
- interval_set<inodeno_t> _purge_inos) :
- LogEvent(EVENT_SESSION),
- client_inst(inst), open(o), cmapv(v), inos(std::move(i)), inotablev(iv),
- purge_inos(std::move(_purge_inos)) {}
+ const interval_set<inodeno_t>& to_free, version_t iv,
+ const interval_set<inodeno_t>& to_purge) :
+ LogEvent(EVENT_SESSION), client_inst(inst), open(o), cmapv(v),
+ inos_to_free(to_free), inotablev(iv), inos_to_purge(to_purge) {}
void encode(bufferlist& bl, uint64_t features) const override;
void decode(bufferlist::const_iterator& bl) override;
out << "ESession " << client_inst << " open cmapv " << cmapv;
else
out << "ESession " << client_inst << " close cmapv " << cmapv;
- if (inos.size())
- out << " (" << inos.size() << " inos, v" << inotablev << ")";
+ if (inos_to_free.size() || inos_to_purge.size())
+ out << " (" << inos_to_free.size() << " to free, v" << inotablev
+ << ", " << inos_to_purge.size() << " to purge)";
}
void update_segment() override;
(*p)->add_waiter(CInode::WAIT_TRUNC, gather_bld.new_sub());
}
// purge inodes
- dout(10) << "try_to_expire waiting for purge of " << purge_inodes << dendl;
- if (purge_inodes.size())
+ dout(10) << "try_to_expire waiting for purge of " << purging_inodes << dendl;
+ if (purging_inodes.size())
set_purged_cb(gather_bld.new_sub());
if (gather_bld.has_subs()) {
{
if (inos.size()) {
LogSegment *ls = mds->mdlog->get_segment(seq);
- if (ls) {
- ls->purge_inodes.subtract(inos);
- }
+ if (ls)
+ ls->purging_inodes.subtract(inos);
+
if (mds->inotable->get_version() >= inotablev) {
dout(10) << "EPurged.replay inotable " << mds->inotable->get_version()
<< " >= " << inotablev << ", noop" << dendl;
void ESession::update_segment()
{
get_segment()->sessionmapv = cmapv;
- if (inos.size() && inotablev)
+ if (inos_to_free.size() && inotablev)
get_segment()->inotablev = inotablev;
}
void ESession::replay(MDSRank *mds)
{
- if (purge_inos.size())
- get_segment()->purge_inodes.insert(purge_inos);
+ if (inos_to_purge.size())
+ get_segment()->purging_inodes.insert(inos_to_purge);
if (mds->sessionmap.get_version() >= cmapv) {
dout(10) << "ESession.replay sessionmap " << mds->sessionmap.get_version()
mds->sessionmap.set_version(cmapv);
}
- if (inos.size() && inotablev) {
+ if (inos_to_free.size() && inotablev) {
if (mds->inotable->get_version() >= inotablev) {
dout(10) << "ESession.replay inotable " << mds->inotable->get_version()
<< " >= " << inotablev << ", noop" << dendl;
dout(10) << "ESession.replay inotable " << mds->inotable->get_version()
<< " < " << inotablev << " " << (open ? "add":"remove") << dendl;
ceph_assert(!open); // for now
- mds->inotable->replay_release_ids(inos);
+ mds->inotable->replay_release_ids(inos_to_free);
ceph_assert(mds->inotable->get_version() == inotablev);
}
}
encode(client_inst, bl, features);
encode(open, bl);
encode(cmapv, bl);
- encode(inos, bl);
+ encode(inos_to_free, bl);
encode(inotablev, bl);
encode(client_metadata, bl);
- encode(purge_inos, bl);
+ encode(inos_to_purge, bl);
ENCODE_FINISH(bl);
}
decode(client_inst, bl);
decode(open, bl);
decode(cmapv, bl);
- decode(inos, bl);
+ decode(inos_to_free, bl);
decode(inotablev, bl);
if (struct_v == 4) {
decode(client_metadata.kv_map, bl);
decode(client_metadata, bl);
}
if (struct_v >= 6){
- decode(purge_inos, bl);
+ decode(inos_to_purge, bl);
}
DECODE_FINISH(bl);
f->dump_stream("client instance") << client_inst;
f->dump_string("open", open ? "true" : "false");
f->dump_int("client map version", cmapv);
- f->dump_stream("inos") << inos;
+ f->dump_stream("inos_to_free") << inos_to_free;
f->dump_int("inotable version", inotablev);
f->open_object_section("client_metadata");
+ f->dump_stream("inos_to_purge") << inos_to_purge;
client_metadata.dump(f);
f->close_section(); // client_metadata
}