I found this question really intriguing, and after spending an hour pouring over documentation, I dived into the code. Here's what I found.
First, some terminology. Ditto blocks (which are what these copies are, as opposed to mirrors) are automatically created on a write but may or may not be in the same virtual device (vdev) as the original copy. On the other hand, mirrored blocks are always reflected onto another virtual device.
However, the code refers to both types of blocks as children. You'll see here that ditto blocks are just children with
io_vd == NULL (this is in the write function). For a mirrored block,
io_vd would be set to the corresponding virtual device (your second disk, for example).
With that in mind, when it gets to the read portion, it treats all children (be they mirror or ditto blocks) as potentially unsafe if it doesn't contain the expected
good_copies, and rewrites them as needed. So it sounds like the answer to your question is--yes, it will rewrite them when you have at least one good copy, and either of the following:
- Unexpected errors when you tried to read the data,
- You are resilvering, or
- You are scrubbing.
Phew! Maybe someone can point out flaws, but I enjoyed learning about ZFS through this little exercise, and I hope this helps!