zpool replace of a top-level log device seems to trigger a resilver that scans
the whole pool.  That's very different from what happens when the device is
removed and re-added.
I think that a full scan should not be needed given that the log device contains
ZIL blocks only from the current unsync-ed TXGs.

I think that the reason for the full scan is this code spa_vdev_attach():
        /*
         * Set newvd's DTL to [TXG_INITIAL, dtl_max_txg) so that we account
         * for any dmu_sync-ed blocks.  It will propagate upward when
         * spa_vdev_exit() calls vdev_dtl_reassess().
         */
        dtl_max_txg = txg + TXG_CONCURRENT_STATES;

        vdev_dtl_dirty(newvd, DTL_MISSING, TXG_INITIAL,
            dtl_max_txg - TXG_INITIAL);

I wonder if fixing the problem could be as easy as using 'txg' instead of
TXG_INITIAL in the case vdev_islog is true.
As far as I can tell txg is set to spa_last_synced_txg(spa) + 1.

What do you think?
Thank you!
-- 
Andriy Gapon

------------------------------------------
openzfs: openzfs-developer
Permalink: 
https://openzfs.topicbox.com/groups/developer/Te6fad9972652421c-M770900762d3b490e7cd6814a
Delivery options: https://openzfs.topicbox.com/groups/developer/subscription

Reply via email to