Print this page
3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Submitted by: Steven Hartland <steven.hartland@multiplay.co.uk>

*** 344,358 **** * In this case, when the cleanup_fd is closed (including on process * termination), the holds will be released. If the system is shut down * 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). */ int lzc_hold(nvlist_t *holds, int cleanup_fd, nvlist_t **errlist) { char pool[MAXNAMELEN]; --- 344,369 ---- * In this case, when the cleanup_fd is closed (including on process * termination), the holds will be released. If the system is shut down * uncleanly, the holds will be released when the pool is next opened * or imported. * ! * 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 0 if the nvl holds was empty or all holds, for ! * snapshots that existed, were succesfully created and at least one hold ! * was created. ! * ! * If none of the snapshots for the requested holds existed ENOENT will be ! * returned. ! * ! * Otherwise the return value will be the errno of a (unspecified) hold that ! * failed, 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) { char pool[MAXNAMELEN];
*** 385,399 **** * * The keys in the nvlist are snapshot names. * 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. */ int lzc_release(nvlist_t *holds, nvlist_t **errlist) { char pool[MAXNAMELEN]; --- 396,418 ---- * * The keys in the nvlist are snapshot names. * The snapshots must all be in the same pool. * The value is a nvlist whose keys are the holds to remove. * ! * Holds which failed to release because they didn't exist will have an entry ! * added to errlist, but will not cause an overall failure. ! * ! * The return value will be 0 if the nvl holds was empty or all holds, that ! * existed, were succesfully removed and at least one hold was removed. ! * ! * If none of the holds specified existed ENOENT will be returned. ! * ! * 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) { char pool[MAXNAMELEN];