1af7dcae0SConrad Meyer 29583ab8aSOlivier CochardATF_TEST=true 39583ab8aSOlivier Cochardclass=mirror 49583ab8aSOlivier Cochard. $(atf_get_srcdir)/conf.sh 59583ab8aSOlivier Cochard 6af7dcae0SConrad Meyeratf_test_case run_latest_genid cleanup 7af7dcae0SConrad Meyerrun_latest_genid_head() 8af7dcae0SConrad Meyer{ 9af7dcae0SConrad Meyer atf_set "descr" \ 10af7dcae0SConrad Meyer "Ensure that we properly select components (latest genid) during STARTING." 11af7dcae0SConrad Meyer atf_set "require.user" "root" 12af7dcae0SConrad Meyer} 13af7dcae0SConrad Meyerrun_latest_genid_body() 14af7dcae0SConrad Meyer{ 159583ab8aSOlivier Cochard geom_atf_test_setup 169583ab8aSOlivier Cochard if ! error_message=$(geom_load_class_if_needed nop); then 179583ab8aSOlivier Cochard atf_skip "$error_message" 189583ab8aSOlivier Cochard fi 19af7dcae0SConrad Meyer 20af7dcae0SConrad Meyer f1=$(mktemp ${base}.XXXXXX) 21af7dcae0SConrad Meyer f2=$(mktemp ${base}.XXXXXX) 22af7dcae0SConrad Meyer f3=$(mktemp ${base}.XXXXXX) 23af7dcae0SConrad Meyer rnd1=$(mktemp ${base}.XXXXXX) 24af7dcae0SConrad Meyer rnd2=$(mktemp ${base}.XXXXXX) 25af7dcae0SConrad Meyer 26af7dcae0SConrad Meyer atf_check truncate -s 2M $f1 27af7dcae0SConrad Meyer atf_check truncate -s 2M $f2 28af7dcae0SConrad Meyer atf_check truncate -s 2M $f3 29af7dcae0SConrad Meyer dd if=/dev/urandom bs=512 count=1 of="$rnd1" 30af7dcae0SConrad Meyer dd if=/dev/urandom bs=512 count=1 of="$rnd2" 31af7dcae0SConrad Meyer 32*96950419SGleb Smirnoff attach_md md1 -t vnode -f ${f1} 33*96950419SGleb Smirnoff attach_md md2 -t vnode -f ${f2} 34*96950419SGleb Smirnoff attach_md md3 -t vnode -f ${f3} 35af7dcae0SConrad Meyer 36af7dcae0SConrad Meyer # Use a gnop for md1 just for consistency; it's not used for anything. 37af7dcae0SConrad Meyer atf_check gnop create $md1 38af7dcae0SConrad Meyer atf_check gnop create $md2 39af7dcae0SConrad Meyer atf_check gnop create $md3 40af7dcae0SConrad Meyer # Hardcode component names so that the non-.nop device isn't tasted 41af7dcae0SConrad Meyer # instead. 42af7dcae0SConrad Meyer atf_check gmirror label -h $name ${md1}.nop 43af7dcae0SConrad Meyer devwait 44af7dcae0SConrad Meyer 45af7dcae0SConrad Meyer atf_check gmirror insert -h $name ${md2}.nop 46af7dcae0SConrad Meyer atf_check gmirror insert -h $name ${md3}.nop 47af7dcae0SConrad Meyer syncwait 48af7dcae0SConrad Meyer 49af7dcae0SConrad Meyer # Fail mirror 3, writing known contents to mirror 1+2 block 1 50af7dcae0SConrad Meyer atf_check -s exit:0 -e empty -o empty \ 51af7dcae0SConrad Meyer gnop configure -w 100 ${md3}.nop 52af7dcae0SConrad Meyer atf_check -s exit:0 dd if="$rnd1" bs=512 count=1 oseek=1 conv=notrunc \ 53af7dcae0SConrad Meyer of=/dev/mirror/$name status=none 54af7dcae0SConrad Meyer 55af7dcae0SConrad Meyer disconnectwait nop "${md3}.nop" 56af7dcae0SConrad Meyer 57af7dcae0SConrad Meyer # Should have two mirrors remaining after md3 was evicted 58af7dcae0SConrad Meyer atf_check [ $(gmirror status -s $name | wc -l) -eq 2 ] 59af7dcae0SConrad Meyer atf_check -s exit:0 -o match:"DEGRADED ${md1}.nop \(ACTIVE\)" \ 60af7dcae0SConrad Meyer gmirror status -s $name 61af7dcae0SConrad Meyer atf_check -s exit:0 -o match:"DEGRADED ${md2}.nop \(ACTIVE\)" \ 62af7dcae0SConrad Meyer gmirror status -s $name 63af7dcae0SConrad Meyer 64af7dcae0SConrad Meyer # Repeat: 65af7dcae0SConrad Meyer # Fail mirror 2, writing known contents to mirror 1 block 2 66af7dcae0SConrad Meyer atf_check -s exit:0 -e empty -o empty \ 67af7dcae0SConrad Meyer gnop configure -w 100 ${md2}.nop 68af7dcae0SConrad Meyer atf_check -s exit:0 dd if="$rnd2" bs=512 count=2 oseek=1 conv=notrunc \ 69af7dcae0SConrad Meyer of=/dev/mirror/$name status=none 70af7dcae0SConrad Meyer 71af7dcae0SConrad Meyer disconnectwait nop "${md2}.nop" 72af7dcae0SConrad Meyer 73af7dcae0SConrad Meyer # Should have one mirror remaining after md2 was evicted 74af7dcae0SConrad Meyer atf_check [ $(gmirror status -s $name | wc -l) -eq 1 ] 75af7dcae0SConrad Meyer atf_check -s exit:0 -o match:"DEGRADED ${md1}.nop \(ACTIVE\)" \ 76af7dcae0SConrad Meyer gmirror status -s $name 77af7dcae0SConrad Meyer 78af7dcae0SConrad Meyer # Stop the mirror and remove the pieces so gmirror can't see them. 79af7dcae0SConrad Meyer atf_check gmirror stop $name 80af7dcae0SConrad Meyer atf_check gnop destroy ${md1}.nop 81af7dcae0SConrad Meyer atf_check gnop destroy ${md2}.nop 82af7dcae0SConrad Meyer atf_check gnop destroy ${md3}.nop 83af7dcae0SConrad Meyer 84af7dcae0SConrad Meyer # Rebuild; spin up "disk" with lowest genid 85af7dcae0SConrad Meyer atf_check gnop create $md3 86af7dcae0SConrad Meyer md3gen=$(gmirror dump /dev/${md3}.nop | grep genid | cut -d: -f2) 87af7dcae0SConrad Meyer # Assert gmirror is referencing this component for now: 88af7dcae0SConrad Meyer atf_check [ $(consumerrefs nop ${md3}.nop) = "r1w1e1" ] 89af7dcae0SConrad Meyer 90af7dcae0SConrad Meyer # Adding newer genid should kick out old component 91af7dcae0SConrad Meyer atf_check gnop create $md2 92af7dcae0SConrad Meyer md2gen=$(gmirror dump /dev/${md2}.nop | grep genid | cut -d: -f2) 93af7dcae0SConrad Meyer atf_check [ $md2gen -gt $md3gen ] 94af7dcae0SConrad Meyer 95af7dcae0SConrad Meyer disconnectwait nop "${md3}.nop" 96af7dcae0SConrad Meyer 97af7dcae0SConrad Meyer # Can't test this because 'status' doesn't exist until RUNNING: 98af7dcae0SConrad Meyer #atf_check [ $(gmirror status -s $name | wc -l) -eq 1 ] 99af7dcae0SConrad Meyer # But as a substitute, assert gmirror has dropped reference to staler 100af7dcae0SConrad Meyer # component in favor of newer component: 101af7dcae0SConrad Meyer atf_check [ $(consumerrefs nop ${md2}.nop) = "r1w1e1" ] 102af7dcae0SConrad Meyer 103af7dcae0SConrad Meyer # ditto 104af7dcae0SConrad Meyer atf_check gnop create $md1 105af7dcae0SConrad Meyer md1gen=$(gmirror dump /dev/${md1}.nop | grep genid | cut -d: -f2) 106af7dcae0SConrad Meyer atf_check [ $md1gen -gt $md2gen ] 107af7dcae0SConrad Meyer 108af7dcae0SConrad Meyer disconnectwait nop "${md2}.nop" 109af7dcae0SConrad Meyer 110af7dcae0SConrad Meyer # Assert gmirror has dropped reference to stale component in favor of 111af7dcae0SConrad Meyer # newer component: 112af7dcae0SConrad Meyer atf_check [ $(consumerrefs nop ${md1}.nop) = "r1w1e1" ] 113af7dcae0SConrad Meyer 114af7dcae0SConrad Meyer # gmirror won't start the mirror automatically with only one component 115af7dcae0SConrad Meyer # ($md0) of configured three, so this waits out the 116af7dcae0SConrad Meyer # kern.geom.mirror.timeout: 117af7dcae0SConrad Meyer devwait 118af7dcae0SConrad Meyer 119af7dcae0SConrad Meyer atf_check [ $(gmirror status -s $name | wc -l) -eq 1 ] 120af7dcae0SConrad Meyer atf_check -s exit:0 -o match:"DEGRADED ${md1}.nop \(ACTIVE\)" \ 121af7dcae0SConrad Meyer gmirror status -s $name 122af7dcae0SConrad Meyer} 123af7dcae0SConrad Meyerrun_latest_genid_cleanup() 124af7dcae0SConrad Meyer{ 125af7dcae0SConrad Meyer . $(atf_get_srcdir)/conf.sh 126af7dcae0SConrad Meyer 127af7dcae0SConrad Meyer if [ -f "$TEST_MDS_FILE" ]; then 128af7dcae0SConrad Meyer while read test_md; do 129af7dcae0SConrad Meyer echo "# Removing test gnop: ${test_md}.nop" 130af7dcae0SConrad Meyer gnop destroy -f "${test_md}.nop" 2>/dev/null || : 131af7dcae0SConrad Meyer done < "$TEST_MDS_FILE" 132af7dcae0SConrad Meyer fi 133af7dcae0SConrad Meyer gmirror_test_cleanup 134af7dcae0SConrad Meyer} 135af7dcae0SConrad Meyer 136af7dcae0SConrad Meyeratf_init_test_cases() 137af7dcae0SConrad Meyer{ 138af7dcae0SConrad Meyer atf_add_test_case run_latest_genid 139af7dcae0SConrad Meyer} 140