summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-11-30 08:26:25 -0800
committerSage Weil <sage@inktank.com>2012-11-30 08:26:25 -0800
commit7412bd3675e3e941eeaefeb7d48b32007751357a (patch)
tree2c44de5fe0d6f5304a56d71693ece6f38d441133
parent9cd730bd505315fa030f36d75b31ae7bd99267fe (diff)
parent909b92e812c7bce70c8d5202fb2f6099f02a26eb (diff)
downloadceph-7412bd3675e3e941eeaefeb7d48b32007751357a.tar.gz
Merge remote-tracking branch 'gh/wip-mds-ls2'
Reviewed-by: Greg Farnum <greg@inktank.com>
-rw-r--r--src/mds/MDCache.cc18
-rw-r--r--src/mds/MDLog.cc2
-rw-r--r--src/mds/MDLog.h8
-rw-r--r--src/mds/Mutation.h5
-rw-r--r--src/mds/Server.cc12
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));
}