forked from openzfs/zfs
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make dd_snap_cmtime property persistent across mount and unmount operations by storing in ZAP and restore the value from ZAP on hold into dd_snap_cmtime instead of updating it. Expose dd_snap_cmtime as 'snapshots_changed' property that provides a mechanism to quickly determine whether snapshot list for dataset has changed without having to mount a dataset or iterate the snapshot list. It specifies the time at which a snapshot for a dataset was last created or deleted. This allows us to be more efficient how often we query snapshots. Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Umer Saleem <usaleem@ixsystems.com> Closes openzfs#13635
- Loading branch information
1 parent
27f9f91
commit 2f16803
Showing
14 changed files
with
204 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
127 changes: 127 additions & 0 deletions
127
tests/zfs-tests/tests/functional/snapshot/snapshot_018_pos.ksh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
#! /bin/ksh -p | ||
# | ||
# 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 | ||
# | ||
|
||
# | ||
# Copyright 2022 iXsystems, Inc. | ||
# | ||
|
||
. $STF_SUITE/include/libtest.shlib | ||
. $STF_SUITE/tests/functional/snapshot/snapshot.cfg | ||
|
||
# | ||
# DESCRIPTION: | ||
# Verify the functionality of snapshots_changed property | ||
# | ||
# STRATEGY: | ||
# 1. Create a pool | ||
# 2. Verify snapshots_changed property is NULL | ||
# 3. Create a filesystem | ||
# 4. Verify snapshots_changed property is NULL | ||
# 5. Create snapshots for all filesystems | ||
# 6. Verify snapshots_changed property shows correct time | ||
# 7. Unmount all filesystems | ||
# 8. Create a snapshot while unmounted | ||
# 9. Verify snapshots_changed | ||
# 10. Mount the filsystems | ||
# 11. Verify snapshots_changed | ||
# 12. Destroy the snapshots | ||
# 13. Verify snapshots_changed | ||
# | ||
|
||
function cleanup | ||
{ | ||
create_pool $TESTPOOL $DISKS | ||
} | ||
|
||
verify_runnable "both" | ||
|
||
log_assert "Verify snapshots_changed property" | ||
|
||
log_onexit cleanup | ||
|
||
snap_testpool="$TESTPOOL@v1" | ||
snap_testfsv1="$TESTPOOL/$TESTFS@v1" | ||
snap_testfsv2="$TESTPOOL/$TESTFS@v2" | ||
snapdir=".zfs/snapshot" | ||
|
||
# Create filesystems and check snapshots_changed is NULL | ||
create_pool $TESTPOOL $DISKS | ||
snap_changed_testpool=$(zfs get -H -o value -p snapshots_changed $TESTPOOL) | ||
log_must eval "[[ $snap_changed_testpool == - ]]" | ||
tpool_snapdir=$(get_prop mountpoint $TESTPOOL)/$snapdir | ||
log_must eval "[[ $(stat_mtime $tpool_snapdir) == 0 ]]" | ||
|
||
log_must zfs create $TESTPOOL/$TESTFS | ||
snap_changed_testfs=$(zfs get -H -o value -p snapshots_changed $TESTPOOL/$TESTFS) | ||
log_must eval "[[ $snap_changed_testfs == - ]]" | ||
tfs_snapdir=$(get_prop mountpoint $TESTPOOL/$TESTFS)/$snapdir | ||
log_must eval "[[ $(stat_mtime $tfs_snapdir) == 0 ]]" | ||
|
||
# Create snapshots for filesystems and check snapshots_changed reports correct time | ||
curr_time=$(date '+%s') | ||
log_must zfs snapshot $snap_testpool | ||
snap_changed_testpool=$(zfs get -H -o value -p snapshots_changed $TESTPOOL) | ||
log_must eval "[[ $snap_changed_testpool -ge $curr_time ]]" | ||
log_must eval "[[ $(stat_mtime $tpool_snapdir) == $snap_changed_testpool ]]" | ||
|
||
curr_time=$(date '+%s') | ||
log_must zfs snapshot $snap_testfsv1 | ||
snap_changed_testfs=$(zfs get -H -o value -p snapshots_changed $TESTPOOL/$TESTFS) | ||
log_must eval "[[ $snap_changed_testfs -ge $curr_time ]]" | ||
log_must eval "[[ $(stat_mtime $tfs_snapdir) == $snap_changed_testfs ]]" | ||
|
||
# Unmount the filesystems and check snapshots_changed has correct value after unmount | ||
log_must zfs unmount $TESTPOOL/$TESTFS | ||
log_must eval "[[ $(zfs get -H -o value -p snapshots_changed $TESTPOOL/$TESTFS) == $snap_changed_testfs ]]" | ||
|
||
# Create snapshot while unmounted | ||
curr_time=$(date '+%s') | ||
log_must zfs snapshot $snap_testfsv2 | ||
snap_changed_testfs=$(zfs get -H -o value -p snapshots_changed $TESTPOOL/$TESTFS) | ||
log_must eval "[[ $snap_changed_testfs -ge $curr_time ]]" | ||
|
||
log_must zfs unmount $TESTPOOL | ||
log_must eval "[[ $(zfs get -H -o value -p snapshots_changed $TESTPOOL) == $snap_changed_testpool ]]" | ||
|
||
# Mount back the filesystems and check snapshots_changed still has correct value | ||
log_must zfs mount $TESTPOOL | ||
log_must eval "[[ $(zfs get -H -o value -p snapshots_changed $TESTPOOL) == $snap_changed_testpool ]]" | ||
log_must eval "[[ $(stat_mtime $tpool_snapdir) == $snap_changed_testpool ]]" | ||
|
||
log_must zfs mount $TESTPOOL/$TESTFS | ||
log_must eval "[[ $(zfs get -H -o value -p snapshots_changed $TESTPOOL/$TESTFS) == $snap_changed_testfs ]]" | ||
log_must eval "[[ $(stat_mtime $tfs_snapdir) == $snap_changed_testfs ]]" | ||
|
||
# Destroy the snapshots and check snapshots_changed shows correct time | ||
curr_time=$(date '+%s') | ||
log_must zfs destroy $snap_testfsv1 | ||
snap_changed_testfs=$(zfs get -H -o value -p snapshots_changed $TESTPOOL/$TESTFS) | ||
log_must eval "[[ $snap_changed_testfs -ge $curr_time ]]" | ||
log_must eval "[[ $(stat_mtime $tfs_snapdir) == $snap_changed_testfs ]]" | ||
|
||
curr_time=$(date '+%s') | ||
log_must zfs destroy $snap_testpool | ||
snap_changed_testpool=$(zfs get -H -o value -p snapshots_changed $TESTPOOL) | ||
log_must eval "[[ $snap_changed_testpool -ge $curr_time ]]" | ||
log_must eval "[[ $(stat_mtime $tpool_snapdir) == $snap_changed_testpool ]]" | ||
|
||
log_pass "snapshots_changed property behaves correctly" |