Skip to content

Commit

Permalink
4370 avoid transmitting holes during zfs send
Browse files Browse the repository at this point in the history
4371 DMU code clean up
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
Approved by: Garrett D'Amore <garrett@damore.org>
  • Loading branch information
Max Grossman authored and Christopher Siden committed Dec 9, 2013
1 parent 065c692 commit 43466aa
Show file tree
Hide file tree
Showing 39 changed files with 702 additions and 411 deletions.
3 changes: 2 additions & 1 deletion usr/src/cmd/mdb/common/modules/zfs/zfs.c
Expand Up @@ -378,7 +378,8 @@ blkptr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
enum_lookup(compress, sizeof (compress), compress_enum, enum_lookup(compress, sizeof (compress), compress_enum,
BP_GET_COMPRESS(bp), "ZIO_COMPRESS_"); BP_GET_COMPRESS(bp), "ZIO_COMPRESS_");


SPRINTF_BLKPTR(mdb_snprintf, '\n', buf, bp, type, checksum, compress); SNPRINTF_BLKPTR(mdb_snprintf, '\n', buf, sizeof (buf), bp, type,
checksum, compress);


mdb_printf("%s\n", buf); mdb_printf("%s\n", buf);


Expand Down
83 changes: 46 additions & 37 deletions usr/src/cmd/zdb/zdb.c
Expand Up @@ -764,7 +764,7 @@ dump_dde(const ddt_t *ddt, const ddt_entry_t *dde, uint64_t index)
if (ddp->ddp_phys_birth == 0) if (ddp->ddp_phys_birth == 0)
continue; continue;
ddt_bp_create(ddt->ddt_checksum, ddk, ddp, &blk); ddt_bp_create(ddt->ddt_checksum, ddk, ddp, &blk);
sprintf_blkptr(blkbuf, &blk); snprintf_blkptr(blkbuf, sizeof (blkbuf), &blk);
(void) printf("index %llx refcnt %llu %s %s\n", (void) printf("index %llx refcnt %llu %s %s\n",
(u_longlong_t)index, (u_longlong_t)ddp->ddp_refcnt, (u_longlong_t)index, (u_longlong_t)ddp->ddp_refcnt,
types[p], blkbuf); types[p], blkbuf);
Expand Down Expand Up @@ -1022,31 +1022,39 @@ blkid2offset(const dnode_phys_t *dnp, const blkptr_t *bp, const zbookmark_t *zb)
} }


static void static void
sprintf_blkptr_compact(char *blkbuf, const blkptr_t *bp) snprintf_blkptr_compact(char *blkbuf, size_t buflen, const blkptr_t *bp)
{ {
const dva_t *dva = bp->blk_dva; const dva_t *dva = bp->blk_dva;
int ndvas = dump_opt['d'] > 5 ? BP_GET_NDVAS(bp) : 1; int ndvas = dump_opt['d'] > 5 ? BP_GET_NDVAS(bp) : 1;


if (dump_opt['b'] >= 6) { if (dump_opt['b'] >= 6) {
sprintf_blkptr(blkbuf, bp); snprintf_blkptr(blkbuf, buflen, bp);
return; return;
} }


blkbuf[0] = '\0'; blkbuf[0] = '\0';


for (int i = 0; i < ndvas; i++) for (int i = 0; i < ndvas; i++)
(void) sprintf(blkbuf + strlen(blkbuf), "%llu:%llx:%llx ", (void) snprintf(blkbuf + strlen(blkbuf),
buflen - strlen(blkbuf), "%llu:%llx:%llx ",
(u_longlong_t)DVA_GET_VDEV(&dva[i]), (u_longlong_t)DVA_GET_VDEV(&dva[i]),
(u_longlong_t)DVA_GET_OFFSET(&dva[i]), (u_longlong_t)DVA_GET_OFFSET(&dva[i]),
(u_longlong_t)DVA_GET_ASIZE(&dva[i])); (u_longlong_t)DVA_GET_ASIZE(&dva[i]));


(void) sprintf(blkbuf + strlen(blkbuf), if (BP_IS_HOLE(bp)) {
"%llxL/%llxP F=%llu B=%llu/%llu", (void) snprintf(blkbuf + strlen(blkbuf),
(u_longlong_t)BP_GET_LSIZE(bp), buflen - strlen(blkbuf), "B=%llu",
(u_longlong_t)BP_GET_PSIZE(bp), (u_longlong_t)bp->blk_birth);
(u_longlong_t)bp->blk_fill, } else {
(u_longlong_t)bp->blk_birth, (void) snprintf(blkbuf + strlen(blkbuf),
(u_longlong_t)BP_PHYSICAL_BIRTH(bp)); buflen - strlen(blkbuf),
"%llxL/%llxP F=%llu B=%llu/%llu",
(u_longlong_t)BP_GET_LSIZE(bp),
(u_longlong_t)BP_GET_PSIZE(bp),
(u_longlong_t)bp->blk_fill,
(u_longlong_t)bp->blk_birth,
(u_longlong_t)BP_PHYSICAL_BIRTH(bp));
}
} }


static void static void
Expand All @@ -1071,7 +1079,7 @@ print_indirect(blkptr_t *bp, const zbookmark_t *zb,
} }
} }


sprintf_blkptr_compact(blkbuf, bp); snprintf_blkptr_compact(blkbuf, sizeof (blkbuf), bp);
(void) printf("%s\n", blkbuf); (void) printf("%s\n", blkbuf);
} }


Expand All @@ -1086,7 +1094,7 @@ visit_indirect(spa_t *spa, const dnode_phys_t *dnp,


print_indirect(bp, zb, dnp); print_indirect(bp, zb, dnp);


if (BP_GET_LEVEL(bp) > 0) { if (BP_GET_LEVEL(bp) > 0 && !BP_IS_HOLE(bp)) {
uint32_t flags = ARC_WAIT; uint32_t flags = ARC_WAIT;
int i; int i;
blkptr_t *cbp; blkptr_t *cbp;
Expand Down Expand Up @@ -1211,7 +1219,7 @@ dump_dsl_dataset(objset_t *os, uint64_t object, void *data, size_t size)
zdb_nicenum(ds->ds_compressed_bytes, compressed); zdb_nicenum(ds->ds_compressed_bytes, compressed);
zdb_nicenum(ds->ds_uncompressed_bytes, uncompressed); zdb_nicenum(ds->ds_uncompressed_bytes, uncompressed);
zdb_nicenum(ds->ds_unique_bytes, unique); zdb_nicenum(ds->ds_unique_bytes, unique);
sprintf_blkptr(blkbuf, &ds->ds_bp); snprintf_blkptr(blkbuf, sizeof (blkbuf), &ds->ds_bp);


(void) printf("\t\tdir_obj = %llu\n", (void) printf("\t\tdir_obj = %llu\n",
(u_longlong_t)ds->ds_dir_obj); (u_longlong_t)ds->ds_dir_obj);
Expand Down Expand Up @@ -1256,7 +1264,7 @@ dump_bptree_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx)
char blkbuf[BP_SPRINTF_LEN]; char blkbuf[BP_SPRINTF_LEN];


if (bp->blk_birth != 0) { if (bp->blk_birth != 0) {
sprintf_blkptr(blkbuf, bp); snprintf_blkptr(blkbuf, sizeof (blkbuf), bp);
(void) printf("\t%s\n", blkbuf); (void) printf("\t%s\n", blkbuf);
} }
return (0); return (0);
Expand Down Expand Up @@ -1294,7 +1302,7 @@ dump_bpobj_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx)
char blkbuf[BP_SPRINTF_LEN]; char blkbuf[BP_SPRINTF_LEN];


ASSERT(bp->blk_birth != 0); ASSERT(bp->blk_birth != 0);
sprintf_blkptr_compact(blkbuf, bp); snprintf_blkptr_compact(blkbuf, sizeof (blkbuf), bp);
(void) printf("\t%s\n", blkbuf); (void) printf("\t%s\n", blkbuf);
return (0); return (0);
} }
Expand Down Expand Up @@ -1793,8 +1801,9 @@ dump_dir(objset_t *os)
zdb_nicenum(refdbytes, numbuf); zdb_nicenum(refdbytes, numbuf);


if (verbosity >= 4) { if (verbosity >= 4) {
(void) sprintf(blkbuf, ", rootbp "); (void) snprintf(blkbuf, sizeof (blkbuf), ", rootbp ");
(void) sprintf_blkptr(blkbuf + strlen(blkbuf), os->os_rootbp); (void) snprintf_blkptr(blkbuf + strlen(blkbuf),
sizeof (blkbuf) - strlen(blkbuf), os->os_rootbp);
} else { } else {
blkbuf[0] = '\0'; blkbuf[0] = '\0';
} }
Expand Down Expand Up @@ -1824,7 +1833,7 @@ dump_dir(objset_t *os)
if (verbosity < 2) if (verbosity < 2)
return; return;


if (os->os_rootbp->blk_birth == 0) if (BP_IS_HOLE(os->os_rootbp))
return; return;


dump_object(os, 0, verbosity, &print_header); dump_object(os, 0, verbosity, &print_header);
Expand Down Expand Up @@ -1865,7 +1874,7 @@ dump_uberblock(uberblock_t *ub, const char *header, const char *footer)
(u_longlong_t)ub->ub_timestamp, asctime(localtime(&timestamp))); (u_longlong_t)ub->ub_timestamp, asctime(localtime(&timestamp)));
if (dump_opt['u'] >= 3) { if (dump_opt['u'] >= 3) {
char blkbuf[BP_SPRINTF_LEN]; char blkbuf[BP_SPRINTF_LEN];
sprintf_blkptr(blkbuf, &ub->ub_rootbp); snprintf_blkptr(blkbuf, sizeof (blkbuf), &ub->ub_rootbp);
(void) printf("\trootbp = %s\n", blkbuf); (void) printf("\trootbp = %s\n", blkbuf);
} }
(void) printf(footer ? footer : ""); (void) printf(footer ? footer : "");
Expand Down Expand Up @@ -2202,7 +2211,7 @@ zdb_blkptr_done(zio_t *zio)
zcb->zcb_errors[ioerr]++; zcb->zcb_errors[ioerr]++;


if (dump_opt['b'] >= 2) if (dump_opt['b'] >= 2)
sprintf_blkptr(blkbuf, bp); snprintf_blkptr(blkbuf, sizeof (blkbuf), bp);
else else
blkbuf[0] = '\0'; blkbuf[0] = '\0';


Expand All @@ -2224,11 +2233,22 @@ zdb_blkptr_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
const zbookmark_t *zb, const dnode_phys_t *dnp, void *arg) const zbookmark_t *zb, const dnode_phys_t *dnp, void *arg)
{ {
zdb_cb_t *zcb = arg; zdb_cb_t *zcb = arg;
char blkbuf[BP_SPRINTF_LEN];
dmu_object_type_t type; dmu_object_type_t type;
boolean_t is_metadata; boolean_t is_metadata;


if (bp == NULL) if (dump_opt['b'] >= 5 && bp->blk_birth > 0) {
char blkbuf[BP_SPRINTF_LEN];
snprintf_blkptr(blkbuf, sizeof (blkbuf), bp);
(void) printf("objset %llu object %llu "
"level %lld offset 0x%llx %s\n",
(u_longlong_t)zb->zb_objset,
(u_longlong_t)zb->zb_object,
(longlong_t)zb->zb_level,
(u_longlong_t)blkid2offset(dnp, bp, zb),
blkbuf);
}

if (BP_IS_HOLE(bp))
return (0); return (0);


type = BP_GET_TYPE(bp); type = BP_GET_TYPE(bp);
Expand Down Expand Up @@ -2259,17 +2279,6 @@ zdb_blkptr_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,


zcb->zcb_readfails = 0; zcb->zcb_readfails = 0;


if (dump_opt['b'] >= 5) {
sprintf_blkptr(blkbuf, bp);
(void) printf("objset %llu object %llu "
"level %lld offset 0x%llx %s\n",
(u_longlong_t)zb->zb_objset,
(u_longlong_t)zb->zb_object,
(longlong_t)zb->zb_level,
(u_longlong_t)blkid2offset(dnp, bp, zb),
blkbuf);
}

if (dump_opt['b'] < 5 && isatty(STDERR_FILENO) && if (dump_opt['b'] < 5 && isatty(STDERR_FILENO) &&
gethrtime() > zcb->zcb_lastprint + NANOSEC) { gethrtime() > zcb->zcb_lastprint + NANOSEC) {
uint64_t now = gethrtime(); uint64_t now = gethrtime();
Expand Down Expand Up @@ -2426,7 +2435,7 @@ count_block_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx)


if (dump_opt['b'] >= 5) { if (dump_opt['b'] >= 5) {
char blkbuf[BP_SPRINTF_LEN]; char blkbuf[BP_SPRINTF_LEN];
sprintf_blkptr(blkbuf, bp); snprintf_blkptr(blkbuf, sizeof (blkbuf), bp);
(void) printf("[%s] %s\n", (void) printf("[%s] %s\n",
"deferred free", blkbuf); "deferred free", blkbuf);
} }
Expand Down Expand Up @@ -2673,7 +2682,7 @@ zdb_ddt_add_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
avl_index_t where; avl_index_t where;
zdb_ddt_entry_t *zdde, zdde_search; zdb_ddt_entry_t *zdde, zdde_search;


if (bp == NULL) if (BP_IS_HOLE(bp))
return (0); return (0);


if (dump_opt['S'] > 1 && zb->zb_level == ZB_ROOT_LEVEL) { if (dump_opt['S'] > 1 && zb->zb_level == ZB_ROOT_LEVEL) {
Expand Down Expand Up @@ -2840,7 +2849,7 @@ zdb_print_blkptr(blkptr_t *bp, int flags)
if (flags & ZDB_FLAG_BSWAP) if (flags & ZDB_FLAG_BSWAP)
byteswap_uint64_array((void *)bp, sizeof (blkptr_t)); byteswap_uint64_array((void *)bp, sizeof (blkptr_t));


sprintf_blkptr(blkbuf, bp); snprintf_blkptr(blkbuf, sizeof (blkbuf), bp);
(void) printf("%s\n", blkbuf); (void) printf("%s\n", blkbuf);
} }


Expand Down
14 changes: 9 additions & 5 deletions usr/src/cmd/zdb/zdb_il.c
Expand Up @@ -23,6 +23,10 @@
* Use is subject to license terms. * Use is subject to license terms.
*/ */


/*
* Copyright (c) 2013 by Delphix. All rights reserved.
*/

/* /*
* Print intent log header and statistics. * Print intent log header and statistics.
*/ */
Expand All @@ -47,7 +51,7 @@ print_log_bp(const blkptr_t *bp, const char *prefix)
{ {
char blkbuf[BP_SPRINTF_LEN]; char blkbuf[BP_SPRINTF_LEN];


sprintf_blkptr(blkbuf, bp); snprintf_blkptr(blkbuf, sizeof (blkbuf), bp);
(void) printf("%s%s\n", prefix, blkbuf); (void) printf("%s%s\n", prefix, blkbuf);
} }


Expand Down Expand Up @@ -132,15 +136,14 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, lr_write_t *lr)


if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) { if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) {
(void) printf("%shas blkptr, %s\n", prefix, (void) printf("%shas blkptr, %s\n", prefix,
!BP_IS_HOLE(bp) &&
bp->blk_birth >= spa_first_txg(zilog->zl_spa) ? bp->blk_birth >= spa_first_txg(zilog->zl_spa) ?
"will claim" : "won't claim"); "will claim" : "won't claim");
print_log_bp(bp, prefix); print_log_bp(bp, prefix);


if (BP_IS_HOLE(bp)) { if (BP_IS_HOLE(bp)) {
(void) printf("\t\t\tLSIZE 0x%llx\n", (void) printf("\t\t\tLSIZE 0x%llx\n",
(u_longlong_t)BP_GET_LSIZE(bp)); (u_longlong_t)BP_GET_LSIZE(bp));
}
if (bp->blk_birth == 0) {
bzero(buf, sizeof (buf)); bzero(buf, sizeof (buf));
(void) printf("%s<hole>\n", prefix); (void) printf("%s<hole>\n", prefix);
return; return;
Expand Down Expand Up @@ -313,7 +316,8 @@ print_log_block(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)


if (verbose >= 5) { if (verbose >= 5) {
(void) strcpy(blkbuf, ", "); (void) strcpy(blkbuf, ", ");
sprintf_blkptr(blkbuf + strlen(blkbuf), bp); snprintf_blkptr(blkbuf + strlen(blkbuf),
sizeof (blkbuf) - strlen(blkbuf), bp);
} else { } else {
blkbuf[0] = '\0'; blkbuf[0] = '\0';
} }
Expand Down Expand Up @@ -361,7 +365,7 @@ dump_intent_log(zilog_t *zilog)
int verbose = MAX(dump_opt['d'], dump_opt['i']); int verbose = MAX(dump_opt['d'], dump_opt['i']);
int i; int i;


if (zh->zh_log.blk_birth == 0 || verbose < 1) if (BP_IS_HOLE(&zh->zh_log) || verbose < 1)
return; return;


(void) printf("\n ZIL header: claim_txg %llu, " (void) printf("\n ZIL header: claim_txg %llu, "
Expand Down
14 changes: 10 additions & 4 deletions usr/src/cmd/zhack/zhack.c
Expand Up @@ -277,6 +277,9 @@ zhack_do_feature_stat(int argc, char **argv)
dump_obj(os, spa->spa_feat_for_read_obj, "for_read"); dump_obj(os, spa->spa_feat_for_read_obj, "for_read");
dump_obj(os, spa->spa_feat_for_write_obj, "for_write"); dump_obj(os, spa->spa_feat_for_write_obj, "for_write");
dump_obj(os, spa->spa_feat_desc_obj, "descriptions"); dump_obj(os, spa->spa_feat_desc_obj, "descriptions");
if (spa_feature_is_active(spa, SPA_FEATURE_ENABLED_TXG)) {
dump_obj(os, spa->spa_feat_enabled_txg_obj, "enabled_txg");
}
dump_mos(spa); dump_mos(spa);


spa_close(spa, FTAG); spa_close(spa, FTAG);
Expand Down Expand Up @@ -313,7 +316,9 @@ zhack_do_feature_enable(int argc, char **argv)
feature.fi_uname = "zhack"; feature.fi_uname = "zhack";
feature.fi_mos = B_FALSE; feature.fi_mos = B_FALSE;
feature.fi_can_readonly = B_FALSE; feature.fi_can_readonly = B_FALSE;
feature.fi_activate_on_enable = B_FALSE;
feature.fi_depends = nodeps; feature.fi_depends = nodeps;
feature.fi_feature = SPA_FEATURE_NONE;


optind = 1; optind = 1;
while ((c = getopt(argc, argv, "rmd:")) != -1) { while ((c = getopt(argc, argv, "rmd:")) != -1) {
Expand Down Expand Up @@ -371,7 +376,7 @@ feature_incr_sync(void *arg, dmu_tx_t *tx)
zfeature_info_t *feature = arg; zfeature_info_t *feature = arg;
uint64_t refcount; uint64_t refcount;


VERIFY0(feature_get_refcount(spa, feature, &refcount)); VERIFY0(feature_get_refcount_from_disk(spa, feature, &refcount));
feature_sync(spa, feature, refcount + 1, tx); feature_sync(spa, feature, refcount + 1, tx);
spa_history_log_internal(spa, "zhack feature incr", tx, spa_history_log_internal(spa, "zhack feature incr", tx,
"guid=%s", feature->fi_guid); "guid=%s", feature->fi_guid);
Expand All @@ -384,7 +389,7 @@ feature_decr_sync(void *arg, dmu_tx_t *tx)
zfeature_info_t *feature = arg; zfeature_info_t *feature = arg;
uint64_t refcount; uint64_t refcount;


VERIFY0(feature_get_refcount(spa, feature, &refcount)); VERIFY0(feature_get_refcount_from_disk(spa, feature, &refcount));
feature_sync(spa, feature, refcount - 1, tx); feature_sync(spa, feature, refcount - 1, tx);
spa_history_log_internal(spa, "zhack feature decr", tx, spa_history_log_internal(spa, "zhack feature decr", tx,
"guid=%s", feature->fi_guid); "guid=%s", feature->fi_guid);
Expand All @@ -411,6 +416,7 @@ zhack_do_feature_ref(int argc, char **argv)
feature.fi_mos = B_FALSE; feature.fi_mos = B_FALSE;
feature.fi_desc = NULL; feature.fi_desc = NULL;
feature.fi_depends = nodeps; feature.fi_depends = nodeps;
feature.fi_feature = SPA_FEATURE_NONE;


optind = 1; optind = 1;
while ((c = getopt(argc, argv, "md")) != -1) { while ((c = getopt(argc, argv, "md")) != -1) {
Expand Down Expand Up @@ -459,8 +465,8 @@ zhack_do_feature_ref(int argc, char **argv)


if (decr) { if (decr) {
uint64_t count; uint64_t count;
if (feature_get_refcount(spa, &feature, &count) == 0 && if (feature_get_refcount_from_disk(spa, &feature,
count != 0) { &count) == 0 && count != 0) {
fatal(spa, FTAG, "feature refcount already 0: %s", fatal(spa, FTAG, "feature refcount already 0: %s",
feature.fi_guid); feature.fi_guid);
} }
Expand Down

0 comments on commit 43466aa

Please sign in to comment.