struct lod_mirror_entry {
__u16 lme_stale:1,
- lme_primary:1;
+ lme_prefer:1;
/* mirror id */
__u16 lme_id;
/* start,end index of this mirror in ldo_comp_entries */
if (mirror_id_of(lod_comp->llc_id) == mirror_id) {
lo->ldo_mirrors[mirror_idx].lme_stale |= stale;
- lo->ldo_mirrors[mirror_idx].lme_primary |= preferred;
+ lo->ldo_mirrors[mirror_idx].lme_prefer |= preferred;
lo->ldo_mirrors[mirror_idx].lme_end = i;
continue;
}
lo->ldo_mirrors[mirror_idx].lme_id = mirror_id;
lo->ldo_mirrors[mirror_idx].lme_stale = stale;
- lo->ldo_mirrors[mirror_idx].lme_primary = preferred;
+ lo->ldo_mirrors[mirror_idx].lme_prefer = preferred;
lo->ldo_mirrors[mirror_idx].lme_start = i;
lo->ldo_mirrors[mirror_idx].lme_end = i;
}
}
/* 2nd pick is for the primary mirror containing unavail OST */
- if (lo->ldo_mirrors[index].lme_primary && second_pick < 0)
+ if (lo->ldo_mirrors[index].lme_prefer && second_pick < 0)
second_pick = index;
/* 3rd pick is for non-primary mirror containing unavail OST */
* we found a non-primary 1st pick, we'd like to find a
* potential pirmary mirror.
*/
- if (picked >= 0 && !lo->ldo_mirrors[index].lme_primary)
+ if (picked >= 0 && !lo->ldo_mirrors[index].lme_prefer)
continue;
/* check the availability of OSTs */
* primary with all OSTs are available, this is the perfect
* 1st pick.
*/
- if (lo->ldo_mirrors[index].lme_primary)
+ if (lo->ldo_mirrors[index].lme_prefer)
break;
} /* for all mirrors */
LASSERT(mlc->mlc_opc == MD_LAYOUT_WRITE ||
mlc->mlc_opc == MD_LAYOUT_RESYNC);
- /* look for the primary mirror */
+ /* look for the first preferred mirror */
for (i = 0; i < lo->ldo_mirror_count; i++) {
if (lo->ldo_mirrors[i].lme_stale)
continue;
- if (lo->ldo_mirrors[i].lme_primary == 0)
+ if (lo->ldo_mirrors[i].lme_prefer == 0)
continue;
- if (unlikely(primary >= 0)) {
- CERROR(DFID " has multiple primary: %u / %u\n",
- PFID(lod_object_fid(lo)),
- lo->ldo_mirrors[i].lme_id,
- lo->ldo_mirrors[primary].lme_id);
- RETURN(-EIO);
- }
-
primary = i;
+ break;
}
if (primary < 0) {
/* no primary, use any in-sync */
[ $flags = wp ] || error "file mirror state $flags != wp"
}
-test_43() {
+test_43a() {
[ $OSTCOUNT -lt 3 ] && skip "needs >= 3 OSTs" && return
local tf=$DIR/$tfile
verify_comp_attr lcme_flags $tf 0x20002 init,stale
verify_comp_attr lcme_flags $tf 0x30003 init,stale
}
-run_test 43 "mirror pick on write"
+run_test 43a "mirror pick on write"
+
+test_43b() {
+ local tf=$DIR/$tdir/$tfile
+
+ test_mkdir $DIR/$tdir
+ rm -f $tf
+
+ # create 3 mirrors FLR file, the first 2 mirrors are preferred
+ $LFS setstripe -N -Eeof --flags=prefer -N -Eeof --flags=prefer \
+ -N -Eeof $tf || error "create 3 mirrors file $tf failed"
+ verify_flr_state $tf "ro"
+
+ echo " ** write to $tf"
+ dd if=/dev/zero of=$tf bs=1M count=1 || error "write $tf failed"
+ verify_flr_state $tf "wp"
+
+ echo " ** resync $tf"
+ $LFS mirror resync $tf || error "resync $tf failed"
+ verify_flr_state $tf "ro"
+}
+run_test 43b "allow writing to multiple preferred mirror file"
test_44() {
[ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return