]> granicus.if.org Git - zfs/commitdiff
Illumos 5169-5171 - zdb fixes
authorMatthew Ahrens <mahrens@delphix.com>
Tue, 16 Sep 2014 20:24:48 +0000 (22:24 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 23 Oct 2014 17:27:55 +0000 (10:27 -0700)
5169 zdb should limit its ARC size
5170 zdb -c should create more scrub i/os by default
5171 zdb should print status while loading metaslabs for leak detection
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Paul Dagnelie <paul.dagnelie@delphix.com>
Reviewed by: Bayard Bell <Bayard.Bell@nexenta.com>
Approved by: Robert Mustacchi <rm@joyent.com>

References:
  https://www.illumos.org/issues/5169
  https://www.illumos.org/issues/5170
  https://www.illumos.org/issues/5171
  https://github.com/illumos/illumos-gate/commit/06be980

Ported by: Turbo Fredriksson <turbo@bayour.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #2707

cmd/zdb/zdb.c

index fee9699db73a23e870bb638c3a627f1e89a64848..205f65577946b61205f83bde2cf28fbefb7050e4 100644 (file)
 
 #ifndef lint
 extern int zfs_recover;
+extern uint64_t zfs_arc_max, zfs_arc_meta_limit;
 #else
 int zfs_recover;
+uint64_t zfs_arc_max, zfs_arc_meta_limit;
 #endif
 
 const char cmdname[] = "zdb";
@@ -88,7 +90,7 @@ extern void dump_intent_log(zilog_t *);
 uint64_t *zopt_object = NULL;
 int zopt_objects = 0;
 libzfs_handle_t *g_zfs;
-uint64_t max_inflight = 200;
+uint64_t max_inflight = 1000;
 
 /*
  * These libumem hooks provide a reasonable set of defaults for the allocator's
@@ -2395,7 +2397,7 @@ zdb_blkptr_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
 
        zcb->zcb_readfails = 0;
 
-       if (dump_opt['b'] < 5 && isatty(STDERR_FILENO) &&
+       if (dump_opt['b'] < 5 &&
            gethrtime() > zcb->zcb_lastprint + NANOSEC) {
                uint64_t now = gethrtime();
                char buf[10];
@@ -2478,7 +2480,7 @@ static void
 zdb_leak_init(spa_t *spa, zdb_cb_t *zcb)
 {
        zcb->zcb_spa = spa;
-       int c, m;
+       uint64_t c, m;
 
        if (!dump_opt['L']) {
                vdev_t *rvd = spa->spa_root_vdev;
@@ -2497,6 +2499,15 @@ zdb_leak_init(spa_t *spa, zdb_cb_t *zcb)
                                 * interfaces.
                                 */
                                if (msp->ms_sm != NULL) {
+                                       (void) fprintf(stderr,
+                                           "\rloading space map for "
+                                           "vdev %llu of %llu, "
+                                           "metaslab %llu of %llu ...",
+                                           (longlong_t)c,
+                                           (longlong_t)rvd->vdev_children,
+                                           (longlong_t)m,
+                                           (longlong_t)vd->vdev_ms_count);
+
                                        msp->ms_ops = &zdb_metaslab_ops;
                                        VERIFY0(space_map_load(msp->ms_sm,
                                            msp->ms_tree, SM_ALLOC));
@@ -2505,6 +2516,7 @@ zdb_leak_init(spa_t *spa, zdb_cb_t *zcb)
                                mutex_exit(&msp->ms_lock);
                        }
                }
+               (void) fprintf(stderr, "\n");
        }
 
        spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER);
@@ -3510,6 +3522,12 @@ main(int argc, char **argv)
                usage();
        }
 
+       /*
+        * ZDB does not typically re-read blocks; therefore limit the ARC
+        * to 256 MB, which can be used entirely for metadata.
+        */
+       zfs_arc_max = zfs_arc_meta_limit = 256 * 1024 * 1024;
+
        kernel_init(FREAD);
        if ((g_zfs = libzfs_init()) == NULL)
                return (1);