Illumos 4881 - zfs send performance regression with embedded data
4881 zfs send performance degradation when embedded block pointers are encountered Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Christopher Siden <christopher.siden@delphix.com> Approved by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/4881 https://github.com/illumos/illumos-gate/commit/06315b7 Ported by: Tim Chase <tim@chase2k.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #2547
This commit is contained in:
parent
3bec585e6c
commit
1fa8f795d5
@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2013 by Delphix. All rights reserved.
|
* Copyright (c) 2012, 2014 by Delphix. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/zfs_context.h>
|
#include <sys/zfs_context.h>
|
||||||
@ -197,6 +197,16 @@ traverse_prefetch_metadata(traverse_data_t *td,
|
|||||||
ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
|
ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static boolean_t
|
||||||
|
prefetch_needed(prefetch_data_t *pfd, const blkptr_t *bp)
|
||||||
|
{
|
||||||
|
ASSERT(pfd->pd_flags & TRAVERSE_PREFETCH_DATA);
|
||||||
|
if (BP_IS_HOLE(bp) || BP_IS_EMBEDDED(bp) ||
|
||||||
|
BP_GET_TYPE(bp) == DMU_OT_INTENT_LOG)
|
||||||
|
return (B_FALSE);
|
||||||
|
return (B_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
|
traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
|
||||||
const blkptr_t *bp, const zbookmark_t *zb)
|
const blkptr_t *bp, const zbookmark_t *zb)
|
||||||
@ -239,16 +249,8 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BP_IS_HOLE(bp)) {
|
if (td->td_pfd != NULL && !td->td_pfd->pd_exited &&
|
||||||
err = td->td_func(td->td_spa, NULL, bp, zb, dnp, td->td_arg);
|
prefetch_needed(td->td_pfd, bp)) {
|
||||||
if (err != 0)
|
|
||||||
goto post;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (td->td_pfd && !td->td_pfd->pd_exited &&
|
|
||||||
((td->td_pfd->pd_flags & TRAVERSE_PREFETCH_DATA) ||
|
|
||||||
BP_GET_TYPE(bp) == DMU_OT_DNODE || BP_GET_LEVEL(bp) > 0)) {
|
|
||||||
mutex_enter(&td->td_pfd->pd_mtx);
|
mutex_enter(&td->td_pfd->pd_mtx);
|
||||||
ASSERT(td->td_pfd->pd_blks_fetched >= 0);
|
ASSERT(td->td_pfd->pd_blks_fetched >= 0);
|
||||||
while (td->td_pfd->pd_blks_fetched == 0 &&
|
while (td->td_pfd->pd_blks_fetched == 0 &&
|
||||||
@ -259,6 +261,13 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
|
|||||||
mutex_exit(&td->td_pfd->pd_mtx);
|
mutex_exit(&td->td_pfd->pd_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BP_IS_HOLE(bp)) {
|
||||||
|
err = td->td_func(td->td_spa, NULL, bp, zb, dnp, td->td_arg);
|
||||||
|
if (err != 0)
|
||||||
|
goto post;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
if (td->td_flags & TRAVERSE_PRE) {
|
if (td->td_flags & TRAVERSE_PRE) {
|
||||||
err = td->td_func(td->td_spa, NULL, bp, zb, dnp,
|
err = td->td_func(td->td_spa, NULL, bp, zb, dnp,
|
||||||
td->td_arg);
|
td->td_arg);
|
||||||
@ -448,10 +457,7 @@ traverse_prefetcher(spa_t *spa, zilog_t *zilog, const blkptr_t *bp,
|
|||||||
if (pfd->pd_cancel)
|
if (pfd->pd_cancel)
|
||||||
return (SET_ERROR(EINTR));
|
return (SET_ERROR(EINTR));
|
||||||
|
|
||||||
if (BP_IS_HOLE(bp) || BP_IS_EMBEDDED(bp) ||
|
if (!prefetch_needed(pfd, bp))
|
||||||
!((pfd->pd_flags & TRAVERSE_PREFETCH_DATA) ||
|
|
||||||
BP_GET_TYPE(bp) == DMU_OT_DNODE || BP_GET_LEVEL(bp) > 0) ||
|
|
||||||
BP_GET_TYPE(bp) == DMU_OT_INTENT_LOG)
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
mutex_enter(&pfd->pd_mtx);
|
mutex_enter(&pfd->pd_mtx);
|
||||||
|
Loading…
Reference in New Issue
Block a user