From 2969e84da5c139c1ab038941d87942e6dee4a879 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Tue, 19 May 2009 16:25:13 -0700 Subject: [PATCH] osd: don't free message on EAGAIN after get_class --- src/osd/OSD.cc | 11 +++++------ src/osd/OSD.h | 2 +- src/osd/ReplicatedPG.cc | 14 ++++++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a1a967a33a1c2..863f74010cfc2 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3746,18 +3746,17 @@ void OSD::wait_for_no_ops() // -------------------------------- -ClassHandler::ClassData *OSD::get_class(const nstring& cname, pg_t pgid, Message *m) +int OSD::get_class(const nstring& cname, pg_t pgid, Message *m, ClassHandler::ClassData **cls) { - ClassHandler::ClassData *cls; Mutex::Locker l(class_lock); dout(10) << "wait_for_missing_class '" << cname << "' by " << pgid << dendl; - cls = class_handler->get_class(cname); - if (cls) - return cls; + *cls = class_handler->get_class(cname); + if (*cls) + return 0; waiting_for_missing_class[cname][pgid].push_back(m); - return NULL; + return -EAGAIN; } void OSD::got_class(const nstring& cname) diff --git a/src/osd/OSD.h b/src/osd/OSD.h index f178ab3a271f0..a5f809b9b4a23 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -407,7 +407,7 @@ protected: Mutex class_lock; map > > waiting_for_missing_class; - ClassHandler::ClassData *get_class(const nstring& cname, pg_t pgid, Message *m); + int get_class(const nstring& cname, pg_t pgid, Message *m, ClassHandler::ClassData **cls); void handle_class(MClass *m); public: void got_class(const nstring& cname); diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 7529eca204a7d..9d23a828f38de 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -682,10 +682,10 @@ int ReplicatedPG::do_read_ops(MOSDOp *op, OpContext& ctx, bp.copy(p->indata_len, indata); //dout(20) << "rdcall param=" << indata.c_str() << dendl; - ClassHandler::ClassData *cls = osd->get_class(cname, info.pgid, op); - if (!cls) { + ClassHandler::ClassData *cls; + result = osd->get_class(cname, info.pgid, op, &cls); + if (result) { dout(10) << "rdcall class " << cname << " does not exist" << dendl; - result = -EINVAL; } else { bufferlist outdata; ClassHandler::ClassMethod *method = cls->get_method(mname.c_str()); @@ -887,7 +887,7 @@ void ReplicatedPG::op_read(MOSDOp *op) OpContext ctx(soid, oi, op->ops); // do it. - do_read_ops(op, ctx, bp, data, &data_off); + result = do_read_ops(op, ctx, bp, data, &data_off); } done: @@ -911,9 +911,11 @@ void ReplicatedPG::op_read(MOSDOp *op) stat_object_temp_rd[soid].hit(now); // hit temp. } - osd->messenger->send_message(reply, op->get_orig_source_inst()); - delete op; + if (result != -EAGAIN) { + osd->messenger->send_message(reply, op->get_orig_source_inst()); + delete op; + } } -- 2.39.5