From c975bb881522ac8ac4ece5826bd28191a1a06b19 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 1 Sep 2011 14:56:48 -0700 Subject: [PATCH] mds: move Mutation + children out of MDCache.h Uninline while we're at it. Signed-off-by: Sage Weil --- src/Makefile.am | 2 + src/mds/CDir.cc | 1 + src/mds/CInode.cc | 1 + src/mds/Locker.cc | 1 + src/mds/MDCache.cc | 16 ++ src/mds/MDCache.h | 376 +------------------------------------------- src/mds/Mutation.cc | 196 +++++++++++++++++++++++ src/mds/Mutation.h | 292 ++++++++++++++++++++++++++++++++++ src/mds/Server.cc | 1 + src/mds/journal.cc | 1 + 10 files changed, 516 insertions(+), 371 deletions(-) create mode 100644 src/mds/Mutation.cc create mode 100644 src/mds/Mutation.h diff --git a/src/Makefile.am b/src/Makefile.am index 82fa62ff5fd..cf561ddc2c8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -889,6 +889,7 @@ libmds_a_SOURCES = \ mds/locks.c \ mds/journal.cc \ mds/Server.cc \ + mds/Mutation.cc \ mds/MDCache.cc \ mds/Locker.cc \ mds/Migrator.cc \ @@ -1145,6 +1146,7 @@ noinst_HEADERS = \ mds/MDSTable.h\ mds/MDSTableServer.h\ mds/MDSTableClient.h\ + mds/Mutation.h\ mds/Migrator.h\ mds/Resetter.h\ mds/ScatterLock.h\ diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 42208c98330..81a088bf303 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -18,6 +18,7 @@ #include "CDir.h" #include "CDentry.h" #include "CInode.h" +#include "Mutation.h" #include "MDSMap.h" #include "MDS.h" diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 528d1f8b970..9775fa728be 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -20,6 +20,7 @@ #include "MDCache.h" #include "MDLog.h" #include "Locker.h" +#include "Mutation.h" #include "events/EUpdate.h" diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 2f8c91b610b..5ee3ff3a3ba 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -19,6 +19,7 @@ #include "CInode.h" #include "CDir.h" #include "CDentry.h" +#include "Mutation.h" #include "MDLog.h" #include "MDSMap.h" diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 5422f5b4992..cf76362a8af 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -30,6 +30,8 @@ #include "CInode.h" #include "CDir.h" +#include "Mutation.h" + #include "include/ceph_fs.h" #include "include/filepath.h" @@ -10162,3 +10164,17 @@ void MDCache::dump_cache(const char *fn) myfile.close(); } + + + +C_MDS_RetryRequest::C_MDS_RetryRequest(MDCache *c, MDRequest *r) + : cache(c), mdr(r) +{ + mdr->get(); +} + +void C_MDS_RetryRequest::finish(int r) +{ + cache->dispatch_request(mdr); + mdr->put(); +} diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 21a6c5177cc..0662cfa28e7 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -63,368 +63,9 @@ class MMDSFragmentNotify; class ESubtreeMap; - -// MDCache - -struct Mutation { - metareqid_t reqid; - __u32 attempt; // which attempt for this request - LogSegment *ls; // the log segment i'm committing to - utime_t now; - - // flag mutation as slave - int slave_to_mds; // this is a slave request if >= 0. - - // -- my pins and locks -- - // cache pins (so things don't expire) - set< MDSCacheObject* > pins; - set stickydirs; - - // auth pins - set< MDSCacheObject* > remote_auth_pins; - set< MDSCacheObject* > auth_pins; - - // held locks - set< SimpleLock* > rdlocks; // always local. - set< SimpleLock* > wrlocks; // always local. - map< SimpleLock*, int > remote_wrlocks; - set< SimpleLock* > xlocks; // local or remote. - set< SimpleLock*, SimpleLock::ptr_lt > locks; // full ordering - - // if this flag is set, do not attempt to acquire further locks. - // (useful for wrlock, which may be a moving auth target) - bool done_locking; - bool committing; - bool aborted; - - // for applying projected inode changes - list projected_inodes; - list projected_fnodes; - list updated_locks; - - list dirty_cow_inodes; - list > dirty_cow_dentries; - - Mutation() : - attempt(0), - ls(0), - slave_to_mds(-1), - done_locking(false), committing(false), aborted(false) { } - Mutation(metareqid_t ri, __u32 att=0, int slave_to=-1) : - reqid(ri), attempt(att), - ls(0), - slave_to_mds(slave_to), - done_locking(false), committing(false), aborted(false) { } - virtual ~Mutation() { - assert(pins.empty()); - assert(auth_pins.empty()); - assert(xlocks.empty()); - assert(rdlocks.empty()); - assert(wrlocks.empty()); - assert(remote_wrlocks.empty()); - } - - bool is_master() { return slave_to_mds < 0; } - bool is_slave() { return slave_to_mds >= 0; } - - client_t get_client() { - if (reqid.name.is_client()) - return client_t(reqid.name.num()); - return -1; - } - - // pin items in cache - void pin(MDSCacheObject *o) { - if (pins.count(o) == 0) { - o->get(MDSCacheObject::PIN_REQUEST); - pins.insert(o); - } - } - void set_stickydirs(CInode *in) { - if (stickydirs.count(in) == 0) { - in->get_stickydirs(); - stickydirs.insert(in); - } - } - void drop_pins() { - for (set::iterator it = pins.begin(); - it != pins.end(); - it++) - (*it)->put(MDSCacheObject::PIN_REQUEST); - pins.clear(); - } - - // auth pins - bool is_auth_pinned(MDSCacheObject *object) { - return auth_pins.count(object) || remote_auth_pins.count(object); - } - void auth_pin(MDSCacheObject *object) { - if (!is_auth_pinned(object)) { - object->auth_pin(this); - auth_pins.insert(object); - } - } - void auth_unpin(MDSCacheObject *object) { - assert(auth_pins.count(object)); - object->auth_unpin(this); - auth_pins.erase(object); - } - void drop_local_auth_pins() { - for (set::iterator it = auth_pins.begin(); - it != auth_pins.end(); - it++) { - assert((*it)->is_auth()); - (*it)->auth_unpin(this); - } - auth_pins.clear(); - } - - void add_projected_inode(CInode *in) { - projected_inodes.push_back(in); - } - void pop_and_dirty_projected_inodes() { - while (!projected_inodes.empty()) { - CInode *in = projected_inodes.front(); - projected_inodes.pop_front(); - in->pop_and_dirty_projected_inode(ls); - } - } - - void add_projected_fnode(CDir *dir) { - projected_fnodes.push_back(dir); - } - void pop_and_dirty_projected_fnodes() { - while (!projected_fnodes.empty()) { - CDir *dir = projected_fnodes.front(); - projected_fnodes.pop_front(); - dir->pop_and_dirty_projected_fnode(ls); - } - } - - void add_updated_lock(ScatterLock *lock) { - updated_locks.push_back(lock); - } - - void add_cow_inode(CInode *in) { - pin(in); - dirty_cow_inodes.push_back(in); - } - void add_cow_dentry(CDentry *dn) { - pin(dn); - dirty_cow_dentries.push_back(pair(dn, dn->get_projected_version())); - } - - void apply() { - pop_and_dirty_projected_inodes(); - pop_and_dirty_projected_fnodes(); - - for (list::iterator p = dirty_cow_inodes.begin(); - p != dirty_cow_inodes.end(); - p++) - (*p)->_mark_dirty(ls); - for (list >::iterator p = dirty_cow_dentries.begin(); - p != dirty_cow_dentries.end(); - p++) - p->first->mark_dirty(p->second, ls); - - for (list::iterator p = updated_locks.begin(); - p != updated_locks.end(); - p++) - (*p)->mark_dirty(); - } - - void cleanup() { - drop_local_auth_pins(); - drop_pins(); - } - - virtual void print(ostream &out) { - out << "mutation(" << this << ")"; - } -}; - -inline ostream& operator<<(ostream& out, Mutation &mut) -{ - mut.print(out); - return out; -} - - -/** active_request_t - * state we track for requests we are currently processing. - * 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; - Session *session; - elist::item item_session_request; // if not on list, op is aborted. - - // -- i am a client (master) request - MClientRequest *client_request; // client request (if any) - - // store up to two sets of dn vectors, inode pointers, for request path1 and path2. - vector dn[2]; - CDentry *straydn; - CInode *in[2]; - snapid_t snapid; - - CInode *tracei; - CDentry *tracedn; - - inodeno_t alloc_ino, used_prealloc_ino; - interval_set prealloc_inos; - - int snap_caps; - bool did_early_reply; - - // inos we did a embedded cap release on, and may need to eval if we haven't since reissued - map cap_releases; - - // -- i am a slave request - MMDSSlaveRequest *slave_request; // slave request (if one is pending; implies slave == true) - - // -- i am an internal op - int internal_op; - - // break rarely-used fields into a separately allocated structure - // to save memory for most ops - struct More { - set slaves; // mds nodes that have slave requests to me (implies client_request) - set waiting_on_slave; // peers i'm waiting for slavereq replies from. - - // for rename/link/unlink - set witnessed; // nodes who have journaled a RenamePrepare - map pvmap; - - // for rename - set extra_witnesses; // replica list from srcdn auth (rename) - version_t src_reanchor_atid; // src->dst - version_t dst_reanchor_atid; // dst->stray - bufferlist inode_import; - version_t inode_import_v; - CInode* destdn_was_remote_inode; - bool was_link_merge; - - map imported_client_map; - map sseq_map; - map > cap_imports; - - // for lock/flock - bool flock_was_waiting; - - // for snaps - version_t stid; - bufferlist snapidbl; - - // called when slave commits or aborts - Context *slave_commit; - bufferlist rollback_bl; - - More() : - src_reanchor_atid(0), dst_reanchor_atid(0), inode_import_v(0), - destdn_was_remote_inode(0), was_link_merge(false), - flock_was_waiting(false), - stid(0), - slave_commit(0) { } - } *_more; - - - // --------------------------------------------------- - MDRequest() : - 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), - slave_request(0), - internal_op(-1), - _more(0) { - in[0] = in[1] = 0; - } - MDRequest(metareqid_t ri, __u32 attempt, MClientRequest *req) : - 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), - slave_request(0), - internal_op(-1), - _more(0) { - in[0] = in[1] = 0; - } - MDRequest(metareqid_t ri, __u32 attempt, int by) : - 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), - slave_request(0), - internal_op(-1), - _more(0) { - in[0] = in[1] = 0; - } - ~MDRequest() { - if (client_request) - client_request->put(); - if (slave_request) - slave_request->put(); - delete _more; - } - - MDRequest *get() { - ++ref; - return this; - } - void put() { - if (--ref == 0) - delete this; - } - - More* more() { - if (!_more) _more = new More(); - return _more; - } - - bool are_slaves() { - return _more && !_more->slaves.empty(); - } - - bool slave_did_prepare() { return more()->slave_commit; } - - bool did_ino_allocation() { - return alloc_ino || used_prealloc_ino || prealloc_inos.size(); - } - - void print(ostream &out) { - out << "request(" << reqid; - //if (request) out << " " << *request; - if (is_slave()) out << " slave_to mds" << slave_to_mds; - if (client_request) out << " cr=" << client_request; - if (slave_request) out << " sr=" << slave_request; - out << ")"; - } -}; - - -struct MDSlaveUpdate { - int origop; - bufferlist rollback; - elist::item item; - Context *waiter; - MDSlaveUpdate(int oo, bufferlist &rbl, elist &list) : - origop(oo), - item(this), - waiter(0) { - rollback.claim(rbl); - list.push_back(&item); - } - ~MDSlaveUpdate() { - item.remove_myself(); - if (waiter) - waiter->finish(0); - delete waiter; - } -}; +class Mutation; +class MDRequest; +class MDSlaveUpdate; // flags for predirty_journal_parents() @@ -432,8 +73,6 @@ static const int PREDIRTY_PRIMARY = 1; // primary dn, adjust nested accounting static const int PREDIRTY_DIR = 2; // update parent dir mtime/size static const int PREDIRTY_SHALLOW = 4; // only go to immediate parent (for easier rollback) - - class MDCache { public: // my master @@ -1268,13 +907,8 @@ class C_MDS_RetryRequest : public Context { MDCache *cache; MDRequest *mdr; public: - C_MDS_RetryRequest(MDCache *c, MDRequest *r) : cache(c), mdr(r) { - mdr->get(); - } - virtual void finish(int r) { - cache->dispatch_request(mdr); - mdr->put(); - } + C_MDS_RetryRequest(MDCache *c, MDRequest *r); + virtual void finish(int r); }; #endif diff --git a/src/mds/Mutation.cc b/src/mds/Mutation.cc new file mode 100644 index 00000000000..47380f14613 --- /dev/null +++ b/src/mds/Mutation.cc @@ -0,0 +1,196 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2004-2006 Sage Weil + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#include "Mutation.h" +#include "ScatterLock.h" +#include "CDir.h" + +#include "messages/MClientRequest.h" +#include "messages/MMDSSlaveRequest.h" + + +// Mutation + +void Mutation::pin(MDSCacheObject *o) +{ + if (pins.count(o) == 0) { + o->get(MDSCacheObject::PIN_REQUEST); + pins.insert(o); + } +} + +void Mutation::set_stickydirs(CInode *in) +{ + if (stickydirs.count(in) == 0) { + in->get_stickydirs(); + stickydirs.insert(in); + } +} + +void Mutation::drop_pins() +{ + for (set::iterator it = pins.begin(); + it != pins.end(); + it++) + (*it)->put(MDSCacheObject::PIN_REQUEST); + pins.clear(); +} + + // auth pins +bool Mutation::is_auth_pinned(MDSCacheObject *object) +{ + return auth_pins.count(object) || remote_auth_pins.count(object); +} + +void Mutation::auth_pin(MDSCacheObject *object) +{ + if (!is_auth_pinned(object)) { + object->auth_pin(this); + auth_pins.insert(object); + } +} + +void Mutation::auth_unpin(MDSCacheObject *object) +{ + assert(auth_pins.count(object)); + object->auth_unpin(this); + auth_pins.erase(object); +} + +void Mutation::drop_local_auth_pins() +{ + for (set::iterator it = auth_pins.begin(); + it != auth_pins.end(); + it++) { + assert((*it)->is_auth()); + (*it)->auth_unpin(this); + } + auth_pins.clear(); +} + +void Mutation::add_projected_inode(CInode *in) +{ + projected_inodes.push_back(in); +} + +void Mutation::pop_and_dirty_projected_inodes() +{ + while (!projected_inodes.empty()) { + CInode *in = projected_inodes.front(); + projected_inodes.pop_front(); + in->pop_and_dirty_projected_inode(ls); + } +} + +void Mutation::add_projected_fnode(CDir *dir) +{ + projected_fnodes.push_back(dir); +} + +void Mutation::pop_and_dirty_projected_fnodes() +{ + while (!projected_fnodes.empty()) { + CDir *dir = projected_fnodes.front(); + projected_fnodes.pop_front(); + dir->pop_and_dirty_projected_fnode(ls); + } +} + +void Mutation::add_updated_lock(ScatterLock *lock) +{ + updated_locks.push_back(lock); +} + +void Mutation::add_cow_inode(CInode *in) +{ + pin(in); + dirty_cow_inodes.push_back(in); +} + +void Mutation::add_cow_dentry(CDentry *dn) +{ + pin(dn); + dirty_cow_dentries.push_back(pair(dn, dn->get_projected_version())); +} + +void Mutation::apply() +{ + pop_and_dirty_projected_inodes(); + pop_and_dirty_projected_fnodes(); + + for (list::iterator p = dirty_cow_inodes.begin(); + p != dirty_cow_inodes.end(); + p++) + (*p)->_mark_dirty(ls); + for (list >::iterator p = dirty_cow_dentries.begin(); + p != dirty_cow_dentries.end(); + p++) + p->first->mark_dirty(p->second, ls); + + for (list::iterator p = updated_locks.begin(); + p != updated_locks.end(); + p++) + (*p)->mark_dirty(); +} + +void Mutation::cleanup() +{ + drop_local_auth_pins(); + drop_pins(); +} + + +// MDRequest + +MDRequest::~MDRequest() +{ + if (client_request) + client_request->put(); + if (slave_request) + slave_request->put(); + delete _more; +} + +MDRequest::More* MDRequest::more() +{ + if (!_more) + _more = new More(); + return _more; +} + +bool MDRequest::are_slaves() +{ + return _more && !_more->slaves.empty(); +} + +bool MDRequest::slave_did_prepare() +{ + return more()->slave_commit; +} + +bool MDRequest::did_ino_allocation() +{ + return alloc_ino || used_prealloc_ino || prealloc_inos.size(); +} + +void MDRequest::print(ostream &out) +{ + out << "request(" << reqid; + //if (request) out << " " << *request; + if (is_slave()) out << " slave_to mds" << slave_to_mds; + if (client_request) out << " cr=" << client_request; + if (slave_request) out << " sr=" << slave_request; + out << ")"; +} + diff --git a/src/mds/Mutation.h b/src/mds/Mutation.h new file mode 100644 index 00000000000..71f04159322 --- /dev/null +++ b/src/mds/Mutation.h @@ -0,0 +1,292 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2004-2006 Sage Weil + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#ifndef CEPH_MDS_MUTATION_H +#define CEPH_MDS_MUTATION_H + +#include "include/interval_set.h" +#include "include/elist.h" + +#include "mdstypes.h" + +#include "SimpleLock.h" +#include "Capability.h" + +class LogSegment; +class Capability; +class CInode; +class CDir; +class CDentry; +class Session; +class ScatterLock; +class MClientRequest; +class MMDSSlaveRequest; + +struct Mutation { + metareqid_t reqid; + __u32 attempt; // which attempt for this request + LogSegment *ls; // the log segment i'm committing to + utime_t now; + + // flag mutation as slave + int slave_to_mds; // this is a slave request if >= 0. + + // -- my pins and locks -- + // cache pins (so things don't expire) + set< MDSCacheObject* > pins; + set stickydirs; + + // auth pins + set< MDSCacheObject* > remote_auth_pins; + set< MDSCacheObject* > auth_pins; + + // held locks + set< SimpleLock* > rdlocks; // always local. + set< SimpleLock* > wrlocks; // always local. + map< SimpleLock*, int > remote_wrlocks; + set< SimpleLock* > xlocks; // local or remote. + set< SimpleLock*, SimpleLock::ptr_lt > locks; // full ordering + + // if this flag is set, do not attempt to acquire further locks. + // (useful for wrlock, which may be a moving auth target) + bool done_locking; + bool committing; + bool aborted; + + // for applying projected inode changes + list projected_inodes; + list projected_fnodes; + list updated_locks; + + list dirty_cow_inodes; + list > dirty_cow_dentries; + + Mutation() : + attempt(0), + ls(0), + slave_to_mds(-1), + done_locking(false), committing(false), aborted(false) { } + Mutation(metareqid_t ri, __u32 att=0, int slave_to=-1) : + reqid(ri), attempt(att), + ls(0), + slave_to_mds(slave_to), + done_locking(false), committing(false), aborted(false) { } + virtual ~Mutation() { + assert(pins.empty()); + assert(auth_pins.empty()); + assert(xlocks.empty()); + assert(rdlocks.empty()); + assert(wrlocks.empty()); + assert(remote_wrlocks.empty()); + } + + bool is_master() { return slave_to_mds < 0; } + bool is_slave() { return slave_to_mds >= 0; } + + client_t get_client() { + if (reqid.name.is_client()) + return client_t(reqid.name.num()); + return -1; + } + + // pin items in cache + void pin(MDSCacheObject *o); + void set_stickydirs(CInode *in); + void drop_pins(); + + // auth pins + bool is_auth_pinned(MDSCacheObject *object); + void auth_pin(MDSCacheObject *object); + void auth_unpin(MDSCacheObject *object); + void drop_local_auth_pins(); + void add_projected_inode(CInode *in); + void pop_and_dirty_projected_inodes(); + void add_projected_fnode(CDir *dir); + void pop_and_dirty_projected_fnodes(); + void add_updated_lock(ScatterLock *lock); + void add_cow_inode(CInode *in); + void add_cow_dentry(CDentry *dn); + void apply(); + void cleanup(); + + virtual void print(ostream &out) { + out << "mutation(" << this << ")"; + } +}; + +inline ostream& operator<<(ostream& out, Mutation &mut) +{ + mut.print(out); + return out; +} + + + + + +/** active_request_t + * state we track for requests we are currently processing. + * 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; + Session *session; + elist::item item_session_request; // if not on list, op is aborted. + + // -- i am a client (master) request + MClientRequest *client_request; // client request (if any) + + // store up to two sets of dn vectors, inode pointers, for request path1 and path2. + vector dn[2]; + CDentry *straydn; + CInode *in[2]; + snapid_t snapid; + + CInode *tracei; + CDentry *tracedn; + + inodeno_t alloc_ino, used_prealloc_ino; + interval_set prealloc_inos; + + int snap_caps; + bool did_early_reply; + + // inos we did a embedded cap release on, and may need to eval if we haven't since reissued + map cap_releases; + + // -- i am a slave request + MMDSSlaveRequest *slave_request; // slave request (if one is pending; implies slave == true) + + // -- i am an internal op + int internal_op; + + // break rarely-used fields into a separately allocated structure + // to save memory for most ops + struct More { + set slaves; // mds nodes that have slave requests to me (implies client_request) + set waiting_on_slave; // peers i'm waiting for slavereq replies from. + + // for rename/link/unlink + set witnessed; // nodes who have journaled a RenamePrepare + map pvmap; + + // for rename + set extra_witnesses; // replica list from srcdn auth (rename) + version_t src_reanchor_atid; // src->dst + version_t dst_reanchor_atid; // dst->stray + bufferlist inode_import; + version_t inode_import_v; + CInode* destdn_was_remote_inode; + bool was_link_merge; + + map imported_client_map; + map sseq_map; + map > cap_imports; + + // for lock/flock + bool flock_was_waiting; + + // for snaps + version_t stid; + bufferlist snapidbl; + + // called when slave commits or aborts + Context *slave_commit; + bufferlist rollback_bl; + + More() : + src_reanchor_atid(0), dst_reanchor_atid(0), inode_import_v(0), + destdn_was_remote_inode(0), was_link_merge(false), + flock_was_waiting(false), + stid(0), + slave_commit(0) { } + } *_more; + + + // --------------------------------------------------- + MDRequest() : + 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), + slave_request(0), + internal_op(-1), + _more(0) { + in[0] = in[1] = 0; + } + MDRequest(metareqid_t ri, __u32 attempt, MClientRequest *req) : + 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), + slave_request(0), + internal_op(-1), + _more(0) { + in[0] = in[1] = 0; + } + MDRequest(metareqid_t ri, __u32 attempt, int by) : + 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), + slave_request(0), + internal_op(-1), + _more(0) { + in[0] = in[1] = 0; + } + ~MDRequest(); + + MDRequest *get() { + ++ref; + return this; + } + void put() { + if (--ref == 0) + delete this; + } + + More* more(); + bool are_slaves(); + bool slave_did_prepare(); + bool did_ino_allocation(); + + void print(ostream &out); +}; + + +struct MDSlaveUpdate { + int origop; + bufferlist rollback; + elist::item item; + Context *waiter; + MDSlaveUpdate(int oo, bufferlist &rbl, elist &list) : + origop(oo), + item(this), + waiter(0) { + rollback.claim(rbl); + list.push_back(&item); + } + ~MDSlaveUpdate() { + item.remove_myself(); + if (waiter) + waiter->finish(0); + delete waiter; + } +}; + + +#endif diff --git a/src/mds/Server.cc b/src/mds/Server.cc index d8de4b46d93..51f93a5e143 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -22,6 +22,7 @@ #include "AnchorClient.h" #include "InoTable.h" #include "SnapClient.h" +#include "Mutation.h" #include "msg/Messenger.h" diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 1d40b5eab02..a35523ca6d2 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -43,6 +43,7 @@ #include "MDCache.h" #include "Server.h" #include "Migrator.h" +#include "Mutation.h" #include "InoTable.h" #include "MDSTableClient.h"