mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
fat zap should prefetch when iterating
When iterating over a ZAP object, we're almost always certain to iterate over the entire object. If there are multiple leaf blocks, we can realize a performance win by issuing reads for all the leaf blocks in parallel when the iteration begins. For example, if we have 10,000 snapshots, "zfs destroy -nv pool/fs@1%9999" can take 30 minutes when the cache is cold. This change provides a >3x performance improvement, by issuing the reads for all ~64 blocks of each ZAP object in parallel. Reviewed-by: Andreas Dilger <andreas.dilger@whamcloud.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> External-issue: DLPX-58347 Closes #8862
This commit is contained in:
committed by
Brian Behlendorf
parent
d9cd66e45f
commit
d9b4bf0665
+26
-5
@@ -21,7 +21,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2017 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2011, 2018 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
|
||||
* Copyright 2017 Nexenta Systems, Inc.
|
||||
*/
|
||||
@@ -1472,9 +1472,9 @@ zap_remove_uint64(objset_t *os, uint64_t zapobj, const uint64_t *key,
|
||||
* Routines for iterating over the attributes.
|
||||
*/
|
||||
|
||||
void
|
||||
zap_cursor_init_serialized(zap_cursor_t *zc, objset_t *os, uint64_t zapobj,
|
||||
uint64_t serialized)
|
||||
static void
|
||||
zap_cursor_init_impl(zap_cursor_t *zc, objset_t *os, uint64_t zapobj,
|
||||
uint64_t serialized, boolean_t prefetch)
|
||||
{
|
||||
zc->zc_objset = os;
|
||||
zc->zc_zap = NULL;
|
||||
@@ -1483,12 +1483,33 @@ zap_cursor_init_serialized(zap_cursor_t *zc, objset_t *os, uint64_t zapobj,
|
||||
zc->zc_serialized = serialized;
|
||||
zc->zc_hash = 0;
|
||||
zc->zc_cd = 0;
|
||||
zc->zc_prefetch = prefetch;
|
||||
}
|
||||
void
|
||||
zap_cursor_init_serialized(zap_cursor_t *zc, objset_t *os, uint64_t zapobj,
|
||||
uint64_t serialized)
|
||||
{
|
||||
zap_cursor_init_impl(zc, os, zapobj, serialized, B_TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize a cursor at the beginning of the ZAP object. The entire
|
||||
* ZAP object will be prefetched.
|
||||
*/
|
||||
void
|
||||
zap_cursor_init(zap_cursor_t *zc, objset_t *os, uint64_t zapobj)
|
||||
{
|
||||
zap_cursor_init_serialized(zc, os, zapobj, 0);
|
||||
zap_cursor_init_impl(zc, os, zapobj, 0, B_TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize a cursor at the beginning, but request that we not prefetch
|
||||
* the entire ZAP object.
|
||||
*/
|
||||
void
|
||||
zap_cursor_init_noprefetch(zap_cursor_t *zc, objset_t *os, uint64_t zapobj)
|
||||
{
|
||||
zap_cursor_init_impl(zc, os, zapobj, 0, B_FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user