]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
libceph: introduce ceph_spg, ceph_pg_to_primary_shard()
authorIlya Dryomov <idryomov@gmail.com>
Thu, 15 Jun 2017 14:30:53 +0000 (16:30 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 7 Jul 2017 15:25:15 +0000 (17:25 +0200)
Store both raw pgid and actual spgid in ceph_osd_request_target.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
include/linux/ceph/osd_client.h
include/linux/ceph/osdmap.h
net/ceph/debugfs.c
net/ceph/osd_client.c
net/ceph/osdmap.c

index ef630ebd1169cc09537df735843e084aa0e9f71a..6114f7b02135301345c5e2f0f8b631490e09d5c7 100644 (file)
@@ -136,7 +136,8 @@ struct ceph_osd_request_target {
        struct ceph_object_id target_oid;
        struct ceph_object_locator target_oloc;
 
-       struct ceph_pg pgid;
+       struct ceph_pg pgid;               /* last raw pg we mapped to */
+       struct ceph_spg spgid;             /* last actual spg we mapped to */
        u32 pg_num;
        u32 pg_num_mask;
        struct ceph_osds acting;
index 938656f708078e8a2fd078bc7cace623a32b755c..7ae5b416b4b665e14b511fde15f88f3c4712bbd1 100644 (file)
@@ -24,6 +24,13 @@ struct ceph_pg {
        uint32_t seed;
 };
 
+#define CEPH_SPG_NOSHARD       -1
+
+struct ceph_spg {
+       struct ceph_pg pgid;
+       s8 shard;
+};
+
 int ceph_pg_compare(const struct ceph_pg *lhs, const struct ceph_pg *rhs);
 
 #define CEPH_POOL_FLAG_HASHPSPOOL      (1ULL << 0) /* hash pg seed and pool id
@@ -271,6 +278,9 @@ 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);
+bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap,
+                             const struct ceph_pg *raw_pgid,
+                             struct ceph_spg *spgid);
 int ceph_pg_to_acting_primary(struct ceph_osdmap *osdmap,
                              const struct ceph_pg *raw_pgid);
 
index 71ba13927b3d1726bd488403de8274478a956091..50ab1bdb16e22237bef6bc202f2befa75210e8cd 100644 (file)
@@ -147,11 +147,20 @@ static int monc_show(struct seq_file *s, void *p)
        return 0;
 }
 
+static void dump_spgid(struct seq_file *s, const struct ceph_spg *spgid)
+{
+       seq_printf(s, "%llu.%x", spgid->pgid.pool, spgid->pgid.seed);
+       if (spgid->shard != CEPH_SPG_NOSHARD)
+               seq_printf(s, "s%d", spgid->shard);
+}
+
 static void dump_target(struct seq_file *s, struct ceph_osd_request_target *t)
 {
        int i;
 
-       seq_printf(s, "osd%d\t%llu.%x\t[", t->osd, t->pgid.pool, t->pgid.seed);
+       seq_printf(s, "osd%d\t%llu.%x\t", t->osd, t->pgid.pool, t->pgid.seed);
+       dump_spgid(s, &t->spgid);
+       seq_puts(s, "\t[");
        for (i = 0; i < t->up.size; i++)
                seq_printf(s, "%s%d", (!i ? "" : ","), t->up.osds[i]);
        seq_printf(s, "]/%d\t[", t->up.primary);
index aca6319b99b6ec918dd35cae8a1bcb50c2c84590..66509414f4c84897dd2c6841e6118d61e8e481df 100644 (file)
@@ -373,6 +373,7 @@ static void target_copy(struct ceph_osd_request_target *dest,
        ceph_oloc_copy(&dest->target_oloc, &src->target_oloc);
 
        dest->pgid = src->pgid; /* struct */
+       dest->spgid = src->spgid; /* struct */
        dest->pg_num = src->pg_num;
        dest->pg_num_mask = src->pg_num_mask;
        ceph_osds_copy(&dest->acting, &src->acting);
@@ -1394,6 +1395,7 @@ static enum calc_target_result calc_target(struct ceph_osd_client *osdc,
            ceph_osds_changed(&t->acting, &acting, any_change) ||
            force_resend) {
                t->pgid = pgid; /* struct */
+               ceph_pg_to_primary_shard(osdc->osdmap, &pgid, &t->spgid);
                ceph_osds_copy(&t->acting, &acting);
                ceph_osds_copy(&t->up, &up);
                t->size = pi->size;
@@ -1595,9 +1597,10 @@ static void send_request(struct ceph_osd_request *req)
 
        encode_request(req, req->r_request);
 
-       dout("%s req %p tid %llu to pg %llu.%x osd%d flags 0x%x attempt %d\n",
+       dout("%s req %p tid %llu to pgid %llu.%x spgid %llu.%xs%d osd%d flags 0x%x attempt %d\n",
             __func__, req, req->r_tid, req->r_t.pgid.pool, req->r_t.pgid.seed,
-            req->r_t.osd, req->r_flags, req->r_attempts);
+            req->r_t.spgid.pgid.pool, req->r_t.spgid.pgid.seed,
+            req->r_t.spgid.shard, osd->o_osd, req->r_flags, req->r_attempts);
 
        req->r_t.paused = false;
        req->r_stamp = jiffies;
index 710ee3dc01b9bb31201d73848dcdd90c3a77d87a..a4155620eace7804e9a21362aa6b04b74c915a1c 100644 (file)
@@ -2265,6 +2265,39 @@ out:
        WARN_ON(!osds_valid(up) || !osds_valid(acting));
 }
 
+bool ceph_pg_to_primary_shard(struct ceph_osdmap *osdmap,
+                             const struct ceph_pg *raw_pgid,
+                             struct ceph_spg *spgid)
+{
+       struct ceph_pg_pool_info *pi;
+       struct ceph_pg pgid;
+       struct ceph_osds up, acting;
+       int i;
+
+       pi = ceph_pg_pool_by_id(osdmap, raw_pgid->pool);
+       if (!pi)
+               return false;
+
+       raw_pg_to_pg(pi, raw_pgid, &pgid);
+
+       if (ceph_can_shift_osds(pi)) {
+               spgid->pgid = pgid; /* struct */
+               spgid->shard = CEPH_SPG_NOSHARD;
+               return true;
+       }
+
+       ceph_pg_to_up_acting_osds(osdmap, &pgid, &up, &acting);
+       for (i = 0; i < acting.size; i++) {
+               if (acting.osds[i] == acting.primary) {
+                       spgid->pgid = pgid; /* struct */
+                       spgid->shard = i;
+                       return true;
+               }
+       }
+
+       return false;
+}
+
 /*
  * Return acting primary for given PG, or -1 if none.
  */