]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
objecter: implement FLAG_LOCALIZE_READS
authorSage Weil <sage@newdream.net>
Mon, 20 Dec 2010 23:47:25 +0000 (15:47 -0800)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Wed, 2 Feb 2011 11:56:44 +0000 (03:56 -0800)
Read from a local replica, if any.

Signed-off-by: Sage Weil <sage@newdream.net>
src/include/rados.h
src/osdc/Objecter.cc

index 273ce6ab3e2806f07a38c5cf738abcfb064306e8..0117a7ed25e5f7bab92fd0367f1bc83118150d8c 100644 (file)
@@ -317,6 +317,7 @@ enum {
        CEPH_OSD_FLAG_PGOP = 1024,      /* pg op, no object */
        CEPH_OSD_FLAG_EXEC = 2048,      /* op may exec */
        CEPH_OSD_FLAG_EXEC_PUBLIC = 4096, /* op may exec (public) */
+       CEPH_OSD_FLAG_LOCALIZE_READS = 8192,  /* read from nearby replica, if any */
 };
 
 enum {
index c3a792186402bc0b469e0403ba08d136a74387c5..68a425afca17aebfb1e2a6214d4ed7d31f270815 100644 (file)
@@ -570,6 +570,16 @@ bool Objecter::recalc_op_target(Op *op)
          op->used_replica = true;
        osd = acting[p];
        dout(10) << " chose random osd" << osd << " of " << acting << dendl;
+      } else if (read && (op->flags & CEPH_OSD_FLAG_LOCALIZE_READS)) {
+       // look for a local replica
+       unsigned i;
+       for (i = acting.size()-1; i > 0; i++)
+         if (osdmap->get_addr(i).is_same_host(messenger->get_myaddr())) {
+           op->used_replica = true;
+           dout(10) << " chose local osd" << acting[i] << " of " << acting << dendl;
+           break;
+         }
+       osd = acting[i];
       } else
        osd = acting[0];
       s = get_session(osd);