1*946342a2SFabian Grünbichler#!/bin/ksh
2*946342a2SFabian Grünbichler
3*946342a2SFabian Grünbichler#
4*946342a2SFabian Grünbichler# This file and its contents are supplied under the terms of the
5*946342a2SFabian Grünbichler# Common Development and Distribution License ("CDDL"), version 1.0.
6*946342a2SFabian Grünbichler# You may only use this file in accordance with the terms of version
7*946342a2SFabian Grünbichler# 1.0 of the CDDL.
8*946342a2SFabian Grünbichler#
9*946342a2SFabian Grünbichler# A full copy of the text of the CDDL should have accompanied this
10*946342a2SFabian Grünbichler# source.  A copy of the CDDL is also available via the Internet at
11*946342a2SFabian Grünbichler# http://www.illumos.org/license/CDDL.
12*946342a2SFabian Grünbichler#
13*946342a2SFabian Grünbichler
14*946342a2SFabian Grünbichler#
15*946342a2SFabian Grünbichler# Copyright (c) 2017 by Lawrence Livermore National Security, LLC.
16*946342a2SFabian Grünbichler# Copyright (c) 2018 Datto Inc.
17*946342a2SFabian Grünbichler#
18*946342a2SFabian Grünbichler
19*946342a2SFabian Grünbichler. $STF_SUITE/include/libtest.shlib
20*946342a2SFabian Grünbichler. $STF_SUITE/tests/functional/rsend/rsend.kshlib
21*946342a2SFabian Grünbichler
22*946342a2SFabian Grünbichler#
23*946342a2SFabian Grünbichler# Description:
24*946342a2SFabian Grünbichler# Verify incremental receive properly handles objects with changed
25*946342a2SFabian Grünbichler# dnode slot count.
26*946342a2SFabian Grünbichler#
27*946342a2SFabian Grünbichler# Strategy:
28*946342a2SFabian Grünbichler# 1. Populate a dataset with 1k byte dnodes and snapshot
29*946342a2SFabian Grünbichler# 2. Remove objects, set dnodesize=legacy, and remount dataset so new objects
30*946342a2SFabian Grünbichler#    get recycled numbers and formerly "interior" dnode slots get assigned
31*946342a2SFabian Grünbichler#    to new objects
32*946342a2SFabian Grünbichler# 3. Remove objects, set dnodesize=2k, and remount dataset so new objects
33*946342a2SFabian Grünbichler#    overlap with recently recycled and formerly "normal" dnode slots get
34*946342a2SFabian Grünbichler#    assigned to new objects
35*946342a2SFabian Grünbichler# 4. Create an empty file and add xattrs to it to exercise reclaiming a
36*946342a2SFabian Grünbichler#    dnode that requires more than 1 slot for its bonus buffer (Zol #7433)
37*946342a2SFabian Grünbichler# 5. Generate initial and incremental streams
38*946342a2SFabian Grünbichler# 6. Verify initial and incremental streams can be received
39*946342a2SFabian Grünbichler#
40*946342a2SFabian Grünbichler
41*946342a2SFabian Grünbichlerverify_runnable "both"
42*946342a2SFabian Grünbichler
43*946342a2SFabian Grünbichlerlog_assert "Verify incremental receive handles objects with changed dnode size"
44*946342a2SFabian Grünbichler
45*946342a2SFabian Grünbichlerfunction cleanup
46*946342a2SFabian Grünbichler{
47*946342a2SFabian Grünbichler	rm -f $BACKDIR/fs-dn-legacy
48*946342a2SFabian Grünbichler	rm -f $BACKDIR/fs-dn-1k
49*946342a2SFabian Grünbichler	rm -f $BACKDIR/fs-dn-2k
50*946342a2SFabian Grünbichler	rm -f $BACKDIR/fs-attr
51*946342a2SFabian Grünbichler
52*946342a2SFabian Grünbichler	if datasetexists $POOL/fs ; then
53*946342a2SFabian Grünbichler		log_must zfs destroy -rR $POOL/fs
54*946342a2SFabian Grünbichler	fi
55*946342a2SFabian Grünbichler
56*946342a2SFabian Grünbichler	if datasetexists $POOL/newfs ; then
57*946342a2SFabian Grünbichler		log_must zfs destroy -rR $POOL/newfs
58*946342a2SFabian Grünbichler	fi
59*946342a2SFabian Grünbichler}
60*946342a2SFabian Grünbichler
61*946342a2SFabian Grünbichlerlog_onexit cleanup
62*946342a2SFabian Grünbichler
63*946342a2SFabian Grünbichler# 1. Populate a dataset with 1k byte dnodes and snapshot
64*946342a2SFabian Grünbichlerlog_must zfs create -o dnodesize=1k $POOL/fs
65*946342a2SFabian Grünbichlerlog_must mk_files 200 262144 0 $POOL/fs
66*946342a2SFabian Grünbichlerlog_must zfs snapshot $POOL/fs@a
67*946342a2SFabian Grünbichler
68*946342a2SFabian Grünbichler# 2. Remove objects, set dnodesize=legacy, and remount dataset so new objects
69*946342a2SFabian Grünbichler#    get recycled numbers and formerly "interior" dnode slots get assigned
70*946342a2SFabian Grünbichler#    to new objects
71*946342a2SFabian Grünbichlerrm /$POOL/fs/*
72*946342a2SFabian Grünbichler
73*946342a2SFabian Grünbichlerlog_must zfs unmount $POOL/fs
74*946342a2SFabian Grünbichlerlog_must zfs set dnodesize=legacy $POOL/fs
75*946342a2SFabian Grünbichlerlog_must zfs mount $POOL/fs
76*946342a2SFabian Grünbichler
77*946342a2SFabian Grünbichlerlog_must mk_files 200 262144 0 $POOL/fs
78*946342a2SFabian Grünbichlerlog_must zfs snapshot $POOL/fs@b
79*946342a2SFabian Grünbichler
80*946342a2SFabian Grünbichler# 3. Remove objects, set dnodesize=2k, and remount dataset so new objects
81*946342a2SFabian Grünbichler#    overlap with recently recycled and formerly "normal" dnode slots get
82*946342a2SFabian Grünbichler#    assigned to new objects
83*946342a2SFabian Grünbichlerrm /$POOL/fs/*
84*946342a2SFabian Grünbichler
85*946342a2SFabian Grünbichlerlog_must zfs unmount $POOL/fs
86*946342a2SFabian Grünbichlerlog_must zfs set dnodesize=2k $POOL/fs
87*946342a2SFabian Grünbichlerlog_must zfs mount $POOL/fs
88*946342a2SFabian Grünbichler
89*946342a2SFabian Grünbichlerlog_must touch /$POOL/fs/attrs
90*946342a2SFabian Grünbichlermk_files 200 262144 0 $POOL/fs
91*946342a2SFabian Grünbichlerlog_must zfs snapshot $POOL/fs@c
92*946342a2SFabian Grünbichler
93*946342a2SFabian Grünbichler# 4. Create an empty file and add xattrs to it to exercise reclaiming a
94*946342a2SFabian Grünbichler#    dnode that requires more than 1 slot for its bonus buffer (Zol #7433)
95*946342a2SFabian Grünbichlerlog_must zfs set compression=on xattr=sa $POOL/fs
96*946342a2SFabian Grünbichlerlog_must eval "python -c 'print \"a\" * 512' | attr -s bigval /$POOL/fs/attrs"
97*946342a2SFabian Grünbichlerlog_must zfs snapshot $POOL/fs@d
98*946342a2SFabian Grünbichler
99*946342a2SFabian Grünbichler# 5. Generate initial and incremental streams
100*946342a2SFabian Grünbichlerlog_must eval "zfs send $POOL/fs@a > $BACKDIR/fs-dn-1k"
101*946342a2SFabian Grünbichlerlog_must eval "zfs send -i $POOL/fs@a $POOL/fs@b > $BACKDIR/fs-dn-legacy"
102*946342a2SFabian Grünbichlerlog_must eval "zfs send -i $POOL/fs@b $POOL/fs@c > $BACKDIR/fs-dn-2k"
103*946342a2SFabian Grünbichlerlog_must eval "zfs send -i $POOL/fs@c $POOL/fs@d > $BACKDIR/fs-attr"
104*946342a2SFabian Grünbichler
105*946342a2SFabian Grünbichler# 6. Verify initial and incremental streams can be received
106*946342a2SFabian Grünbichlerlog_must eval "zfs recv $POOL/newfs < $BACKDIR/fs-dn-1k"
107*946342a2SFabian Grünbichlerlog_must eval "zfs recv $POOL/newfs < $BACKDIR/fs-dn-legacy"
108*946342a2SFabian Grünbichlerlog_must eval "zfs recv $POOL/newfs < $BACKDIR/fs-dn-2k"
109*946342a2SFabian Grünbichlerlog_must eval "zfs recv $POOL/newfs < $BACKDIR/fs-attr"
110*946342a2SFabian Grünbichler
111*946342a2SFabian Grünbichlerlog_pass "Verify incremental receive handles objects with changed dnode size"
112