]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Objecter: switch handle_osd_map op resending around
authorGreg Farnum <gregory.farnum@dreamhost.com>
Wed, 11 May 2011 23:52:40 +0000 (16:52 -0700)
committerGreg Farnum <gregory.farnum@dreamhost.com>
Thu, 12 May 2011 00:45:32 +0000 (17:45 -0700)
We need to order the resend by tid. We could do that in a
set with a special-purpose comparison function, but just
switching to a map is easier.
Use a list for LingerOps, as those should also
be ordered but don't maintain tids like regular Ops do.

Signed-off-by: Greg Farnum <gregory.farnum@dreamhost.com>
src/osdc/Objecter.cc

index 7bafe2204eec3ff5398e8b78abe1b2186eb1ed4d..f9ebe46125bd68f01b870c0005a1af767d09326a 100644 (file)
@@ -188,8 +188,8 @@ void Objecter::handle_osd_map(MOSDMap *m)
   bool was_pauserd = osdmap->test_flag(CEPH_OSDMAP_PAUSERD);
   bool was_pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || osdmap->test_flag(CEPH_OSDMAP_FULL);
   
-  set<LingerOp*> need_resend_linger;
-  set<Op*> need_resend;
+  list<LingerOp*> need_resend_linger;
+  map<tid_t, Op*> need_resend;
 
   if (m->get_last() <= osdmap->get_epoch()) {
     dout(3) << "handle_osd_map ignoring epochs [" 
@@ -236,7 +236,7 @@ void Objecter::handle_osd_map(MOSDMap *m)
             p++) {
          LingerOp *op = p->second;
          if (recalc_linger_op_target(op))
-           need_resend_linger.insert(op);
+           need_resend_linger.push_back(op);
        }
 
        // check for changed request mappings
@@ -245,7 +245,7 @@ void Objecter::handle_osd_map(MOSDMap *m)
             p++) {
          Op *op = p->second;
          if (recalc_op_target(op))
-           need_resend.insert(op);
+           need_resend[op->tid] = op;
        }
 
        // osd addr changes?
@@ -294,19 +294,19 @@ void Objecter::handle_osd_map(MOSDMap *m)
       if (op->paused &&
          !((op->flags & CEPH_OSD_FLAG_READ) && pauserd) &&   // not still paused as a read
          !((op->flags & CEPH_OSD_FLAG_WRITE) && pausewr))    // not still paused as a write
-       need_resend.insert(op);
+       need_resend[op->tid] = op;
     }
 
   // resend requests
-  for (set<Op*>::iterator p = need_resend.begin(); p != need_resend.end(); p++) {
-    Op *op = *p;
+  for (map<tid_t, Op*>::iterator p = need_resend.begin(); p != need_resend.end(); p++) {
+    Op *op = p->second;
     if (op->session)
-      send_op(*p);
+      send_op(op);
   }
-  for (set<LingerOp*>::iterator p = need_resend_linger.begin(); p != need_resend_linger.end(); p++) {
+  for (list<LingerOp*>::iterator p = need_resend_linger.begin(); p != need_resend_linger.end(); p++) {
     LingerOp *op = *p;
     if (op->session)
-      send_linger(*p);
+      send_linger(op);
   }
 
   dump_active();