if (ret == -ENOENT)
return RECALC_OP_TARGET_POOL_DNE;
}
+ int primary;
vector<int> acting;
- osdmap->pg_to_acting_osds(pgid, acting);
+ osdmap->pg_to_acting_osds(pgid, &acting, &primary);
bool need_resend = false;
OSDSession *s = NULL;
op->used_replica = false;
- if (!acting.empty()) {
+ if (primary != -1) {
int osd;
bool read = is_read && !is_write;
if (read && (op->flags & CEPH_OSD_FLAG_BALANCE_READS)) {
assert(best >= 0);
osd = acting[best];
} else {
- osd = acting[0];
+ osd = primary;
}
s = get_session(osd);
}
bool Objecter::recalc_linger_op_target(LingerOp *linger_op)
{
+ int primary;
vector<int> acting;
pg_t pgid;
int ret = osdmap->object_locator_to_pg(linger_op->oid, linger_op->oloc, pgid);
if (ret == -ENOENT) {
return RECALC_OP_TARGET_POOL_DNE;
}
- osdmap->pg_to_acting_osds(pgid, acting);
+ osdmap->pg_to_acting_osds(pgid, &acting, &primary);
if (pgid != linger_op->pgid || is_pg_changed(linger_op->acting, acting, true)) {
linger_op->pgid = pgid;
ldout(cct, 10) << "recalc_linger_op_target tid " << linger_op->linger_id
<< " pgid " << pgid << " acting " << acting << dendl;
- OSDSession *s = acting.size() ? get_session(acting[0]) : NULL;
+ OSDSession *s = primary != -1 ? get_session(primary) : NULL;
if (linger_op->session != s) {
linger_op->session_item.remove_myself();
linger_op->session = s;
c->map_check_error_str = "pool dne";
return RECALC_OP_TARGET_POOL_DNE;
}
+ int primary;
vector<int> acting;
- osdmap->pg_to_acting_osds(c->target_pg, acting);
- if (!acting.empty())
- s = get_session(acting[0]);
+ osdmap->pg_to_acting_osds(c->target_pg, &acting, &primary);
+ if (primary != -1)
+ s = get_session(primary);
}
if (c->session != s) {
ldout(cct, 10) << "recalc_command_target " << c->tid << " now " << c->session << dendl;