}
if (!in.get_mds_caps_wanted().empty()) {
out << " mcw={";
- for (map<int,int>::const_iterator p = in.get_mds_caps_wanted().begin();
- p != in.get_mds_caps_wanted().end(); ++p) {
+ for (compact_map<int,int>::const_iterator p = in.get_mds_caps_wanted().begin();
+ p != in.get_mds_caps_wanted().end();
+ ++p) {
if (p != in.get_mds_caps_wanted().begin())
out << ',';
out << p->first << '=' << ccap_string(p->second);
void CInode::remove_need_snapflush(CInode *snapin, snapid_t snapid, client_t client)
{
dout(10) << "remove_need_snapflush client." << client << " snapid " << snapid << " on " << snapin << dendl;
- map<snapid_t, std::set<client_t> >::iterator p = client_need_snapflush.find(snapid);
+ compact_map<snapid_t, std::set<client_t> >::iterator p = client_need_snapflush.find(snapid);
if (p == client_need_snapflush.end()) {
dout(10) << " snapid not found" << dendl;
return;
void CInode::split_need_snapflush(CInode *cowin, CInode *in)
{
dout(10) << "split_need_snapflush [" << cowin->first << "," << cowin->last << "] for " << *cowin << dendl;
- for (map<snapid_t, set<client_t> >::iterator p = client_need_snapflush.lower_bound(cowin->first);
+ for (compact_map<snapid_t, set<client_t> >::iterator p = client_need_snapflush.lower_bound(cowin->first);
p != client_need_snapflush.end() && p->first <= cowin->last;
++p) {
assert(!p->second.empty());
fragtree_t tmpdft;
tmpdft.force_to_leaf(g_ceph_context, fg);
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) {
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) {
tmpdft.force_to_leaf(g_ceph_context, p->first);
if (fg.contains(p->first) && !dirfragtree.is_leaf(p->first))
ls.push_back(p->second);
void CInode::verify_dirfrags()
{
bool bad = false;
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) {
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) {
if (!dirfragtree.is_leaf(p->first)) {
dout(0) << "have open dirfrag " << p->first << " but not leaf in " << dirfragtree
<< ": " << *p->second << dendl;
void CInode::force_dirfrags()
{
bool bad = false;
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) {
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) {
if (!dirfragtree.is_leaf(p->first)) {
dout(0) << "have open dirfrag " << p->first << " but not leaf in " << dirfragtree
<< ": " << *p->second << dendl;
void CInode::get_dirfrags(list<CDir*>& ls)
{
// all dirfrags
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p)
ls.push_back(p->second);
void CInode::get_nested_dirfrags(list<CDir*>& ls)
{
// dirfrags in same subtree
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p)
if (!p->second->is_subtree_root())
void CInode::get_subtree_dirfrags(list<CDir*>& ls)
{
// dirfrags that are roots of new subtrees
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p)
if (p->second->is_subtree_root())
bool CInode::has_subtree_root_dirfrag(int auth)
{
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p)
if (p->second->is_subtree_root() &&
bool CInode::has_subtree_or_exporting_dirfrag()
{
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p)
if (p->second->is_subtree_root() ||
{
if (stickydir_ref == 0) {
get(PIN_STICKYDIRS);
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
p->second->state_set(CDir::STATE_STICKY);
stickydir_ref--;
if (stickydir_ref == 0) {
put(PIN_STICKYDIRS);
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
p->second->state_clear(CDir::STATE_STICKY);
::encode(inode.dirstat, bl); // only meaningful if i am auth.
bufferlist tmp;
__u32 n = 0;
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
frag_t fg = p->first;
::encode(inode.rstat, bl); // only meaningful if i am auth.
bufferlist tmp;
__u32 n = 0;
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
frag_t fg = p->first;
// dft was scattered, or we may still be be waiting on the
// notify from the auth)
dirfragtree.swap(temp);
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
if (!dirfragtree.is_leaf(p->first)) {
assert(is_auth());
inode_t *pi = get_projected_inode();
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
frag_t fg = p->first;
bool touched_mtime = false;
dout(20) << " orig dirstat " << pi->dirstat << dendl;
pi->dirstat.version++;
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
frag_t fg = p->first;
inode_t *pi = get_projected_inode();
dout(20) << " orig rstat " << pi->rstat << dendl;
pi->rstat.version++;
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
frag_t fg = p->first;
dout(10) << "finish_scatter_gather_update_accounted " << type << " on " << *this << dendl;
assert(is_auth());
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
CDir *dir = p->second;
if (waiting_on_dir.empty())
return;
- map<frag_t, list<MDSInternalContextBase*> >::iterator p = waiting_on_dir.find(fg);
+ compact_map<frag_t, list<MDSInternalContextBase*> >::iterator p = waiting_on_dir.find(fg);
if (p != waiting_on_dir.end()) {
dout(10) << "take_dir_waiting frag " << fg << " on " << *this << dendl;
ls.splice(ls.end(), p->second);
if ((mask & WAIT_DIR) && !waiting_on_dir.empty()) {
// take all dentry waiters
while (!waiting_on_dir.empty()) {
- map<frag_t, list<MDSInternalContextBase*> >::iterator p = waiting_on_dir.begin();
+ compact_map<frag_t, list<MDSInternalContextBase*> >::iterator p = waiting_on_dir.begin();
dout(10) << "take_waiting dirfrag " << p->first << " on " << *this << dendl;
ls.splice(ls.end(), p->second);
waiting_on_dir.erase(p);
if (g_conf->mds_debug_auth_pins) {
// audit
int s = 0;
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
CDir *dir = p->second;
//cout << " get_caps_wanted client " << it->first << " " << cap_string(it->second.wanted()) << endl;
}
if (is_auth())
- for (map<int,int>::const_iterator it = mds_caps_wanted.begin();
+ for (compact_map<int,int>::const_iterator it = mds_caps_wanted.begin();
it != mds_caps_wanted.end();
++it) {
w |= it->second;
// include scatterlock info for any bounding CDirs
bufferlist bounding;
if (inode.is_dir())
- for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ for (compact_map<frag_t,CDir*>::iterator p = dirfrags.begin();
p != dirfrags.end();
++p) {
CDir *dir = p->second;
// check each dirfrag...
nest_info_t& sub_info = results->raw_rstats.ondisk_value;
- for (map<frag_t,CDir*>::iterator p = in->dirfrags.begin();
- p != in->dirfrags.end();
- ++p) {
+ for (compact_map<frag_t,CDir*>::iterator p = in->dirfrags.begin();
+ p != in->dirfrags.end();
+ ++p) {
if (!p->second->is_complete()) {
results->raw_rstats.error_str << "dirfrag is INCOMPLETE despite fetching; probably too large compared to MDS cache size?\n";
return true;
#include "include/elist.h"
#include "include/types.h"
#include "include/lru.h"
+#include "include/compact_set.h"
#include "mdstypes.h"
#include "flock.h"
SnapRealm *snaprealm;
SnapRealm *containing_realm;
snapid_t first, last;
- std::set<snapid_t> dirty_old_rstats;
+ compact_set<snapid_t> dirty_old_rstats;
bool is_multiversion() const {
return snaprealm || // other snaprealms will link to me
// -- cache infrastructure --
private:
- std::map<frag_t,CDir*> dirfrags; // cached dir fragments under this Inode
+ compact_map<frag_t,CDir*> dirfrags; // cached dir fragments under this Inode
int stickydir_ref;
public:
protected:
// parent dentries in cache
CDentry *parent; // primary link
- std::set<CDentry*> remote_parents; // if hard linked
+ compact_set<CDentry*> remote_parents; // if hard linked
std::list<CDentry*> projected_parent; // for in-progress rename, (un)link, etc.
protected:
// file capabilities
std::map<client_t, Capability*> client_caps; // client -> caps
- std::map<int32_t, int32_t> mds_caps_wanted; // [auth] mds -> caps wanted
+ compact_map<int32_t, int32_t> mds_caps_wanted; // [auth] mds -> caps wanted
int replica_caps_wanted; // [replica] what i've requested from auth
- std::map<int, std::set<client_t> > client_snap_caps; // [auth] [snap] dirty metadata we still need from the head
+ compact_map<int, std::set<client_t> > client_snap_caps; // [auth] [snap] dirty metadata we still need from the head
public:
- std::map<snapid_t, std::set<client_t> > client_need_snapflush;
+ compact_map<snapid_t, std::set<client_t> > client_need_snapflush;
void add_need_snapflush(CInode *snapin, snapid_t snapid, client_t client);
void remove_need_snapflush(CInode *snapin, snapid_t snapid, client_t client);
// -- waiting --
protected:
- std::map<frag_t, std::list<MDSInternalContextBase*> > waiting_on_dir;
+ compact_map<frag_t, std::list<MDSInternalContextBase*> > waiting_on_dir;
public:
void add_dir_waiter(frag_t fg, MDSInternalContextBase *c);
void take_dir_waiting(frag_t fg, std::list<MDSInternalContextBase*>& ls);
bool is_any_caps() { return !client_caps.empty(); }
bool is_any_nonstale_caps() { return count_nonstale_caps(); }
- const std::map<int32_t,int32_t>& get_mds_caps_wanted() const { return mds_caps_wanted; }
- std::map<int32_t,int32_t>& get_mds_caps_wanted() { return mds_caps_wanted; }
+ const compact_map<int32_t,int32_t>& get_mds_caps_wanted() const { return mds_caps_wanted; }
+ compact_map<int32_t,int32_t>& get_mds_caps_wanted() { return mds_caps_wanted; }
const std::map<client_t,Capability*>& get_client_caps() const { return client_caps; }
Capability *get_client_cap(client_t client) {