Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

send_iterate_snap : doall send without fromsnap #11608

Merged
merged 17 commits into from
Feb 24, 2021
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions lib/libzfs/libzfs_sendrecv.c
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,15 @@ send_iterate_snap(zfs_handle_t *zhp, void *arg)
}

if (!sd->recursive) {

/*
* To allow a doall stream to work properly
* with a NULL fromsnap
*/
if (sd->doall && sd->fromsnap == NULL && !sd->seenfrom) {
sd->seenfrom = B_TRUE;
}

if (!sd->seenfrom && isfromsnap) {
sd->seenfrom = B_TRUE;
zfs_close(zhp);
Expand Down
16 changes: 15 additions & 1 deletion tests/zfs-tests/tests/functional/rsend/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
include $(top_srcdir)/config/Rules.am

pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/rsend
dist_pkgdata_SCRIPTS = \
setup.ksh \
Expand Down Expand Up @@ -53,7 +55,8 @@ dist_pkgdata_SCRIPTS = \
send_hole_birth.ksh \
send_invalid.ksh \
send_mixed_raw.ksh \
send-wR_encrypted_zvol.ksh
send-wR_encrypted_zvol.ksh \
send_doall.ksh
behlendorf marked this conversation as resolved.
Show resolved Hide resolved

dist_pkgdata_DATA = \
dedup.zsend.bz2 \
Expand All @@ -62,3 +65,14 @@ dist_pkgdata_DATA = \
fs.tar.gz \
rsend.cfg \
rsend.kshlib

pkgexecdir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/rsend

pkgexec_PROGRAMS = send_doall

send_doall_SOURCES = send_doall.c
send_doall_LDADD = \
$(abs_top_builddir)/lib/libzfs_core/libzfs_core.la \
$(abs_top_builddir)/lib/libzfs/libzfs.la \
$(abs_top_builddir)/lib/libnvpair/libnvpair.la
cedricmaunoury marked this conversation as resolved.
Show resolved Hide resolved

86 changes: 86 additions & 0 deletions tests/zfs-tests/tests/functional/rsend/send_doall.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/

/*
* Portions Copyright 2020 iXsystems, Inc.
*/

/*
* Test a corner case : a "doall" send without children datasets.
*/

#include <libzfs.h>
#include <libzfs_core.h>

#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sysexits.h>
#include <err.h>

static void
usage(const char *name)
{
fprintf(stderr, "usage: %s snap\n", name);
exit(EX_USAGE);
}

int
main(int argc, char const * const argv[])
{
sendflags_t flags = { 0 };
libzfs_handle_t *zhdl;
zfs_handle_t *zhp;
const char *tofull, *fsname, *tosnap, *p;
int error;

if (argc != 1)
usage(argv[0]);

tofull = argv[1];

p = strchr(tofull, '@');
if (p == NULL)
usage(argv[0]);
tosnap = p + 1;

fsname = strndup(tofull, p - tofull);

zhdl = libzfs_init();
if (zhdl == NULL)
errx(EX_OSERR, "libzfs_init(): %s", libzfs_error_init(errno));

zhp = zfs_open(zhdl, fsname, ZFS_TYPE_FILESYSTEM);
if (zhp == NULL)
err(EX_OSERR, "zfs_open(\"%s\")", fsname);

flags.doall = B_TRUE;

error = zfs_send(zhp, NULL, tosnap, &flags, stdout, NULL, NULL, NULL);

zfs_close(zhp);

libzfs_fini(zhdl);
free((void *)fsname);

return (error);
}
59 changes: 59 additions & 0 deletions tests/zfs-tests/tests/functional/rsend/send_doall.ksh
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/bin/ksh

#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#

#
# Copyright (c) 2019 by Lawrence Livermore National Security, LLC.
#

. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/rsend/rsend.kshlib

#
# Description:
# Verify send_doall stream is properly received
#
# Strategy:
# 1) Create a set of snapshots.
# 2) Send these snapshots (from origin to the last one) to a file using send_doall.
# 3) Receive the file to newfs to test if the stream is properly handled.
#

verify_runnable "both"

log_assert "Verify send_doall stream is correct"

function cleanup
{
rm -f $BACKDIR/fs@*
destroy_dataset $POOL/fs "-rR"
destroy_dataset $POOL/newfs "-rR"
}

log_onexit cleanup

log_must zfs create $POOL/fs

# Create 40 files each with a spill block containing xattrs. Each file
# will be modified in a different way to validate the incremental receive.
behlendorf marked this conversation as resolved.
Show resolved Hide resolved
for i in {1..3}; do
file="/$POOL/fs/file$i"

log_must mkfile 16384 $file
log_must zfs snapshot $POOL/fs@snap$i
done

# Snapshot the pool and send it to the new dataset.
log_must eval "$STF_SUITE/tests/functional/rsend/send_doall $POOL/fs@snap3 >$BACKDIR/fs@snap3"
behlendorf marked this conversation as resolved.
Show resolved Hide resolved
log_must eval "zfs recv $POOL/newfs < $BACKDIR/fs@snap3"

cedricmaunoury marked this conversation as resolved.
Show resolved Hide resolved
log_pass "Verify send_doall stream is correct"