#include "ScatterLock.h"
#include "CDir.h"
-#include "messages/MClientRequest.h"
-#include "messages/MMDSSlaveRequest.h"
-
-
// MutationImpl
void MutationImpl::pin(MDSCacheObject *o)
void MutationImpl::unpin(MDSCacheObject *o)
{
- assert(pins.count(o));
+ ceph_assert(pins.count(o));
o->put(MDSCacheObject::PIN_REQUEST);
pins.erase(o);
}
void MutationImpl::set_stickydirs(CInode *in)
{
- if (stickydirs.count(in) == 0) {
+ if (!stickydiri || stickydiri != in) {
in->get_stickydirs();
- stickydirs.insert(in);
+ if (stickydiri)
+ stickydiri->put_stickydirs();
+ stickydiri = in;
+ }
+}
+
+void MutationImpl::put_stickydirs()
+{
+ if (stickydiri) {
+ stickydiri->put_stickydirs();
+ stickydiri = nullptr;
+
}
}
void MutationImpl::drop_pins()
{
- for (set<MDSCacheObject*>::iterator it = pins.begin();
- it != pins.end();
- ++it)
- (*it)->put(MDSCacheObject::PIN_REQUEST);
+ for (auto& o : pins)
+ o->put(MDSCacheObject::PIN_REQUEST);
pins.clear();
}
void MutationImpl::start_locking(SimpleLock *lock, int target)
{
- assert(locking == NULL);
+ ceph_assert(locking == NULL);
pin(lock->get_parent());
locking = lock;
locking_target_mds = target;
void MutationImpl::finish_locking(SimpleLock *lock)
{
- assert(locking == lock);
+ ceph_assert(locking == lock);
locking = NULL;
locking_target_mds = -1;
}
+void MutationImpl::LockOpVec::erase_rdlock(SimpleLock* lock)
+{
+ for (int i = size() - 1; i >= 0; --i) {
+ auto& op = (*this)[i];
+ if (op.lock == lock && op.is_rdlock()) {
+ erase(begin() + i);
+ return;
+ }
+ }
+}
+
+void MutationImpl::LockOpVec::sort_and_merge()
+{
+ std::sort(begin(), end(), SimpleLock::ptr_lt());
+ // merge ops on the same lock
+ for (auto i = end() - 1; i > begin(); ) {
+ auto j = i;
+ while (--j >= begin()) {
+ if (i->lock != j->lock)
+ break;
+ }
+ if (i - j == 1) {
+ i = j;
+ continue;
+ }
+
+ // merge
+ ++j;
+ for (auto k = i; k > j; --k) {
+ if (k->is_remote_wrlock()) {
+ ceph_assert(!j->is_remote_wrlock());
+ j->wrlock_target = k->wrlock_target;
+ }
+ j->flags |= k->flags;
+ }
+ if (j->is_xlock()) {
+ // xlock overwrites other types
+ ceph_assert(!j->is_remote_wrlock());
+ j->flags = MutationImpl::LockOp::XLOCK;
+ }
+ erase(j + 1, i + 1);
+ i = j - 1;
+ }
+}
// auth pins
bool MutationImpl::is_auth_pinned(MDSCacheObject *object) const
void MutationImpl::auth_unpin(MDSCacheObject *object)
{
- assert(auth_pins.count(object));
+ ceph_assert(auth_pins.count(object));
object->auth_unpin(this);
auth_pins.erase(object);
}
void MutationImpl::drop_local_auth_pins()
{
- for (set<MDSCacheObject*>::iterator it = auth_pins.begin();
- it != auth_pins.end();
- ++it) {
- assert((*it)->is_auth());
- (*it)->auth_unpin(this);
+ for (const auto& p : auth_pins) {
+ ceph_assert(p->is_auth());
+ p->auth_unpin(this);
}
auth_pins.clear();
}
MDRequestImpl::~MDRequestImpl()
{
- if (client_request)
- client_request->put();
- if (slave_request)
- slave_request->put();
delete _more;
}
bool MDRequestImpl::freeze_auth_pin(CInode *inode)
{
- assert(!more()->rename_inode || more()->rename_inode == inode);
+ ceph_assert(!more()->rename_inode || more()->rename_inode == inode);
more()->rename_inode = inode;
more()->is_freeze_authpin = true;
auth_pin(inode);
void MDRequestImpl::unfreeze_auth_pin(bool clear_inode)
{
- assert(more()->is_freeze_authpin);
+ ceph_assert(more()->is_freeze_authpin);
CInode *inode = more()->rename_inode;
if (inode->is_frozen_auth_pin())
inode->unfreeze_auth_pin();
void MDRequestImpl::set_ambiguous_auth(CInode *inode)
{
- assert(!more()->rename_inode || more()->rename_inode == inode);
- assert(!more()->is_ambiguous_auth);
+ ceph_assert(!more()->rename_inode || more()->rename_inode == inode);
+ ceph_assert(!more()->is_ambiguous_auth);
inode->set_ambiguous_auth();
more()->rename_inode = inode;
void MDRequestImpl::clear_ambiguous_auth()
{
CInode *inode = more()->rename_inode;
- assert(inode && more()->is_ambiguous_auth);
+ ceph_assert(inode && more()->is_ambiguous_auth);
inode->clear_ambiguous_auth();
more()->is_ambiguous_auth = false;
}
void MDRequestImpl::set_filepath(const filepath& fp)
{
- assert(!client_request);
+ ceph_assert(!client_request);
more()->filepath1 = fp;
}
void MDRequestImpl::set_filepath2(const filepath& fp)
{
- assert(!client_request);
+ ceph_assert(!client_request);
more()->filepath2 = fp;
}
return client_request ? client_request->is_queued_for_replay() : false;
}
-MClientRequest* MDRequestImpl::release_client_request()
+MClientRequest::const_ref MDRequestImpl::release_client_request()
{
msg_lock.lock();
- auto req = client_request;
- client_request = nullptr;
+ MClientRequest::const_ref req;
+ req.swap(client_request);
msg_lock.unlock();
return req;
}
-void MDRequestImpl::reset_slave_request(MMDSSlaveRequest *req)
+void MDRequestImpl::reset_slave_request(const MMDSSlaveRequest::const_ref& req)
{
msg_lock.lock();
- auto old = slave_request;
+ MMDSSlaveRequest::const_ref old;
+ old.swap(slave_request);
slave_request = req;
msg_lock.unlock();
- if (old)
- old->put();
+ old.reset();
}
void MDRequestImpl::print(ostream &out) const
f->dump_stream("reqid") << reqid;
{
msg_lock.lock();
- boost::intrusive_ptr<MClientRequest> _client_request(client_request);
- boost::intrusive_ptr<MMDSSlaveRequest> _slave_request(slave_request);
+ auto _client_request = client_request;
+ auto _slave_request =slave_request;
msg_lock.unlock();
if (_client_request) {
}
{
f->open_array_section("events");
- Mutex::Locker l(lock);
+ std::lock_guard l(lock);
for (auto& i : events) {
f->dump_object("event", i);
}
void MDRequestImpl::_dump_op_descriptor_unlocked(ostream& stream) const
{
msg_lock.lock();
- boost::intrusive_ptr<MClientRequest> _client_request(client_request);
- boost::intrusive_ptr<MMDSSlaveRequest> _slave_request(slave_request);
+ auto _client_request = client_request;
+ auto _slave_request = slave_request;
msg_lock.unlock();
if (_client_request) {