mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
Illumos #3740
3740 Poor ZFS send / receive performance due to snapshot
hold / release processing
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Christopher Siden <christopher.siden@delphix.com>
References:
https://www.illumos.org/issues/3740
illumos/illumos-gate@a7a845e4bf
Ported-by: Richard Yao <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #1775
Porting notes:
1. 13fe019870 introduced a merge conflict
in dsl_dataset_user_release_tmp where some variables were moved
outside of the preprocessor directive.
2. dea9dfefdd747534b3846845629d2200f0616dad made the previous merge
conflict worse by switching KM_SLEEP to KM_PUSHPAGE. This is notable
because this commit refactors the code, adding a new KM_SLEEP
allocation. It is not clear to me whether this should be converted
to KM_PUSHPAGE.
3. We had a merge conflict in libzfs_sendrecv.c because of copyright
notices.
4. Several small C99 compatibility fixed were made.
This commit is contained in:
committed by
Brian Behlendorf
parent
7bc7f25040
commit
95fd54a1c5
@@ -21,6 +21,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 2012 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2013 Steven Hartland. All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -254,8 +255,11 @@ lzc_snapshot(nvlist_t *snaps, nvlist_t *props, nvlist_t **errlist)
|
||||
* marked for deferred destruction, and will be destroyed when the last hold
|
||||
* or clone is removed/destroyed.
|
||||
*
|
||||
* The return value will be ENOENT if none of the snapshots existed.
|
||||
*
|
||||
* The return value will be 0 if all snapshots were destroyed (or marked for
|
||||
* later destruction if 'defer' is set) or didn't exist to begin with.
|
||||
* later destruction if 'defer' is set) or didn't exist to begin with and
|
||||
* at least one snapshot was destroyed.
|
||||
*
|
||||
* Otherwise the return value will be the errno of a (unspecified) snapshot
|
||||
* that failed, no snapshots will be destroyed, and the errlist will have an
|
||||
@@ -286,7 +290,6 @@ lzc_destroy_snaps(nvlist_t *snaps, boolean_t defer, nvlist_t **errlist)
|
||||
nvlist_free(args);
|
||||
|
||||
return (error);
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
@@ -346,11 +349,22 @@ lzc_exists(const char *dataset)
|
||||
* uncleanly, the holds will be released when the pool is next opened
|
||||
* or imported.
|
||||
*
|
||||
* The return value will be 0 if all holds were created. Otherwise the return
|
||||
* value will be the errno of a (unspecified) hold that failed, no holds will
|
||||
* be created, and the errlist will have an entry for each hold that
|
||||
* failed (name = snapshot). The value in the errlist will be the error
|
||||
* code (int32).
|
||||
* Holds for snapshots which don't exist will be skipped and have an entry
|
||||
* added to errlist, but will not cause an overall failure, except in the
|
||||
* case that all holds where skipped.
|
||||
*
|
||||
* The return value will be ENOENT if none of the snapshots for the requested
|
||||
* holds existed.
|
||||
*
|
||||
* The return value will be 0 if the nvl holds was empty or all holds, for
|
||||
* snapshots that existed, were succesfully created and at least one hold
|
||||
* was created.
|
||||
*
|
||||
* Otherwise the return value will be the errno of a (unspecified) hold that
|
||||
* failed and no holds will be created.
|
||||
*
|
||||
* In all cases the errlist will have an entry for each hold that failed
|
||||
* (name = snapshot), with its value being the error code (int32).
|
||||
*/
|
||||
int
|
||||
lzc_hold(nvlist_t *holds, int cleanup_fd, nvlist_t **errlist)
|
||||
@@ -387,11 +401,20 @@ lzc_hold(nvlist_t *holds, int cleanup_fd, nvlist_t **errlist)
|
||||
* The snapshots must all be in the same pool.
|
||||
* The value is a nvlist whose keys are the holds to remove.
|
||||
*
|
||||
* The return value will be 0 if all holds were removed.
|
||||
* Otherwise the return value will be the errno of a (unspecified) release
|
||||
* that failed, no holds will be released, and the errlist will have an
|
||||
* entry for each snapshot that has failed releases (name = snapshot).
|
||||
* The value in the errlist will be the error code (int32) of a failed release.
|
||||
* Holds which failed to release because they didn't exist will have an entry
|
||||
* added to errlist, but will not cause an overall failure, except in the
|
||||
* case that all releases where skipped.
|
||||
*
|
||||
* The return value will be ENOENT if none of the specified holds existed.
|
||||
*
|
||||
* The return value will be 0 if the nvl holds was empty or all holds that
|
||||
* existed, were successfully removed and at least one hold was removed.
|
||||
*
|
||||
* Otherwise the return value will be the errno of a (unspecified) hold that
|
||||
* failed to release and no holds will be released.
|
||||
*
|
||||
* In all cases the errlist will have an entry for each hold that failed to
|
||||
* to release.
|
||||
*/
|
||||
int
|
||||
lzc_release(nvlist_t *holds, nvlist_t **errlist)
|
||||
|
||||
Reference in New Issue
Block a user