summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-07-14 14:44:14 -0700
committerSage Weil <sage@inktank.com>2012-07-14 17:40:21 -0700
commit2f78c4850af2574caeb5437a5b576e1372939499 (patch)
tree5b6d71edbcbc2d0f1683d2d69d5c85e9e57ae1c9
parent9c44c37ce98ac667edc2e1cf5c6483ecdc320bde (diff)
downloadceph-wip-osd-redirect.tar.gz
-rw-r--r--src/osd/OSD.cc18
-rw-r--r--src/osd/OSD.h4
2 files changed, 13 insertions, 9 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 054bf1b4a8f..94f184ca8e5 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -4960,12 +4960,12 @@ void OSD::defer_recovery(PG *pg)
// =========================================================
// OPS
-void OSDService::reply_op_error(OpRequestRef op, int err)
+void OSDService::reply_op_error(OpRequestRef op, int err, int forward_to)
{
- reply_op_error(op, err, eversion_t());
+ reply_op_error(op, err, eversion_t(), forward_to);
}
-void OSDService::reply_op_error(OpRequestRef op, int err, eversion_t v)
+void OSDService::reply_op_error(OpRequestRef op, int err, eversion_t v, int forward_to)
{
MOSDOp *m = (MOSDOp*)op->request;
assert(m->get_header().type == CEPH_MSG_OSD_OP);
@@ -4973,8 +4973,10 @@ void OSDService::reply_op_error(OpRequestRef op, int err, eversion_t v)
flags = m->get_flags() & (CEPH_OSD_FLAG_ACK|CEPH_OSD_FLAG_ONDISK);
MOSDOpReply *reply = new MOSDOpReply(m, err, osdmap->get_epoch(), flags);
- Messenger *msgr = client_messenger;
+ reply->set_forward_to(forward_to);
reply->set_version(v);
+
+ Messenger *msgr = client_messenger;
if (m->get_source().is_osd())
msgr = cluster_messenger;
msgr->send_message(reply, m->get_connection());
@@ -5074,7 +5076,9 @@ void OSD::handle_op(OpRequestRef op)
if (!pg) {
dout(7) << "hit non-existent pg " << pgid << dendl;
- if (osdmap->get_pg_acting_role(pgid, whoami) >= 0) {
+ vector<int> acting;
+ osdmap->pg_to_acting_osds(pgid, acting);
+ if (osdmap->calc_pg_role(whoami, acting, 0) >= 0) {
dout(7) << "we are valid target for op, waiting" << dendl;
waiting_for_pg[pgid].push_back(op);
op->mark_delayed();
@@ -5100,13 +5104,13 @@ void OSD::handle_op(OpRequestRef op)
dout(7) << "we are invalid target" << dendl;
clog.warn() << m->get_source_inst() << " misdirected " << m->get_reqid()
<< " pg " << m->get_pg()
- << " to osd." << whoami
+ << " to osd." << whoami << " not " << acting
<< " in e" << osdmap->get_epoch()
<< ", client e" << m->get_map_epoch()
<< " pg " << pgid
<< " features " << m->get_connection()->get_features()
<< "\n";
- service.reply_op_error(op, -ENXIO);
+ service.reply_op_error(op, -ENXIO, acting.size() ? acting[0] : -1);
}
return;
} else if (!op_has_sufficient_caps(pg, m)) {
diff --git a/src/osd/OSD.h b/src/osd/OSD.h
index 86a02cd61b8..f2e415ec4f1 100644
--- a/src/osd/OSD.h
+++ b/src/osd/OSD.h
@@ -234,8 +234,8 @@ public:
void dec_scrubs_pending();
void dec_scrubs_active();
- void reply_op_error(OpRequestRef op, int err);
- void reply_op_error(OpRequestRef op, int err, eversion_t v);
+ void reply_op_error(OpRequestRef op, int err, int forward_to=-1);
+ void reply_op_error(OpRequestRef op, int err, eversion_t v, int forward_to=-1);
void handle_misdirected_op(PG *pg, OpRequestRef op);
// -- Watch --