diff mbox

[04/33] libceph: dump osdmap and enhance output on decode errors

Message ID 1395944299-21970-5-git-send-email-ilya.dryomov@inktank.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ilya Dryomov March 27, 2014, 6:17 p.m. UTC
Dump osdmap in hex on both full and incremental decode errors, to make
it easier to match the contents with error offset.  dout() map epoch
and max_osd value on success.

Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
---
 net/ceph/osdmap.c |   21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

Comments

Alex Elder March 27, 2014, 7:15 p.m. UTC | #1
On 03/27/2014 01:17 PM, Ilya Dryomov wrote:
> Dump osdmap in hex on both full and incremental decode errors, to make
> it easier to match the contents with error offset.  dout() map epoch
> and max_osd value on success.

Looks good.

Reviewed-by: Alex Elder <elder@linaro.org>

> 
> Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
> ---
>  net/ceph/osdmap.c |   21 +++++++++++++++------
>  1 file changed, 15 insertions(+), 6 deletions(-)
> 
> diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
> index 9d1aaa24def6..4dd000d128fd 100644
> --- a/net/ceph/osdmap.c
> +++ b/net/ceph/osdmap.c
> @@ -690,6 +690,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
>  	u16 version;
>  	u32 len, max, i;
>  	int err = -EINVAL;
> +	u32 epoch = 0;
>  	void *start = *p;
>  	struct ceph_pg_pool_info *pi;
>  
> @@ -714,7 +715,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
>  
>  	ceph_decode_need(p, end, 2*sizeof(u64)+6*sizeof(u32), bad);
>  	ceph_decode_copy(p, &map->fsid, sizeof(map->fsid));
> -	map->epoch = ceph_decode_32(p);
> +	epoch = map->epoch = ceph_decode_32(p);
>  	ceph_decode_copy(p, &map->created, sizeof(map->created));
>  	ceph_decode_copy(p, &map->modified, sizeof(map->modified));
>  
> @@ -814,14 +815,18 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
>  		goto bad;
>  	}
>  
> -	/* ignore the rest of the map */
> +	/* ignore the rest */
>  	*p = end;
>  
> -	dout("osdmap_decode done %p %p\n", *p, end);
> +	dout("full osdmap epoch %d max_osd %d\n", map->epoch, map->max_osd);
>  	return map;
>  
>  bad:
> -	dout("osdmap_decode fail err %d\n", err);
> +	pr_err("corrupt full osdmap (%d) epoch %d off %d (%p of %p-%p)\n",
> +	       err, epoch, (int)(*p - start), *p, start, end);
> +	print_hex_dump(KERN_DEBUG, "osdmap: ",
> +		       DUMP_PREFIX_OFFSET, 16, 1,
> +		       start, end - start, true);
>  	ceph_osdmap_destroy(map);
>  	return ERR_PTR(err);
>  }
> @@ -845,6 +850,8 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
>  	int err = -EINVAL;
>  	u16 version;
>  
> +	dout("%s %p to %p len %d\n", __func__, *p, end, (int)(end - *p));
> +
>  	ceph_decode_16_safe(p, end, version, bad);
>  	if (version != 6) {
>  		pr_warning("got unknown v %d != 6 of inc osdmap\n", version);
> @@ -1032,11 +1039,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
>  
>  	/* ignore the rest */
>  	*p = end;
> +
> +	dout("inc osdmap epoch %d max_osd %d\n", map->epoch, map->max_osd);
>  	return map;
>  
>  bad:
> -	pr_err("corrupt inc osdmap epoch %d off %d (%p of %p-%p)\n",
> -	       epoch, (int)(*p - start), *p, start, end);
> +	pr_err("corrupt inc osdmap (%d) epoch %d off %d (%p of %p-%p)\n",
> +	       err, epoch, (int)(*p - start), *p, start, end);
>  	print_hex_dump(KERN_DEBUG, "osdmap: ",
>  		       DUMP_PREFIX_OFFSET, 16, 1,
>  		       start, end - start, true);
> 

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 9d1aaa24def6..4dd000d128fd 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -690,6 +690,7 @@  struct ceph_osdmap *osdmap_decode(void **p, void *end)
 	u16 version;
 	u32 len, max, i;
 	int err = -EINVAL;
+	u32 epoch = 0;
 	void *start = *p;
 	struct ceph_pg_pool_info *pi;
 
@@ -714,7 +715,7 @@  struct ceph_osdmap *osdmap_decode(void **p, void *end)
 
 	ceph_decode_need(p, end, 2*sizeof(u64)+6*sizeof(u32), bad);
 	ceph_decode_copy(p, &map->fsid, sizeof(map->fsid));
-	map->epoch = ceph_decode_32(p);
+	epoch = map->epoch = ceph_decode_32(p);
 	ceph_decode_copy(p, &map->created, sizeof(map->created));
 	ceph_decode_copy(p, &map->modified, sizeof(map->modified));
 
@@ -814,14 +815,18 @@  struct ceph_osdmap *osdmap_decode(void **p, void *end)
 		goto bad;
 	}
 
-	/* ignore the rest of the map */
+	/* ignore the rest */
 	*p = end;
 
-	dout("osdmap_decode done %p %p\n", *p, end);
+	dout("full osdmap epoch %d max_osd %d\n", map->epoch, map->max_osd);
 	return map;
 
 bad:
-	dout("osdmap_decode fail err %d\n", err);
+	pr_err("corrupt full osdmap (%d) epoch %d off %d (%p of %p-%p)\n",
+	       err, epoch, (int)(*p - start), *p, start, end);
+	print_hex_dump(KERN_DEBUG, "osdmap: ",
+		       DUMP_PREFIX_OFFSET, 16, 1,
+		       start, end - start, true);
 	ceph_osdmap_destroy(map);
 	return ERR_PTR(err);
 }
@@ -845,6 +850,8 @@  struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
 	int err = -EINVAL;
 	u16 version;
 
+	dout("%s %p to %p len %d\n", __func__, *p, end, (int)(end - *p));
+
 	ceph_decode_16_safe(p, end, version, bad);
 	if (version != 6) {
 		pr_warning("got unknown v %d != 6 of inc osdmap\n", version);
@@ -1032,11 +1039,13 @@  struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
 
 	/* ignore the rest */
 	*p = end;
+
+	dout("inc osdmap epoch %d max_osd %d\n", map->epoch, map->max_osd);
 	return map;
 
 bad:
-	pr_err("corrupt inc osdmap epoch %d off %d (%p of %p-%p)\n",
-	       epoch, (int)(*p - start), *p, start, end);
+	pr_err("corrupt inc osdmap (%d) epoch %d off %d (%p of %p-%p)\n",
+	       err, epoch, (int)(*p - start), *p, start, end);
 	print_hex_dump(KERN_DEBUG, "osdmap: ",
 		       DUMP_PREFIX_OFFSET, 16, 1,
 		       start, end - start, true);