]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: don't free message on EAGAIN after get_class
authorYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 19 May 2009 23:25:13 +0000 (16:25 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 19 May 2009 23:25:13 +0000 (16:25 -0700)
src/osd/OSD.cc
src/osd/OSD.h
src/osd/ReplicatedPG.cc

index a1a967a33a1c2b29f72a4938b5b044037d87f5da..863f74010cfc246d0e651c67fed8fe793605a107 100644 (file)
@@ -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)
index f178ab3a271f0a1becbce23044d66aa8dd6d47a7..a5f809b9b4a232ee9915ffdd96dc9c0877ce3b2e 100644 (file)
@@ -407,7 +407,7 @@ protected:
   Mutex class_lock;
   map<nstring, map<pg_t, list<Message*> > > 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);
index 7529eca204a7d135ca652e30eea5dbdb6bddfc7d..9d23a828f38deea4b10f5154ebdde9743e6816ab 100644 (file)
@@ -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;
+  }
 }