Read from a local replica, if any.
Signed-off-by: Sage Weil <sage@newdream.net>
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 {
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);