I have a contrived scenario which generated the follow vdev trees:

Generated from the labels:
rvd->vdev_children = 1
rvd->vdev_state = VDEV_STATE_DEGRADED
rvd->vdev_child[0]->vdev_children = 5
rvd->vdev_child[0]->vdev_state = VDEV_STATE_DEGRADED
rvd->vdev_child[0]->vdev_child[0]->vdev_children = 2
rvd->vdev_child[0]->vdev_child[0]->vdev_state = VDEV_STATE_CANT_OPEN
rvd->vdev_child[0]->vdev_child[0]->vdev_child[0]->vdev_children = 0
rvd->vdev_child[0]->vdev_child[0]->vdev_child[0]->vdev_state = 
VDEV_STATE_HEALTHY
rvd->vdev_child[0]->vdev_child[0]->vdev_child[1]->vdev_children = 0
rvd->vdev_child[0]->vdev_child[0]->vdev_child[1]->vdev_state = 
VDEV_STATE_CANT_OPEN
rvd->vdev_child[0]->vdev_child[1]->vdev_children = 0
rvd->vdev_child[0]->vdev_child[1]->vdev_state = VDEV_STATE_HEALTHY
rvd->vdev_child[0]->vdev_child[2]->vdev_children = 0
rvd->vdev_child[0]->vdev_child[2]->vdev_state = VDEV_STATE_HEALTHY
rvd->vdev_child[0]->vdev_child[3]->vdev_children = 0
rvd->vdev_child[0]->vdev_child[3]->vdev_state = VDEV_STATE_HEALTHY
rvd->vdev_child[0]->vdev_child[4]->vdev_children = 0
rvd->vdev_child[0]->vdev_child[4]->vdev_state = VDEV_STATE_HEALTHY


Generated from the MOS:
mrvd->vdev_children = 1
mrvd->vdev_state = VDEV_STATE_CLOSED
mrvd->vdev_child[0]->vdev_children = 5
mrvd->vdev_child[0]->vdev_state = VDEV_STATE_CLOSED
mrvd->vdev_child[0]->vdev_child[0]->vdev_children = 0
mrvd->vdev_child[0]->vdev_child[0]->vdev_state = VDEV_STATE_CLOSED
mrvd->vdev_child[0]->vdev_child[1]->vdev_children = 0
mrvd->vdev_child[0]->vdev_child[1]->vdev_state = VDEV_STATE_CLOSED
mrvd->vdev_child[0]->vdev_child[2]->vdev_children = 0
mrvd->vdev_child[0]->vdev_child[2]->vdev_state = VDEV_STATE_CLOSED
mrvd->vdev_child[0]->vdev_child[3]->vdev_children = 0
mrvd->vdev_child[0]->vdev_child[3]->vdev_state = VDEV_STATE_CLOSED
mrvd->vdev_child[0]->vdev_child[4]->vdev_children = 0
mrvd->vdev_child[0]->vdev_child[4]->vdev_state = VDEV_STATE_CLOSED


When this pool is imported, the discrepancy between these two trees causes 
panic in spa_config_valid_zaps().
My question is: shouldn't / couldn't spa_config_valid_zaps(), fail the import ?

I believe that this scenario was created as follows:

  *   Create a 5 disk, raidz1 pool on boxA.
  *   Move the 5 disks to boxB and import the pool
  *   Something went wrong with one of the five disks boxB, and our sparing 
code replaced the bad disk.
  *   The 5 original diks were then moved back to boxA (possibly before the 
resilver was complete).

ZDB shows that only 1 disk of the 5 has a set of labels with the extra children

--
  Dave Baukus


------------------------------------------
openzfs-developer
Archives: 
https://openzfs.topicbox.com/groups/developer/discussions/Tbbf302c79ceef50e-M2a00db269787fe1c1478ecc8
Powered by Topicbox: https://topicbox.com

Reply via email to