Commit df28152d authored by Ilya Dryomov's avatar Ilya Dryomov

libceph: avoid unnecessary pi lookups in calc_target()

Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 6d637a54
...@@ -273,16 +273,22 @@ extern int ceph_calc_file_object_mapping(struct ceph_file_layout *layout, ...@@ -273,16 +273,22 @@ extern int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
u64 off, u64 len, u64 off, u64 len,
u64 *bno, u64 *oxoff, u64 *oxlen); u64 *bno, u64 *oxoff, u64 *oxlen);
int __ceph_object_locator_to_pg(struct ceph_pg_pool_info *pi,
const struct ceph_object_id *oid,
const struct ceph_object_locator *oloc,
struct ceph_pg *raw_pgid);
int ceph_object_locator_to_pg(struct ceph_osdmap *osdmap, int ceph_object_locator_to_pg(struct ceph_osdmap *osdmap,
struct ceph_object_id *oid, const struct ceph_object_id *oid,
struct ceph_object_locator *oloc, const struct ceph_object_locator *oloc,
struct ceph_pg *raw_pgid); struct ceph_pg *raw_pgid);
void ceph_pg_to_up_acting_osds(struct ceph_osdmap *osdmap, void ceph_pg_to_up_acting_osds(struct ceph_osdmap *osdmap,
struct ceph_pg_pool_info *pi,
const struct ceph_pg *raw_pgid, const struct ceph_pg *raw_pgid,
struct ceph_osds *up, struct ceph_osds *up,
struct ceph_osds *acting); struct ceph_osds *acting);
bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap, bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap,
struct ceph_pg_pool_info *pi,
const struct ceph_pg *raw_pgid, const struct ceph_pg *raw_pgid,
struct ceph_spg *spgid); struct ceph_spg *spgid);
int ceph_pg_to_acting_primary(struct ceph_osdmap *osdmap, int ceph_pg_to_acting_primary(struct ceph_osdmap *osdmap,
......
...@@ -1368,8 +1368,8 @@ static enum calc_target_result calc_target(struct ceph_osd_client *osdc, ...@@ -1368,8 +1368,8 @@ static enum calc_target_result calc_target(struct ceph_osd_client *osdc,
} }
} }
ret = ceph_object_locator_to_pg(osdc->osdmap, &t->target_oid, ret = __ceph_object_locator_to_pg(pi, &t->target_oid, &t->target_oloc,
&t->target_oloc, &pgid); &pgid);
if (ret) { if (ret) {
WARN_ON(ret != -ENOENT); WARN_ON(ret != -ENOENT);
t->osd = CEPH_HOMELESS_OSD; t->osd = CEPH_HOMELESS_OSD;
...@@ -1379,7 +1379,7 @@ static enum calc_target_result calc_target(struct ceph_osd_client *osdc, ...@@ -1379,7 +1379,7 @@ static enum calc_target_result calc_target(struct ceph_osd_client *osdc,
last_pgid.pool = pgid.pool; last_pgid.pool = pgid.pool;
last_pgid.seed = ceph_stable_mod(pgid.seed, t->pg_num, t->pg_num_mask); last_pgid.seed = ceph_stable_mod(pgid.seed, t->pg_num, t->pg_num_mask);
ceph_pg_to_up_acting_osds(osdc->osdmap, &pgid, &up, &acting); ceph_pg_to_up_acting_osds(osdc->osdmap, pi, &pgid, &up, &acting);
if (any_change && if (any_change &&
ceph_is_new_interval(&t->acting, ceph_is_new_interval(&t->acting,
&acting, &acting,
...@@ -1407,7 +1407,7 @@ static enum calc_target_result calc_target(struct ceph_osd_client *osdc, ...@@ -1407,7 +1407,7 @@ static enum calc_target_result calc_target(struct ceph_osd_client *osdc,
if (legacy_change || force_resend || split) { if (legacy_change || force_resend || split) {
t->pgid = pgid; /* struct */ t->pgid = pgid; /* struct */
ceph_pg_to_primary_shard(osdc->osdmap, &pgid, &t->spgid); ceph_pg_to_primary_shard(osdc->osdmap, pi, &pgid, &t->spgid);
ceph_osds_copy(&t->acting, &acting); ceph_osds_copy(&t->acting, &acting);
ceph_osds_copy(&t->up, &up); ceph_osds_copy(&t->up, &up);
t->size = pi->size; t->size = pi->size;
......
...@@ -1923,16 +1923,12 @@ EXPORT_SYMBOL(ceph_calc_file_object_mapping); ...@@ -1923,16 +1923,12 @@ EXPORT_SYMBOL(ceph_calc_file_object_mapping);
* Should only be called with target_oid and target_oloc (as opposed to * Should only be called with target_oid and target_oloc (as opposed to
* base_oid and base_oloc), since tiering isn't taken into account. * base_oid and base_oloc), since tiering isn't taken into account.
*/ */
int ceph_object_locator_to_pg(struct ceph_osdmap *osdmap, int __ceph_object_locator_to_pg(struct ceph_pg_pool_info *pi,
struct ceph_object_id *oid, const struct ceph_object_id *oid,
struct ceph_object_locator *oloc, const struct ceph_object_locator *oloc,
struct ceph_pg *raw_pgid) struct ceph_pg *raw_pgid)
{ {
struct ceph_pg_pool_info *pi; WARN_ON(pi->id != oloc->pool);
pi = ceph_pg_pool_by_id(osdmap, oloc->pool);
if (!pi)
return -ENOENT;
if (!oloc->pool_ns) { if (!oloc->pool_ns) {
raw_pgid->pool = oloc->pool; raw_pgid->pool = oloc->pool;
...@@ -1964,6 +1960,20 @@ int ceph_object_locator_to_pg(struct ceph_osdmap *osdmap, ...@@ -1964,6 +1960,20 @@ int ceph_object_locator_to_pg(struct ceph_osdmap *osdmap,
} }
return 0; return 0;
} }
int ceph_object_locator_to_pg(struct ceph_osdmap *osdmap,
const struct ceph_object_id *oid,
const struct ceph_object_locator *oloc,
struct ceph_pg *raw_pgid)
{
struct ceph_pg_pool_info *pi;
pi = ceph_pg_pool_by_id(osdmap, oloc->pool);
if (!pi)
return -ENOENT;
return __ceph_object_locator_to_pg(pi, oid, oloc, raw_pgid);
}
EXPORT_SYMBOL(ceph_object_locator_to_pg); EXPORT_SYMBOL(ceph_object_locator_to_pg);
/* /*
...@@ -2236,19 +2246,14 @@ static void get_temp_osds(struct ceph_osdmap *osdmap, ...@@ -2236,19 +2246,14 @@ static void get_temp_osds(struct ceph_osdmap *osdmap,
* resend a request. * resend a request.
*/ */
void ceph_pg_to_up_acting_osds(struct ceph_osdmap *osdmap, void ceph_pg_to_up_acting_osds(struct ceph_osdmap *osdmap,
struct ceph_pg_pool_info *pi,
const struct ceph_pg *raw_pgid, const struct ceph_pg *raw_pgid,
struct ceph_osds *up, struct ceph_osds *up,
struct ceph_osds *acting) struct ceph_osds *acting)
{ {
struct ceph_pg_pool_info *pi;
u32 pps; u32 pps;
pi = ceph_pg_pool_by_id(osdmap, raw_pgid->pool); WARN_ON(pi->id != raw_pgid->pool);
if (!pi) {
ceph_osds_init(up);
ceph_osds_init(acting);
goto out;
}
pg_to_raw_osds(osdmap, pi, raw_pgid, up, &pps); pg_to_raw_osds(osdmap, pi, raw_pgid, up, &pps);
raw_to_up_osds(osdmap, pi, up); raw_to_up_osds(osdmap, pi, up);
...@@ -2260,23 +2265,19 @@ void ceph_pg_to_up_acting_osds(struct ceph_osdmap *osdmap, ...@@ -2260,23 +2265,19 @@ void ceph_pg_to_up_acting_osds(struct ceph_osdmap *osdmap,
if (acting->primary == -1) if (acting->primary == -1)
acting->primary = up->primary; acting->primary = up->primary;
} }
out:
WARN_ON(!osds_valid(up) || !osds_valid(acting)); WARN_ON(!osds_valid(up) || !osds_valid(acting));
} }
bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap, bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap,
struct ceph_pg_pool_info *pi,
const struct ceph_pg *raw_pgid, const struct ceph_pg *raw_pgid,
struct ceph_spg *spgid) struct ceph_spg *spgid)
{ {
struct ceph_pg_pool_info *pi;
struct ceph_pg pgid; struct ceph_pg pgid;
struct ceph_osds up, acting; struct ceph_osds up, acting;
int i; int i;
pi = ceph_pg_pool_by_id(osdmap, raw_pgid->pool); WARN_ON(pi->id != raw_pgid->pool);
if (!pi)
return false;
raw_pg_to_pg(pi, raw_pgid, &pgid); raw_pg_to_pg(pi, raw_pgid, &pgid);
if (ceph_can_shift_osds(pi)) { if (ceph_can_shift_osds(pi)) {
...@@ -2285,7 +2286,7 @@ bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap, ...@@ -2285,7 +2286,7 @@ bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap,
return true; return true;
} }
ceph_pg_to_up_acting_osds(osdmap, &pgid, &up, &acting); ceph_pg_to_up_acting_osds(osdmap, pi, &pgid, &up, &acting);
for (i = 0; i < acting.size; i++) { for (i = 0; i < acting.size; i++) {
if (acting.osds[i] == acting.primary) { if (acting.osds[i] == acting.primary) {
spgid->pgid = pgid; /* struct */ spgid->pgid = pgid; /* struct */
...@@ -2303,9 +2304,14 @@ bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap, ...@@ -2303,9 +2304,14 @@ bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap,
int ceph_pg_to_acting_primary(struct ceph_osdmap *osdmap, int ceph_pg_to_acting_primary(struct ceph_osdmap *osdmap,
const struct ceph_pg *raw_pgid) const struct ceph_pg *raw_pgid)
{ {
struct ceph_pg_pool_info *pi;
struct ceph_osds up, acting; struct ceph_osds up, acting;
ceph_pg_to_up_acting_osds(osdmap, raw_pgid, &up, &acting); pi = ceph_pg_pool_by_id(osdmap, raw_pgid->pool);
if (!pi)
return -1;
ceph_pg_to_up_acting_osds(osdmap, pi, raw_pgid, &up, &acting);
return acting.primary; return acting.primary;
} }
EXPORT_SYMBOL(ceph_pg_to_acting_primary); EXPORT_SYMBOL(ceph_pg_to_acting_primary);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment