#define dout_subsys ceph_subsys_mds
#undef dout_prefix
#define dout_prefix _prefix(_dout, mdcache->mds->get_nodeid(), inode, srnode.seq, this)
-static ostream& _prefix(std::ostream *_dout, int whoami, CInode *inode,
- uint64_t seq, SnapRealm *realm) {
+static ostream& _prefix(std::ostream *_dout, int whoami, const CInode *inode,
+ uint64_t seq, const SnapRealm *realm) {
return *_dout << " mds." << whoami
<< ".cache.snaprealm(" << inode->ino()
<< " seq " << seq << " " << realm << ") ";
*/
void SnapRealm::build_snap_set(set<snapid_t> &s,
snapid_t& max_seq, snapid_t& max_last_created, snapid_t& max_last_destroyed,
- snapid_t first, snapid_t last)
+ snapid_t first, snapid_t last) const
{
dout(10) << "build_snap_set [" << first << "," << last << "] on " << *this << dendl;
max_last_destroyed = srnode.last_destroyed;
// include my snaps within interval [first,last]
- for (map<snapid_t, SnapInfo>::iterator p = srnode.snaps.lower_bound(first); // first element >= first
+ for (map<snapid_t, SnapInfo>::const_iterator p = srnode.snaps.lower_bound(first); // first element >= first
p != srnode.snaps.end() && p->first <= last;
++p)
s.insert(p->first);
// include snaps for parents during intervals that intersect [first,last]
- for (map<snapid_t, snaplink_t>::iterator p = srnode.past_parents.lower_bound(first);
+ for (map<snapid_t, snaplink_t>::const_iterator p = srnode.past_parents.lower_bound(first);
p != srnode.past_parents.end() && p->first >= first && p->second.first <= last;
++p) {
- CInode *oldparent = mdcache->get_inode(p->second.ino);
+ const CInode *oldparent = mdcache->get_inode(p->second.ino);
assert(oldparent); // call open_parents first!
assert(oldparent->snaprealm);
oldparent->snaprealm->build_snap_set(s, max_seq, max_last_created, max_last_destroyed,
}
-void SnapRealm::check_cache()
+void SnapRealm::check_cache() const
{
assert(open);
if (cached_seq >= srnode.seq)
<< ")" << dendl;
}
-const set<snapid_t>& SnapRealm::get_snaps()
+const set<snapid_t>& SnapRealm::get_snaps() const
{
check_cache();
dout(10) << "get_snaps " << cached_snaps
/*
* build vector in reverse sorted order
*/
-const SnapContext& SnapRealm::get_snap_context()
+const SnapContext& SnapRealm::get_snap_context() const
{
check_cache();
return cached_snap_trace;
}
-void SnapRealm::build_snap_trace(bufferlist& snapbl)
+void SnapRealm::build_snap_trace(bufferlist& snapbl) const
{
SnapRealmInfo info(inode->ino(), srnode.created, srnode.seq, srnode.current_parent_since);
info.h.parent = 0;
info.my_snaps.reserve(srnode.snaps.size());
- for (map<snapid_t,SnapInfo>::reverse_iterator p = srnode.snaps.rbegin();
+ for (map<snapid_t,SnapInfo>::const_reverse_iterator p = srnode.snaps.rbegin();
p != srnode.snaps.rend();
++p)
info.my_snaps.push_back(p->first);
class MDSInternalContextBase;
struct SnapRealm {
- // realm state
+protected:
+ // cache
+ mutable snapid_t cached_seq; // max seq over self and all past+present parents.
+ mutable snapid_t cached_last_created; // max last_created over all past+present parents
+ mutable snapid_t cached_last_destroyed;
+ mutable set<snapid_t> cached_snaps;
+ mutable SnapContext cached_snap_context;
+ mutable bufferlist cached_snap_trace;
+
+ void check_cache() const;
+public:
+ // realm state
sr_t srnode;
// in-memory state
map<inodeno_t, pair<SnapRealm*, set<snapid_t> > > open_past_parents; // these are explicitly pinned.
unsigned num_open_past_parents;
- // cache
- snapid_t cached_seq; // max seq over self and all past+present parents.
- snapid_t cached_last_created; // max last_created over all past+present parents
- snapid_t cached_last_destroyed;
- set<snapid_t> cached_snaps;
- SnapContext cached_snap_context;
- bufferlist cached_snap_trace;
elist<CInode*> inodes_with_caps; // for efficient realm splits
map<client_t, xlist<Capability*>* > client_caps; // to identify clients who need snap notifications
void build_snap_set(set<snapid_t>& s,
snapid_t& max_seq, snapid_t& max_last_created, snapid_t& max_last_destroyed,
- snapid_t first, snapid_t last);
+ snapid_t first, snapid_t last) const;
void get_snap_info(map<snapid_t,SnapInfo*>& infomap, snapid_t first=0, snapid_t last=CEPH_NOSNAP);
const bufferlist& get_snap_trace();
- void build_snap_trace(bufferlist& snapbl);
+ void build_snap_trace(bufferlist& snapbl) const;
const string& get_snapname(snapid_t snapid, inodeno_t atino);
snapid_t resolve_snapname(const string &name, inodeno_t atino, snapid_t first=0, snapid_t last=CEPH_NOSNAP);
- void check_cache();
- const set<snapid_t>& get_snaps();
- const SnapContext& get_snap_context();
+ const set<snapid_t>& get_snaps() const;
+ const SnapContext& get_snap_context() const;
void invalidate_cached_snaps() {
cached_seq = 0;
}