Commit 6f3bfd45 authored by Ilya Dryomov's avatar Ilya Dryomov

libceph: ceph_osds, ceph_pg_to_up_acting_osds()

Knowning just acting set isn't enough, we need to be able to record up
set as well to detect interval changes.  This means returning (up[],
up_len, up_primary, acting[], acting_len, acting_primary) and passing
it around.  Introduce and switch to ceph_osds to help with that.

Rename ceph_calc_pg_acting() to ceph_pg_to_up_acting_osds() and return
both up and acting sets from it.
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent d9591f5e
......@@ -208,6 +208,20 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
struct ceph_osdmap *map);
extern void ceph_osdmap_destroy(struct ceph_osdmap *map);
struct ceph_osds {
int osds[CEPH_PG_MAX_SIZE];
int size;
int primary; /* id, NOT index */
};
static inline void ceph_osds_init(struct ceph_osds *set)
{
set->size = 0;
set->primary = -1;
}
void ceph_osds_copy(struct ceph_osds *dest, const struct ceph_osds *src);
/* calculate mapping of a file extent to an object */
extern int ceph_calc_file_object_mapping(struct ceph_file_layout *layout,
u64 off, u64 len,
......@@ -218,9 +232,10 @@ int ceph_object_locator_to_pg(struct ceph_osdmap *osdmap,
struct ceph_object_locator *oloc,
struct ceph_pg *raw_pgid);
extern int ceph_calc_pg_acting(struct ceph_osdmap *osdmap,
struct ceph_pg pgid,
int *osds, int *primary);
void ceph_pg_to_up_acting_osds(struct ceph_osdmap *osdmap,
const struct ceph_pg *raw_pgid,
struct ceph_osds *up,
struct ceph_osds *acting);
extern int ceph_calc_pg_primary(struct ceph_osdmap *osdmap,
struct ceph_pg pgid);
......
......@@ -1358,8 +1358,7 @@ static int __map_request(struct ceph_osd_client *osdc,
struct ceph_osd_request *req, int force_resend)
{
struct ceph_pg pgid;
int acting[CEPH_PG_MAX_SIZE];
int num, o;
struct ceph_osds up, acting;
int err;
bool was_paused;
......@@ -1372,9 +1371,7 @@ static int __map_request(struct ceph_osd_client *osdc,
}
req->r_pgid = pgid;
num = ceph_calc_pg_acting(osdc->osdmap, pgid, acting, &o);
if (num < 0)
num = 0;
ceph_pg_to_up_acting_osds(osdc->osdmap, &pgid, &up, &acting);
was_paused = req->r_paused;
req->r_paused = __req_should_be_paused(osdc, req);
......@@ -1382,21 +1379,23 @@ static int __map_request(struct ceph_osd_client *osdc,
force_resend = 1;
if ((!force_resend &&
req->r_osd && req->r_osd->o_osd == o &&
req->r_osd && req->r_osd->o_osd == acting.primary &&
req->r_sent >= req->r_osd->o_incarnation &&
req->r_num_pg_osds == num &&
memcmp(req->r_pg_osds, acting, sizeof(acting[0])*num) == 0) ||
(req->r_osd == NULL && o == -1) ||
req->r_num_pg_osds == acting.size &&
memcmp(req->r_pg_osds, acting.osds,
acting.size * sizeof(acting.osds[0])) == 0) ||
(req->r_osd == NULL && acting.primary == -1) ||
req->r_paused)
return 0; /* no change */
dout("map_request tid %llu pgid %lld.%x osd%d (was osd%d)\n",
req->r_tid, pgid.pool, pgid.seed, o,
req->r_tid, pgid.pool, pgid.seed, acting.primary,
req->r_osd ? req->r_osd->o_osd : -1);
/* record full pg acting set */
memcpy(req->r_pg_osds, acting, sizeof(acting[0]) * num);
req->r_num_pg_osds = num;
memcpy(req->r_pg_osds, acting.osds,
acting.size * sizeof(acting.osds[0]));
req->r_num_pg_osds = acting.size;
if (req->r_osd) {
__cancel_request(req);
......@@ -1405,21 +1404,22 @@ static int __map_request(struct ceph_osd_client *osdc,
req->r_osd = NULL;
}
req->r_osd = lookup_osd(&osdc->osds, o);
if (!req->r_osd && o >= 0) {
req->r_osd = lookup_osd(&osdc->osds, acting.primary);
if (!req->r_osd && acting.primary >= 0) {
err = -ENOMEM;
req->r_osd = create_osd(osdc, o);
req->r_osd = create_osd(osdc, acting.primary);
if (!req->r_osd) {
list_move(&req->r_req_lru_item, &osdc->req_notarget);
goto out;
}
dout("map_request osd %p is osd%d\n", req->r_osd, o);
dout("map_request osd %p is osd%d\n", req->r_osd,
acting.primary);
insert_osd(&osdc->osds, req->r_osd);
ceph_con_open(&req->r_osd->o_con,
CEPH_ENTITY_TYPE_OSD, o,
&osdc->osdmap->osd_addr[o]);
CEPH_ENTITY_TYPE_OSD, acting.primary,
&osdc->osdmap->osd_addr[acting.primary]);
}
__enqueue_request(req);
......
This diff is collapsed.
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