svn commit: r319742 - vendor-sys/illumos/dist/uts/common/fs/zfs
Andriy Gapon
avg at FreeBSD.org
Fri Jun 9 15:02:09 UTC 2017
Author: avg
Date: Fri Jun 9 15:02:07 2017
New Revision: 319742
URL: https://svnweb.freebsd.org/changeset/base/319742
Log:
8056 zfs send size estimate is inaccurate for some zvols
illumos/illumos-gate at 0255edcc85fc0cd1dda0e49bcd52eb66c06a1b16
https://github.com/illumos/illumos-gate/commit/0255edcc85fc0cd1dda0e49bcd52eb66c06a1b16
https://www.illumos.org/issues/8056
The send size estimate for a zvol can be too low, if the size of the record
headers (dmu_replay_record_t's) is a significant portion of the size.
This is typically the case when the data is highly compressible, especially
with embedded blocks.
The problem is that dmu_adjust_send_estimate_for_indirects() assumes that
blocks are the size of the "recordsize" property (128KB).
However, for zvols, the blocks are the size of the "volblocksize" property
(8KB). Therefore, we estimate that there will be 16x less record headers than
there really will be.
Reviewed by: Matthew Ahrens <mahrens at delphix.com>
Reviewed by: Pavel Zakharov <pavel.zakharov at delphix.com>
Approved by: Robert Mustacchi <rm at joyent.com>
Author: Paul Dagnelie <pcd at delphix.com>
Modified:
vendor-sys/illumos/dist/uts/common/fs/zfs/dmu_send.c
Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/dmu_send.c
==============================================================================
--- vendor-sys/illumos/dist/uts/common/fs/zfs/dmu_send.c Fri Jun 9 15:01:18 2017 (r319741)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/dmu_send.c Fri Jun 9 15:02:07 2017 (r319742)
@@ -1102,10 +1102,17 @@ dmu_adjust_send_estimate_for_indirects(dsl_dataset_t *
*/
uint64_t recordsize;
uint64_t record_count;
+ objset_t *os;
+ VERIFY0(dmu_objset_from_ds(ds, &os));
/* Assume all (uncompressed) blocks are recordsize. */
- err = dsl_prop_get_int_ds(ds, zfs_prop_to_name(ZFS_PROP_RECORDSIZE),
- &recordsize);
+ 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 {
+ err = dsl_prop_get_int_ds(ds,
+ zfs_prop_to_name(ZFS_PROP_RECORDSIZE), &recordsize);
+ }
if (err != 0)
return (err);
record_count = uncompressed / recordsize;
@@ -1174,6 +1181,10 @@ dmu_send_estimate(dsl_dataset_t *ds, dsl_dataset_t *fr
err = dmu_adjust_send_estimate_for_indirects(ds, uncomp, comp,
stream_compressed, sizep);
+ /*
+ * Add the size of the BEGIN and END records to the estimate.
+ */
+ *sizep += 2 * sizeof (dmu_replay_record_t);
return (err);
}
More information about the svn-src-vendor
mailing list