mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 11:47:43 +03:00
Remove deduplicated send/receive code
Deduplicated send streams (i.e. `zfs send -D` and `zfs receive` of such streams) are deprecated. Deduplicated send streams can be received by first converting them to non-deduplicated with the `zstream redup` command. This commit removes the code for sending and receiving deduplicated send streams. `zfs send -D` will now print a warning, ignore the `-D` flag, and generate a regular (non-deduplicated) send stream. `zfs receive` of a deduplicated send stream will print an error message and fail. The resulting code simplification (especially in the kernel's support for receiving dedup streams) should help enable future performance enhancements. Several new tests are added which leverage `zstream redup`. Reviewed-by: Paul Dagnelie <pcd@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Issue #7887 Issue #10117 Issue #10156 Closes #10212
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2012, 2018 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2012, 2020 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2013 Steven Hartland. All rights reserved.
|
||||
* Copyright (c) 2017 Datto Inc.
|
||||
* Copyright 2017 RackTop Systems.
|
||||
@@ -783,9 +783,8 @@ static int
|
||||
recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
|
||||
uint8_t *wkeydata, uint_t wkeylen, const char *origin, boolean_t force,
|
||||
boolean_t resumable, boolean_t raw, int input_fd,
|
||||
const dmu_replay_record_t *begin_record, int cleanup_fd,
|
||||
uint64_t *read_bytes, uint64_t *errflags, uint64_t *action_handle,
|
||||
nvlist_t **errors)
|
||||
const dmu_replay_record_t *begin_record, uint64_t *read_bytes,
|
||||
uint64_t *errflags, nvlist_t **errors)
|
||||
{
|
||||
dmu_replay_record_t drr;
|
||||
char fsname[MAXPATHLEN];
|
||||
@@ -868,12 +867,6 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
|
||||
if (resumable)
|
||||
fnvlist_add_boolean(innvl, "resumable");
|
||||
|
||||
if (cleanup_fd >= 0)
|
||||
fnvlist_add_int32(innvl, "cleanup_fd", cleanup_fd);
|
||||
|
||||
if (action_handle != NULL)
|
||||
fnvlist_add_uint64(innvl, "action_handle",
|
||||
*action_handle);
|
||||
|
||||
error = lzc_ioctl(ZFS_IOC_RECV_NEW, fsname, innvl, &outnvl);
|
||||
|
||||
@@ -885,10 +878,6 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
|
||||
error = nvlist_lookup_uint64(outnvl, "error_flags",
|
||||
errflags);
|
||||
|
||||
if (error == 0 && action_handle != NULL)
|
||||
error = nvlist_lookup_uint64(outnvl, "action_handle",
|
||||
action_handle);
|
||||
|
||||
if (error == 0 && errors != NULL) {
|
||||
nvlist_t *nvl;
|
||||
error = nvlist_lookup_nvlist(outnvl, "errors", &nvl);
|
||||
@@ -931,12 +920,6 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
|
||||
zc.zc_cleanup_fd = -1;
|
||||
zc.zc_action_handle = 0;
|
||||
|
||||
if (cleanup_fd >= 0)
|
||||
zc.zc_cleanup_fd = cleanup_fd;
|
||||
|
||||
if (action_handle != NULL)
|
||||
zc.zc_action_handle = *action_handle;
|
||||
|
||||
zc.zc_nvlist_dst_size = 128 * 1024;
|
||||
zc.zc_nvlist_dst = (uint64_t)(uintptr_t)
|
||||
malloc(zc.zc_nvlist_dst_size);
|
||||
@@ -951,9 +934,6 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
|
||||
if (errflags != NULL)
|
||||
*errflags = zc.zc_obj;
|
||||
|
||||
if (action_handle != NULL)
|
||||
*action_handle = zc.zc_action_handle;
|
||||
|
||||
if (errors != NULL)
|
||||
VERIFY0(nvlist_unpack(
|
||||
(void *)(uintptr_t)zc.zc_nvlist_dst,
|
||||
@@ -986,7 +966,7 @@ lzc_receive(const char *snapname, nvlist_t *props, const char *origin,
|
||||
boolean_t force, boolean_t raw, int fd)
|
||||
{
|
||||
return (recv_impl(snapname, props, NULL, NULL, 0, origin, force,
|
||||
B_FALSE, raw, fd, NULL, -1, NULL, NULL, NULL, NULL));
|
||||
B_FALSE, raw, fd, NULL, NULL, NULL, NULL));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1000,7 +980,7 @@ lzc_receive_resumable(const char *snapname, nvlist_t *props, const char *origin,
|
||||
boolean_t force, boolean_t raw, int fd)
|
||||
{
|
||||
return (recv_impl(snapname, props, NULL, NULL, 0, origin, force,
|
||||
B_TRUE, raw, fd, NULL, -1, NULL, NULL, NULL, NULL));
|
||||
B_TRUE, raw, fd, NULL, NULL, NULL, NULL));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1023,7 +1003,7 @@ lzc_receive_with_header(const char *snapname, nvlist_t *props,
|
||||
return (EINVAL);
|
||||
|
||||
return (recv_impl(snapname, props, NULL, NULL, 0, origin, force,
|
||||
resumable, raw, fd, begin_record, -1, NULL, NULL, NULL, NULL));
|
||||
resumable, raw, fd, begin_record, NULL, NULL, NULL));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1039,9 +1019,7 @@ lzc_receive_with_header(const char *snapname, nvlist_t *props,
|
||||
* The 'errflags' value will contain zprop_errflags_t flags which are
|
||||
* used to describe any failures.
|
||||
*
|
||||
* The 'action_handle' is used to pass the handle for this guid/ds mapping.
|
||||
* It should be set to zero on first call and will contain an updated handle
|
||||
* on success, it should be passed in subsequent calls.
|
||||
* The 'action_handle' and 'cleanup_fd' are no longer used, and are ignored.
|
||||
*
|
||||
* The 'errors' nvlist contains an entry for each unapplied received
|
||||
* property. Callers are responsible for freeing this nvlist.
|
||||
@@ -1053,8 +1031,8 @@ int lzc_receive_one(const char *snapname, nvlist_t *props,
|
||||
nvlist_t **errors)
|
||||
{
|
||||
return (recv_impl(snapname, props, NULL, NULL, 0, origin, force,
|
||||
resumable, raw, input_fd, begin_record, cleanup_fd, read_bytes,
|
||||
errflags, action_handle, errors));
|
||||
resumable, raw, input_fd, begin_record,
|
||||
read_bytes, errflags, errors));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1073,8 +1051,8 @@ int lzc_receive_with_cmdprops(const char *snapname, nvlist_t *props,
|
||||
nvlist_t **errors)
|
||||
{
|
||||
return (recv_impl(snapname, props, cmdprops, wkeydata, wkeylen, origin,
|
||||
force, resumable, raw, input_fd, begin_record, cleanup_fd,
|
||||
read_bytes, errflags, action_handle, errors));
|
||||
force, resumable, raw, input_fd, begin_record,
|
||||
read_bytes, errflags, errors));
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user