diff options
author | Sage Weil <sage@inktank.com> | 2012-11-30 08:26:25 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-11-30 08:26:25 -0800 |
commit | 7412bd3675e3e941eeaefeb7d48b32007751357a (patch) | |
tree | 2c44de5fe0d6f5304a56d71693ece6f38d441133 | |
parent | 9cd730bd505315fa030f36d75b31ae7bd99267fe (diff) | |
parent | 909b92e812c7bce70c8d5202fb2f6099f02a26eb (diff) | |
download | ceph-7412bd3675e3e941eeaefeb7d48b32007751357a.tar.gz |
Merge remote-tracking branch 'gh/wip-mds-ls2'
Reviewed-by: Greg Farnum <greg@inktank.com>
-rw-r--r-- | src/mds/MDCache.cc | 18 | ||||
-rw-r--r-- | src/mds/MDLog.cc | 2 | ||||
-rw-r--r-- | src/mds/MDLog.h | 8 | ||||
-rw-r--r-- | src/mds/Mutation.h | 5 | ||||
-rw-r--r-- | src/mds/Server.cc | 12 |
5 files changed, 27 insertions, 18 deletions
diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 993cbcf5ad7..5f0ba16defd 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7488,12 +7488,11 @@ void MDCache::request_forward(MDRequest *mdr, int who, int port) void MDCache::dispatch_request(MDRequest *mdr) { + if (mdr->killed) { + dout(10) << "request " << *mdr << " was killed" << dendl; + return; + } if (mdr->client_request) { - if (!mdr->reqid.name.is_mds() && - !mdr->item_session_request.is_on_list()) { - dout(10) << "request " << *mdr << " is canceled" << dendl; - return; - } mds->server->dispatch_client_request(mdr); } else if (mdr->slave_request) { mds->server->dispatch_slave_request(mdr); @@ -7605,8 +7604,13 @@ void MDCache::request_cleanup(MDRequest *mdr) void MDCache::request_kill(MDRequest *mdr) { - dout(10) << "request_kill " << *mdr << dendl; - request_cleanup(mdr); + mdr->killed = true; + if (!mdr->committing) { + dout(10) << "request_kill " << *mdr << dendl; + request_cleanup(mdr); + } else { + dout(10) << "request_kill " << *mdr << " -- already committing, no-op" << dendl; + } } diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index b02c1810cfc..4284b6dfdf1 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -415,7 +415,7 @@ void MDLog::_expired(LogSegment *ls) { dout(5) << "_expired segment " << ls->offset << " " << ls->num_events << " events" << dendl; - if (!capped && ls == get_current_segment()) { + if (!capped && ls == peek_current_segment()) { dout(5) << "_expired not expiring " << ls->offset << ", last one and !capped" << dendl; } else { // expired. diff --git a/src/mds/MDLog.h b/src/mds/MDLog.h index 2e049e8aed4..9a547f0d791 100644 --- a/src/mds/MDLog.h +++ b/src/mds/MDLog.h @@ -161,8 +161,14 @@ public: // -- segments -- void start_new_segment(Context *onsync=0); + + LogSegment *peek_current_segment() { + return segments.empty() ? NULL : segments.rbegin()->second; + } + LogSegment *get_current_segment() { - return segments.empty() ? 0:segments.rbegin()->second; + assert(!segments.empty()); + return segments.rbegin()->second; } LogSegment *get_segment(uint64_t off) { diff --git a/src/mds/Mutation.h b/src/mds/Mutation.h index ca5ee963a91..cba6223864e 100644 --- a/src/mds/Mutation.h +++ b/src/mds/Mutation.h @@ -67,6 +67,7 @@ struct Mutation { bool done_locking; bool committing; bool aborted; + bool killed; // for applying projected inode changes list<CInode*> projected_inodes; @@ -81,13 +82,13 @@ struct Mutation { ls(0), slave_to_mds(-1), locking(NULL), - done_locking(false), committing(false), aborted(false) { } + done_locking(false), committing(false), aborted(false), killed(false) { } Mutation(metareqid_t ri, __u32 att=0, int slave_to=-1) : reqid(ri), attempt(att), ls(0), slave_to_mds(slave_to), locking(NULL), - done_locking(false), committing(false), aborted(false) { } + done_locking(false), committing(false), aborted(false), killed(false) { } virtual ~Mutation() { assert(locking == NULL); assert(pins.empty()); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index fbb0289c283..d5548a8493c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -496,12 +496,13 @@ void Server::journal_close_session(Session *session, int state) mdlog->flush(); // clean up requests, too - while (!session->requests.empty()) { - MDRequest *mdr = session->requests.front(member_offset(MDRequest, - item_session_request)); + elist<MDRequest*>::iterator p = session->requests.begin(member_offset(MDRequest, + item_session_request)); + while (!p.end()) { + MDRequest *mdr = *p; + ++p; mdcache->request_kill(mdr); } - } void Server::reconnect_clients() @@ -3997,9 +3998,6 @@ void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti if (mdr->more()->dst_reanchor_atid) le->metablob.add_table_transaction(TABLE_ANCHOR, mdr->more()->dst_reanchor_atid); - // mark committing (needed for proper recovery) - mdr->committing = true; - journal_and_reply(mdr, targeti, dn, le, new C_MDS_link_remote_finish(mds, mdr, inc, dn, targeti)); } |