// request remote auth_pins
if (!mustpin_remote.empty()) {
marker.message = "requesting remote authpins";
- for (set<MDSCacheObject*>::iterator p = mdr->remote_auth_pins.begin();
+ for (map<MDSCacheObject*,int>::iterator p = mdr->remote_auth_pins.begin();
p != mdr->remote_auth_pins.end();
++p) {
- if (mustpin.count(*p)) {
- int auth = (*p)->authority().first;
- map<int, set<MDSCacheObject*> >::iterator q = mustpin_remote.find(auth);
+ if (mustpin.count(p->first)) {
+ assert(p->second == p->first->authority().first);
+ map<int, set<MDSCacheObject*> >::iterator q = mustpin_remote.find(p->second);
if (q != mustpin_remote.end())
- q->second.insert(*p);
+ q->second.insert(p->first);
}
}
for (map<int, set<MDSCacheObject*> >::iterator p = mustpin_remote.begin();
if (mdr->is_slave())
continue;
// auth pins
- for (set<MDSCacheObject*>::iterator q = mdr->remote_auth_pins.begin();
+ for (map<MDSCacheObject*,int>::iterator q = mdr->remote_auth_pins.begin();
q != mdr->remote_auth_pins.end();
++q) {
- if (!(*q)->is_auth()) {
- int who = (*q)->authority().first;
- if (rejoins.count(who) == 0) continue;
- MMDSCacheRejoin *rejoin = rejoins[who];
+ if (!q->first->is_auth()) {
+ assert(q->second == q->first->authority().first);
+ if (rejoins.count(q->second) == 0) continue;
+ MMDSCacheRejoin *rejoin = rejoins[q->second];
- dout(15) << " " << *mdr << " authpin on " << **q << dendl;
+ dout(15) << " " << *mdr << " authpin on " << *q->first << dendl;
MDSCacheObjectInfo i;
- (*q)->set_object_info(i);
+ q->first->set_object_info(i);
if (i.ino)
rejoin->add_inode_authpin(vinodeno_t(i.ino, i.snapid), mdr->reqid, mdr->attempt);
else
rejoin->add_dentry_authpin(i.dirfrag, i.dname, i.snapid, mdr->reqid, mdr->attempt);
if (mdr->has_more() && mdr->more()->is_remote_frozen_authpin &&
- mdr->more()->rename_inode == (*q))
+ mdr->more()->rename_inode == q->first)
rejoin->add_inode_frozen_authpin(vinodeno_t(i.ino, i.snapid),
mdr->reqid, mdr->attempt);
}
set<CInode*> stickydirs;
// auth pins
- set< MDSCacheObject* > remote_auth_pins;
+ map<MDSCacheObject*,int> remote_auth_pins;
set< MDSCacheObject* > auth_pins;
// held locks
fail = true;
break;
}
+ if (mdr->is_auth_pinned(*p))
+ continue;
if (!mdr->can_auth_pin(*p)) {
if (mdr->slave_request->is_nonblock()) {
dout(10) << " can't auth_pin (freezing?) " << **p << " nonblocking" << dendl;
assert(object); // we pinned it
dout(10) << " remote has pinned " << *object << dendl;
if (!mdr->is_auth_pinned(object))
- mdr->remote_auth_pins.insert(object);
+ mdr->remote_auth_pins[object] = from;
if (*p == ack->get_authpin_freeze())
mdr->set_remote_frozen_auth_pin(static_cast<CInode *>(object));
pinned.insert(object);
}
// removed auth pins?
- set<MDSCacheObject*>::iterator p = mdr->remote_auth_pins.begin();
+ map<MDSCacheObject*,int>::iterator p = mdr->remote_auth_pins.begin();
while (p != mdr->remote_auth_pins.end()) {
- if ((*p)->authority().first == from &&
- pinned.count(*p) == 0) {
- dout(10) << " remote has unpinned " << **p << dendl;
- set<MDSCacheObject*>::iterator o = p;
- ++p;
- mdr->remote_auth_pins.erase(o);
+ MDSCacheObject* object = p->first;
+ if (p->second == from && pinned.count(object) == 0) {
+ dout(10) << " remote has unpinned " << *object << dendl;
+ mdr->remote_auth_pins.erase(p++);
} else {
++p;
}