# write data in [0, 2M)
dd if=/dev/zero of=$tf bs=1M count=2 conv=notrunc ||
error "writing $tf failed"
- dd if=/dev/zero of=$tf-1 bs=1M count=4 conv=notrunc ||
+ dd if=/dev/urandom of=$tf-1 bs=1M count=4 conv=notrunc ||
error "writing $tf-1 failed"
+ local sum0=$(cat $tf-1 | md5sum | cut -f 1 -d' ')
+
echo " **verify files be WRITE_PENDING"
verify_flr_state $tf "wp"
verify_flr_state $tf-1 "wp"
echo " **full resync"
$LFS mirror resync $tf $tf-1 || error "mirror resync $tf $tf-1 failed"
+ echo " **verify $tf-1 data consistency in all mirrors"
+ local sum
+ for i in 1 2 3; do
+ sum=$(mirror_io dump -i $i $tf-1 | md5sum | cut -f 1 -d' ')
+ [ "$sum" = "$sum0" ] ||
+ error "$i: mismatch: $sum vs. $sum0"
+ done
+
echo " **verify files be RDONLY"
verify_flr_state $tf "ro"
verify_flr_state $tf-1 "ro"
echo -n "resync file $tf with '$cmd' .."
- $lock_taken && flock -x 200
- $cmd $tf &> /dev/null && echo "done" || echo "failed"
- $lock_taken && flock -u 200
+ if [[ $lock_taken = "true" ]]; then
+ flock -x 200 -c "$cmd $tf &> /dev/null" &&
+ echo "done" || echo "failed"
+ flock -u 200
+ else
+ $cmd $tf &> /dev/null && echo "done" || echo "failed"
+ fi
sleep 0.$((RANDOM % 8 + 1))
done
for (i = 0; i < comp_size; i++) {
ssize_t written;
+ off_t pos2 = pos;
+ size_t to_write2 = to_write;
/* skip non-overlapped component */
- if (pos > comp_array[i].lrc_end ||
- pos + to_write < comp_array[i].lrc_start)
+ if (pos >= comp_array[i].lrc_end ||
+ pos + to_write <= comp_array[i].lrc_start)
continue;
+ if (pos < comp_array[i].lrc_start)
+ pos2 = comp_array[i].lrc_start;
+
+ to_write2 -= pos2 - pos;
+
+ if ((pos + to_write) > comp_array[i].lrc_end)
+ to_write2 -= pos + to_write -
+ comp_array[i].lrc_end;
+
written = llapi_mirror_write(fd,
- comp_array[i].lrc_mirror_id, buf,
- to_write, pos);
+ comp_array[i].lrc_mirror_id,
+ buf + pos2 - pos,
+ to_write2, pos2);
if (written < 0) {
/**
* this component is not written successfully,
comp_array[i].lrc_synced = true;
continue;
}
- assert(written == to_write);
+ assert(written == to_write2);
}
pos += bytes_read;