Author: delphij
Date: Tue Jun 17 08:11:45 2014
New Revision: 267572
URL: http://svnweb.freebsd.org/changeset/base/267572

Log:
  MFV r249332 (illumos-gate 14005:55fc53126003)
  
  Illumos ZFS issues:
    3654 zdb should print number of ganged blocks
  
  MFC after:    2 weeks

Modified:
  head/cddl/contrib/opensolaris/cmd/zdb/zdb.c
Directory Properties:
  head/cddl/contrib/opensolaris/   (props changed)

Modified: head/cddl/contrib/opensolaris/cmd/zdb/zdb.c
==============================================================================
--- head/cddl/contrib/opensolaris/cmd/zdb/zdb.c Tue Jun 17 08:09:40 2014        
(r267571)
+++ head/cddl/contrib/opensolaris/cmd/zdb/zdb.c Tue Jun 17 08:11:45 2014        
(r267572)
@@ -2108,6 +2108,8 @@ typedef struct zdb_blkstats {
        uint64_t zb_lsize;
        uint64_t zb_psize;
        uint64_t zb_count;
+       uint64_t zb_gangs;
+       uint64_t zb_ditto_samevdev;
        uint64_t zb_psize_histogram[PSIZE_HISTO_SIZE];
 } zdb_blkstats_t;
 
@@ -2155,6 +2157,7 @@ zdb_count_block(zdb_cb_t *zcb, zilog_t *
        for (int i = 0; i < 4; i++) {
                int l = (i < 2) ? BP_GET_LEVEL(bp) : ZB_TOTAL;
                int t = (i & 1) ? type : ZDB_OT_TOTAL;
+               int equal;
                zdb_blkstats_t *zb = &zcb->zcb_type[l][t];
 
                zb->zb_asize += BP_GET_ASIZE(bp);
@@ -2162,6 +2165,27 @@ zdb_count_block(zdb_cb_t *zcb, zilog_t *
                zb->zb_psize += BP_GET_PSIZE(bp);
                zb->zb_count++;
                zb->zb_psize_histogram[BP_GET_PSIZE(bp) >> SPA_MINBLOCKSHIFT]++;
+
+               zb->zb_gangs += BP_COUNT_GANG(bp);
+
+               switch (BP_GET_NDVAS(bp)) {
+               case 2:
+                       if (DVA_GET_VDEV(&bp->blk_dva[0]) ==
+                           DVA_GET_VDEV(&bp->blk_dva[1]))
+                               zb->zb_ditto_samevdev++;
+                       break;
+               case 3:
+                       equal = (DVA_GET_VDEV(&bp->blk_dva[0]) ==
+                           DVA_GET_VDEV(&bp->blk_dva[1])) +
+                           (DVA_GET_VDEV(&bp->blk_dva[0]) ==
+                           DVA_GET_VDEV(&bp->blk_dva[2])) +
+                           (DVA_GET_VDEV(&bp->blk_dva[1]) ==
+                           DVA_GET_VDEV(&bp->blk_dva[2]));
+                       if (equal != 0)
+                               zb->zb_ditto_samevdev++;
+                       break;
+               }
+
        }
 
        if (dump_opt['L'])
@@ -2552,6 +2576,8 @@ dump_block_stats(spa_t *spa)
        (void) printf("\n");
        (void) printf("\tbp count:      %10llu\n",
            (u_longlong_t)tzb->zb_count);
+       (void) printf("\tganged count:  %10llu\n",
+           (longlong_t)tzb->zb_gangs);
        (void) printf("\tbp logical:    %10llu      avg: %6llu\n",
            (u_longlong_t)tzb->zb_lsize,
            (u_longlong_t)(tzb->zb_lsize / tzb->zb_count));
@@ -2573,6 +2599,11 @@ dump_block_stats(spa_t *spa)
        (void) printf("\tSPA allocated: %10llu     used: %5.2f%%\n",
            (u_longlong_t)norm_alloc, 100.0 * norm_alloc / norm_space);
 
+       if (tzb->zb_ditto_samevdev != 0) {
+               (void) printf("\tDittoed blocks on same vdev: %llu\n",
+                   (longlong_t)tzb->zb_ditto_samevdev);
+       }
+
        if (dump_opt['b'] >= 2) {
                int l, t, level;
                (void) printf("\nBlocks\tLSIZE\tPSIZE\tASIZE"
@@ -2580,7 +2611,7 @@ dump_block_stats(spa_t *spa)
 
                for (t = 0; t <= ZDB_OT_TOTAL; t++) {
                        char csize[32], lsize[32], psize[32], asize[32];
-                       char avg[32];
+                       char avg[32], gang[32];
                        char *typename;
 
                        if (t < DMU_OT_NUMTYPES)
@@ -2621,6 +2652,7 @@ dump_block_stats(spa_t *spa)
                                zdb_nicenum(zb->zb_psize, psize);
                                zdb_nicenum(zb->zb_asize, asize);
                                zdb_nicenum(zb->zb_asize / zb->zb_count, avg);
+                               zdb_nicenum(zb->zb_gangs, gang);
 
                                (void) printf("%6s\t%5s\t%5s\t%5s\t%5s"
                                    "\t%5.2f\t%6.2f\t",
@@ -2634,6 +2666,11 @@ dump_block_stats(spa_t *spa)
                                        (void) printf("    L%d %s\n",
                                            level, typename);
 
+                               if (dump_opt['b'] >= 3 && zb->zb_gangs > 0) {
+                                       (void) printf("\t number of ganged "
+                                           "blocks: %s\n", gang);
+                               }
+
                                if (dump_opt['b'] >= 4) {
                                        (void) printf("psize "
                                            "(in 512-byte sectors): "
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to