Mercurial > illumos > illumos-gate
changeset 5712:81f1af42bafc
6628232 zfs snapshot -r is very slow, causes systemic slowdown
author | ahrens |
---|---|
date | Tue, 18 Dec 2007 13:06:45 -0800 |
parents | 8d1c95c51814 |
children | f9b7933f3770 |
files | usr/src/uts/common/fs/zfs/dsl_dataset.c usr/src/uts/common/fs/zfs/zil.c |
diffstat | 2 files changed, 13 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/dsl_dataset.c Tue Dec 18 06:34:32 2007 -0800 +++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c Tue Dec 18 13:06:45 2007 -0800 @@ -179,20 +179,17 @@ } else { dprintf_bp(bp, "putting on dead list: %s", ""); VERIFY(0 == bplist_enqueue(&ds->ds_deadlist, bp, tx)); + ASSERT3U(ds->ds_prev->ds_object, ==, + ds->ds_phys->ds_prev_snap_obj); + ASSERT(ds->ds_prev->ds_phys->ds_num_children > 0); /* if (bp->blk_birth > prev prev snap txg) prev unique += bs */ - if (ds->ds_phys->ds_prev_snap_obj != 0) { - ASSERT3U(ds->ds_prev->ds_object, ==, - ds->ds_phys->ds_prev_snap_obj); - ASSERT(ds->ds_prev->ds_phys->ds_num_children > 0); - if (ds->ds_prev->ds_phys->ds_next_snap_obj == - ds->ds_object && bp->blk_birth > - ds->ds_prev->ds_phys->ds_prev_snap_txg) { - dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); - mutex_enter(&ds->ds_prev->ds_lock); - ds->ds_prev->ds_phys->ds_unique_bytes += - used; - mutex_exit(&ds->ds_prev->ds_lock); - } + if (ds->ds_prev->ds_phys->ds_next_snap_obj == + ds->ds_object && bp->blk_birth > + ds->ds_prev->ds_phys->ds_prev_snap_txg) { + dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); + mutex_enter(&ds->ds_prev->ds_lock); + ds->ds_prev->ds_phys->ds_unique_bytes += used; + mutex_exit(&ds->ds_prev->ds_lock); } } mutex_enter(&ds->ds_lock); @@ -1680,9 +1677,9 @@ bplist_close(&ds->ds_deadlist); dmu_buf_will_dirty(ds->ds_dbuf, tx); - ASSERT3U(ds->ds_phys->ds_prev_snap_txg, <, dsphys->ds_creation_txg); + ASSERT3U(ds->ds_phys->ds_prev_snap_txg, <, tx->tx_txg); ds->ds_phys->ds_prev_snap_obj = dsobj; - ds->ds_phys->ds_prev_snap_txg = dsphys->ds_creation_txg; + ds->ds_phys->ds_prev_snap_txg = tx->tx_txg; ds->ds_phys->ds_unique_bytes = 0; if (spa_version(dp->dp_spa) >= SPA_VERSION_UNIQUE_ACCURATE) ds->ds_phys->ds_flags |= DS_FLAG_UNIQUE_ACCURATE;
--- a/usr/src/uts/common/fs/zfs/zil.c Tue Dec 18 06:34:32 2007 -0800 +++ b/usr/src/uts/common/fs/zfs/zil.c Tue Dec 18 13:06:45 2007 -0800 @@ -456,12 +456,6 @@ mutex_exit(&zilog->zl_lock); dmu_tx_commit(tx); - - if (keep_first) /* no need to wait in this case */ - return; - - txg_wait_synced(zilog->zl_dmu_pool, txg); - ASSERT(BP_IS_HOLE(&zh->zh_log)); } /* @@ -1349,7 +1343,6 @@ zil_destroy(zilog, B_FALSE); mutex_enter(&zilog->zl_lock); - ASSERT(BP_IS_HOLE(&zh->zh_log)); zilog->zl_suspending = B_FALSE; cv_broadcast(&zilog->zl_cv_suspend); mutex_exit(&zilog->zl_lock); @@ -1568,6 +1561,7 @@ kmem_free(zr.zr_lrbuf, 2 * SPA_MAXBLOCKSIZE); zil_destroy(zilog, B_FALSE); + txg_wait_synced(zilog->zl_dmu_pool, zilog->zl_destroy_txg); } /*