} else {
// if the lock is the latest locked one, it's possible that slave mds got the lock
// while there are recovering mds.
- if (!mdr->locks.count(lock) || lock == *mdr->locks.rbegin())
+ if (!mdr->locks.count(lock) || lock == mdr->locks.rbegin()->lock)
wait = true;
}
if (wait) {
}
}
}
-
void MutationImpl::LockOpVec::sort_and_merge()
{
- std::sort(begin(), end(), SimpleLock::ptr_lt());
+ std::sort(begin(), end());
// merge ops on the same lock
for (auto i = end() - 1; i > begin(); ) {
auto j = i;
i = j;
continue;
}
-
// merge
++j;
for (auto k = i; k > j; --k) {
SimpleLock* lock;
mutable unsigned flags;
mutable mds_rank_t wrlock_target;
- operator SimpleLock*() const {
- return lock;
- }
LockOp(SimpleLock *l, unsigned f=0, mds_rank_t t=MDS_RANK_NONE) :
lock(l), flags(f), wrlock_target(t) {}
bool is_rdlock() const { return !!(flags & RDLOCK); }
wrlock_target = MDS_RANK_NONE;
}
bool is_state_pin() const { return !!(flags & STATE_PIN); }
+
+ bool operator<(const LockOp& r) const {
+ if ((lock->type->type <= CEPH_LOCK_DN) && (r.lock->type->type > CEPH_LOCK_DN))
+ return true;
+ if ((lock->type->type > CEPH_LOCK_DN) == (r.lock->type->type > CEPH_LOCK_DN)) {
+ auto lp = lock->get_parent();
+ auto rp = r.lock->get_parent();
+ // then sort by object
+ if (lp == rp)
+ return (lock->type->type < r.lock->type->type);
+ return lp->is_lt(rp);
+ }
+ return false;
+ }
};
struct LockOpVec : public vector<LockOp> {
reserve(32);
}
};
- typedef set<LockOp, SimpleLock::ptr_lt> lock_set;
+ typedef set<LockOp> lock_set;
typedef lock_set::iterator lock_iterator;
lock_set locks; // full ordering
}
}
- struct ptr_lt {
- bool operator()(const SimpleLock* l, const SimpleLock* r) const {
- // first sort by object type (dn < inode)
- if (!(l->type->type > CEPH_LOCK_DN) && (r->type->type > CEPH_LOCK_DN)) return true;
- if ((l->type->type > CEPH_LOCK_DN) == (r->type->type > CEPH_LOCK_DN)) {
- // then sort by object
- if (l->parent->is_lt(r->parent)) return true;
- if (l->parent == r->parent) {
- // then sort by (inode) lock type
- if (l->type->type < r->type->type) return true;
- }
- }
- return false;
- }
- };
-
void decode_locked_state(const bufferlist& bl) {
parent->decode_lock_state(type->type, bl);
}