]> granicus.if.org Git - zfs/commitdiff
OpenZFS 9256 - zfs send space estimation off by > 10% on some datasets
authorPaul Dagnelie <pcd@delphix.com>
Fri, 26 Aug 2016 18:43:21 +0000 (11:43 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 8 May 2018 15:59:24 +0000 (08:59 -0700)
Authored by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Matt Ahrens <matt@delphix.com>
Reviewed by: John Kennedy <john.kennedy@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Approved by: Richard Lowe <richlowe@richlowe.net>
Ported-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Porting Notes:
* Added tuning to man page.
* Test case changes dropped, default behavior unchanged.

OpenZFS-issue: https://www.illumos.org/issues/9256
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/32356b3c56
Closes #7470

man/man5/zfs-module-parameters.5
module/zfs/dmu_send.c
tests/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_006_pos.ksh

index 9d5735bd43478aff255232e33b5efc8fec43b7cd..822146a7aafd515c308be2f61a2aaf2a3672ec8d 100644 (file)
@@ -1143,6 +1143,17 @@ Maximum number of blocks freed in a single txg.
 Default value: \fB100,000\fR.
 .RE
 
+.sp
+.ne 2
+.na
+\fBzfs_override_estimate_recordsize\fR (ulong)
+.ad
+.RS 12n
+Record size calculation override for zfs send estimates.
+.sp
+Default value: \fB0\fR.
+.RE
+
 .sp
 .ne 2
 .na
index 9422f3444f698ddeac535340fdf8a20f3756f81e..9b61602549b4d4c158bb75f16e065bd733349efb 100644 (file)
@@ -69,6 +69,11 @@ int zfs_send_set_freerecords_bit = B_TRUE;
 static char *dmu_recv_tag = "dmu_recv_tag";
 const char *recv_clone_name = "%recv";
 
+/*
+ * Use this to override the recordsize calculation for fast zfs send estimates.
+ */
+unsigned long zfs_override_estimate_recordsize = 0;
+
 #define        BP_SPAN(datablkszsec, indblkshift, level) \
        (((uint64_t)datablkszsec) << (SPA_MINBLOCKSHIFT + \
        (level) * (indblkshift - SPA_BLKPTRSHIFT)))
@@ -1360,7 +1365,7 @@ static int
 dmu_adjust_send_estimate_for_indirects(dsl_dataset_t *ds, uint64_t uncompressed,
     uint64_t compressed, boolean_t stream_compressed, uint64_t *sizep)
 {
-       int err;
+       int err = 0;
        uint64_t size;
        /*
         * Assume that space (both on-disk and in-stream) is dominated by
@@ -1374,7 +1379,9 @@ dmu_adjust_send_estimate_for_indirects(dsl_dataset_t *ds, uint64_t uncompressed,
        VERIFY0(dmu_objset_from_ds(ds, &os));
 
        /* Assume all (uncompressed) blocks are recordsize. */
-       if (os->os_phys->os_type == DMU_OST_ZVOL) {
+       if (zfs_override_estimate_recordsize != 0) {
+               recordsize = zfs_override_estimate_recordsize;
+       } else if (os->os_phys->os_type == DMU_OST_ZVOL) {
                err = dsl_prop_get_int_ds(ds,
                    zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE), &recordsize);
        } else {
@@ -4223,6 +4230,12 @@ dmu_objset_is_receiving(objset_t *os)
 }
 
 #if defined(_KERNEL)
+/* BEGIN CSTYLED */
+module_param(zfs_override_estimate_recordsize, ulong, 0644);
+MODULE_PARM_DESC(zfs_override_estimate_recordsize,
+       "Record size calculation override for zfs send estimates");
+/* END CSTYLED */
+
 module_param(zfs_send_corrupt_data, int, 0644);
 MODULE_PARM_DESC(zfs_send_corrupt_data, "Allow sending corrupt data");
 
index 1fe10a760def140e80399558599ec8a3103cac2c..7192551b6c5dc63711aa2d579b322fbd779ad05c 100755 (executable)
@@ -37,7 +37,7 @@ verify_runnable "both"
 function cleanup
 {
        for ds in $datasets; do
-                datasetexists $ds && zfs destroy -rf $ds
+                destroy_dataset $ds "-rf"
        done
 }