}
-// MDRequest
+// MDRequestImpl
-MDRequest::~MDRequest()
+MDRequestImpl::~MDRequestImpl()
{
if (client_request)
client_request->put();
delete _more;
}
-MDRequest::More* MDRequest::more()
+MDRequestImpl::More* MDRequestImpl::more()
{
if (!_more)
_more = new More();
return _more;
}
-bool MDRequest::has_more()
+bool MDRequestImpl::has_more()
{
return _more;
}
-bool MDRequest::are_slaves()
+bool MDRequestImpl::are_slaves()
{
return _more && !_more->slaves.empty();
}
-bool MDRequest::slave_did_prepare()
+bool MDRequestImpl::slave_did_prepare()
{
return more()->slave_commit;
}
-bool MDRequest::did_ino_allocation()
+bool MDRequestImpl::did_ino_allocation()
{
return alloc_ino || used_prealloc_ino || prealloc_inos.size();
}
-bool MDRequest::freeze_auth_pin(CInode *inode)
+bool MDRequestImpl::freeze_auth_pin(CInode *inode)
{
assert(!more()->rename_inode || more()->rename_inode == inode);
more()->rename_inode = inode;
return true;
}
-void MDRequest::unfreeze_auth_pin(bool clear_inode)
+void MDRequestImpl::unfreeze_auth_pin(bool clear_inode)
{
assert(more()->is_freeze_authpin);
CInode *inode = more()->rename_inode;
more()->rename_inode = NULL;
}
-void MDRequest::set_remote_frozen_auth_pin(CInode *inode)
+void MDRequestImpl::set_remote_frozen_auth_pin(CInode *inode)
{
assert(!more()->rename_inode || more()->rename_inode == inode);
more()->rename_inode = inode;
more()->is_remote_frozen_authpin = true;
}
-void MDRequest::set_ambiguous_auth(CInode *inode)
+void MDRequestImpl::set_ambiguous_auth(CInode *inode)
{
assert(!more()->rename_inode || more()->rename_inode == inode);
assert(!more()->is_ambiguous_auth);
more()->is_ambiguous_auth = true;
}
-void MDRequest::clear_ambiguous_auth()
+void MDRequestImpl::clear_ambiguous_auth()
{
CInode *inode = more()->rename_inode;
assert(inode && more()->is_ambiguous_auth);
more()->is_ambiguous_auth = false;
}
-bool MDRequest::can_auth_pin(MDSCacheObject *object)
+bool MDRequestImpl::can_auth_pin(MDSCacheObject *object)
{
return object->can_auth_pin() ||
(is_auth_pinned(object) && has_more() &&
more()->rename_inode == object);
}
-void MDRequest::drop_local_auth_pins()
+void MDRequestImpl::drop_local_auth_pins()
{
if (has_more() && more()->is_freeze_authpin)
unfreeze_auth_pin(true);
Mutation::drop_local_auth_pins();
}
-void MDRequest::print(ostream &out)
+void MDRequestImpl::print(ostream &out)
{
out << "request(" << reqid;
//if (request) out << " " << *request;
* mostly information about locks held, so that we can drop them all
* the request is finished or forwarded. see request_*().
*/
-struct MDRequest : public Mutation {
- int ref;
+struct MDRequestImpl : public Mutation {
+ ceph::weak_ptr<MDRequestImpl> self_ref;
Session *session;
- elist<MDRequest*>::item item_session_request; // if not on list, op is aborted.
+ elist<MDRequestImpl*>::item item_session_request; // if not on list, op is aborted.
// -- i am a client (master) request
MClientRequest *client_request; // client request (if any)
// ---------------------------------------------------
- MDRequest() :
- ref(1),
+ MDRequestImpl() :
+ self_ref(),
session(0), item_session_request(this),
client_request(0), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
_more(0) {
in[0] = in[1] = 0;
}
- MDRequest(metareqid_t ri, __u32 attempt, MClientRequest *req) :
+ MDRequestImpl(metareqid_t ri, __u32 attempt, MClientRequest *req) :
+ self_ref(),
Mutation(ri, attempt),
- ref(1),
session(0), item_session_request(this),
client_request(req), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
_more(0) {
in[0] = in[1] = 0;
}
- MDRequest(metareqid_t ri, __u32 attempt, int by) :
+ MDRequestImpl(metareqid_t ri, __u32 attempt, int by) :
+ self_ref(),
Mutation(ri, attempt, by),
- ref(1),
session(0), item_session_request(this),
client_request(0), straydn(NULL), snapid(CEPH_NOSNAP), tracei(0), tracedn(0),
alloc_ino(0), used_prealloc_ino(0), snap_caps(0), did_early_reply(false),
_more(0) {
in[0] = in[1] = 0;
}
- ~MDRequest();
-
- MDRequest *get() {
- ++ref;
- return this;
- }
- void put() {
- if (--ref == 0)
- delete this;
- }
+ ~MDRequestImpl();
More* more();
bool has_more();
void clear_ambiguous_auth();
void print(ostream &out);
+ void set_self_ref(ceph::shared_ptr<MDRequestImpl>& ref) {
+ self_ref = ref;
+ }
};
+typedef ceph::shared_ptr<MDRequestImpl> MDRequestRef;
+
struct MDSlaveUpdate {
int origop;
mdlog->flush();
// clean up requests, too
- elist<MDRequest*>::iterator p = session->requests.begin(member_offset(MDRequest,
- item_session_request));
+ elist<MDRequestImpl*>::iterator p =
+ session->requests.begin(member_offset(MDRequestImpl,
+ item_session_request));
while (!p.end()) {
- MDRequest *mdr = *p;
+ MDRequestImpl *mdr = *p;
++p;
mdcache->request_kill(mdr);
}
#include "mdstypes.h"
class CInode;
-struct MDRequest;
+struct MDRequestImpl;
#include "CInode.h"
#include "Capability.h"
list<Message*> preopen_out_queue; ///< messages for client, queued before they connect
- elist<MDRequest*> requests;
+ elist<MDRequestImpl*> requests;
interval_set<inodeno_t> pending_prealloc_inos; // journaling prealloc, will be added to prealloc_inos