steal_dentry(dir->items.begin()->second);
// merge replica map
- for (map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
- p != dir->replica_map.end();
+ for (compact_map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
+ p != dir->replicas_end();
++p) {
unsigned cur = replica_map[p->first];
if (p->second > cur)
f->open_object_section("auth_state");
{
f->open_object_section("replica_map");
- for (std::map<mds_rank_t, unsigned>::const_iterator i = replica_map.begin();
- i != replica_map.end(); ++i) {
+ for (compact_map<mds_rank_t, unsigned>::const_iterator i = replica_map.begin();
+ i != replica_map.end();
+ ++i) {
std::ostringstream rank_str;
rank_str << i->first;
f->dump_int(rank_str.str().c_str(), i->second);
// for giving to clients
void get_dist_spec(std::set<mds_rank_t>& ls, mds_rank_t auth) {
if (is_rep()) {
- for (std::map<mds_rank_t,unsigned>::iterator p = replicas_begin();
- p != replicas_end();
- ++p)
- ls.insert(p->first);
+ list_replicas(ls);
if (!ls.empty())
ls.insert(auth);
}
void Locker::send_lock_message(SimpleLock *lock, int msg)
{
- for (map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
- it != lock->get_parent()->replicas_end();
+ for (compact_map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
+ it != lock->get_parent()->replicas_end();
++it) {
if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN)
continue;
void Locker::send_lock_message(SimpleLock *lock, int msg, const bufferlist &data)
{
- for (map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
- it != lock->get_parent()->replicas_end();
+ for (compact_map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
+ it != lock->get_parent()->replicas_end();
++it) {
if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN)
continue;
msg->quota = i->quota;
mds->send_message_client_counted(msg, session->connection);
}
- for (map<const mds_rank_t, unsigned>::iterator it = in->replicas_begin();
- it != in->replicas_end(); ++it) {
+ for (compact_map<mds_rank_t, unsigned>::iterator it = in->replicas_begin();
+ it != in->replicas_end();
+ ++it) {
MGatherCaps *msg = new MGatherCaps;
msg->ino = in->ino();
mds->send_message_mds(msg, it->first);
dq.pop_front();
// dir
- for (map<mds_rank_t,unsigned>::iterator r = dir->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator r = dir->replicas_begin();
r != dir->replicas_end();
++r) {
ack[r->first]->add_strong_dirfrag(dir->dirfrag(), ++r->second, dir->dir_rep);
in = dnl->get_inode();
// dentry
- for (map<mds_rank_t,unsigned>::iterator r = dn->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator r = dn->replicas_begin();
r != dn->replicas_end();
++r) {
ack[r->first]->add_strong_dentry(dir->dirfrag(), dn->name, dn->first, dn->last,
if (!in)
continue;
- for (map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
r != in->replicas_end();
++r) {
ack[r->first]->add_inode_base(in);
// base inodes too
if (root && root->is_auth())
- for (map<mds_rank_t,unsigned>::iterator r = root->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator r = root->replicas_begin();
r != root->replicas_end();
++r) {
ack[r->first]->add_inode_base(root);
ack[r->first]->add_inode_locks(root, ++r->second, bl);
}
if (myin)
- for (map<mds_rank_t,unsigned>::iterator r = myin->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator r = myin->replicas_begin();
r != myin->replicas_end();
++r) {
ack[r->first]->add_inode_base(myin);
p != rejoin_potential_updated_scatterlocks.end();
++p) {
CInode *in = *p;
- for (map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
r != in->replicas_end();
++r)
ack[r->first]->add_inode_base(in);
if (bcast) {
mds->get_mds_map()->get_active_mds_set(who);
} else {
- for (map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
p != dir->replicas_end();
++p)
who.insert(p->first);
dout(7) << "send_dentry_link " << *dn << dendl;
CDir *subtree = get_subtree_root(dn->get_dir());
- for (map<mds_rank_t,unsigned>::iterator p = dn->replicas_begin();
- p != dn->replicas_end();
+ for (compact_map<mds_rank_t,unsigned>::iterator p = dn->replicas_begin();
+ p != dn->replicas_end();
++p) {
// don't tell (rename) witnesses; they already know
if (mdr.get() && mdr->more()->witnessed.count(p->first))
{
dout(10) << "send_dentry_unlink " << *dn << dendl;
// share unlink news with replicas
- map<mds_rank_t,unsigned> replicas;
- replicas.insert(dn->replicas_begin(), dn->replicas_end());
+ set<mds_rank_t> replicas;
+ dn->list_replicas(replicas);
if (straydn)
- replicas.insert(straydn->replicas_begin(), straydn->replicas_end());
- for (map<mds_rank_t,unsigned>::iterator it = replicas.begin();
+ straydn->list_replicas(replicas);
+ for (set<mds_rank_t>::iterator it = replicas.begin();
it != replicas.end();
++it) {
// don't tell (rmdir) witnesses; they already know
- if (mdr.get() && mdr->more()->witnessed.count(it->first))
+ if (mdr.get() && mdr->more()->witnessed.count(*it))
continue;
- if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN ||
- (mds->mdsmap->get_state(it->first) == MDSMap::STATE_REJOIN &&
- rejoin_gather.count(it->first)))
+ if (mds->mdsmap->get_state(*it) < MDSMap::STATE_REJOIN ||
+ (mds->mdsmap->get_state(*it) == MDSMap::STATE_REJOIN &&
+ rejoin_gather.count(*it)))
continue;
MDentryUnlink *unlink = new MDentryUnlink(dn->get_dir()->dirfrag(), dn->name);
if (straydn)
- replicate_stray(straydn, it->first, unlink->straybl);
- mds->send_message_mds(unlink, it->first);
+ replicate_stray(straydn, *it, unlink->straybl);
+ mds->send_message_mds(unlink, *it);
}
}
// tell peers
CDir *first = *info.resultfrags.begin();
- for (map<mds_rank_t,unsigned>::iterator p = first->replicas_begin();
- p != first->replica_map.end();
+ for (compact_map<mds_rank_t,unsigned>::iterator p = first->replicas_begin();
+ p != first->replicas_end();
++p) {
if (mds->mdsmap->get_state(p->first) < MDSMap::STATE_REJOIN ||
(mds->mdsmap->get_state(p->first) == MDSMap::STATE_REJOIN &&
MExportDirPrep *prep = new MExportDirPrep(dir->dirfrag(), it->second.tid);
// include list of bystanders
- for (map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
p != dir->replicas_end();
++p) {
if (p->first != it->second.peer) {
it->second.warning_ack_waiting.count(MDS_RANK_NONE) > 0));
assert(it->second.notify_ack_waiting.empty());
- for (map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
+ for (compact_map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
p != dir->replicas_end();
++p) {
if (p->first == it->second.peer) continue;
}
void init_gather() {
- for (map<mds_rank_t,unsigned>::const_iterator p = parent->replicas_begin();
- p != parent->replicas_end();
+ for (compact_map<mds_rank_t,unsigned>::iterator p = parent->replicas_begin();
+ p != parent->replicas_end();
++p)
more()->gather_set.insert(p->first);
}
#include "include/frag.h"
#include "include/xlist.h"
#include "include/interval_set.h"
+#include "include/compact_map.h"
#include "inode_backtrace.h"
// replication (across mds cluster)
protected:
unsigned replica_nonce; // [replica] defined on replica
- std::map<mds_rank_t,unsigned> replica_map; // [auth] mds -> nonce
+ compact_map<mds_rank_t,unsigned> replica_map; // [auth] mds -> nonce
public:
bool is_replicated() const { return !replica_map.empty(); }
put(PIN_REPLICATED);
replica_map.clear();
}
- std::map<mds_rank_t,unsigned>::iterator replicas_begin() { return replica_map.begin(); }
- std::map<mds_rank_t,unsigned>::iterator replicas_end() { return replica_map.end(); }
- const std::map<mds_rank_t,unsigned>& get_replicas() const { return replica_map; }
+ compact_map<mds_rank_t,unsigned>::iterator replicas_begin() { return replica_map.begin(); }
+ compact_map<mds_rank_t,unsigned>::iterator replicas_end() { return replica_map.end(); }
+ const compact_map<mds_rank_t,unsigned>& get_replicas() const { return replica_map; }
void list_replicas(std::set<mds_rank_t>& ls) const {
- for (std::map<mds_rank_t,unsigned>::const_iterator p = replica_map.begin();
+ for (compact_map<mds_rank_t,unsigned>::const_iterator p = replica_map.begin();
p != replica_map.end();
- ++p)
+ ++p)
ls.insert(p->first);
}
// ---------------------------------------------
// waiting
protected:
- multimap<uint64_t, MDSInternalContextBase*> waiting;
+ compact_multimap<uint64_t, MDSInternalContextBase*> waiting;
public:
bool is_waiter_for(uint64_t mask, uint64_t min=0) {
while (min & (min-1)) // if more than one bit is set
min &= min-1; // clear LSB
}
- for (multimap<uint64_t,MDSInternalContextBase*>::iterator p = waiting.lower_bound(min);
+ for (compact_multimap<uint64_t,MDSInternalContextBase*>::iterator p = waiting.lower_bound(min);
p != waiting.end();
++p) {
if (p->first & mask) return true;
}
virtual void take_waiting(uint64_t mask, list<MDSInternalContextBase*>& ls) {
if (waiting.empty()) return;
- multimap<uint64_t,MDSInternalContextBase*>::iterator it = waiting.begin();
+ compact_multimap<uint64_t,MDSInternalContextBase*>::iterator it = waiting.begin();
while (it != waiting.end()) {
if (it->first & mask) {
ls.push_back(it->second);