Thread (25 messages) 25 messages, 4 authors, 2013-10-20

Re: mdadm 3.3 fails to kick out non fresh disk

From: NeilBrown <hidden>
Date: 2013-09-14 10:38:00

On Sat, 14 Sep 2013 00:35:47 +0200 Francis Moreau [off-list ref]
wrote:
Hi Neil,

On Fri, Sep 13, 2013 at 10:43 PM, NeilBrown [off-list ref] wrote:
quoted
On Fri, 13 Sep 2013 15:22:20 +0200 Francis Moreau [off-list ref]
wrote:
quoted
Hi Neil,

I'm probably doing something wrong since it's a pretty critical bug
but can't see what.

I'm creating a RAID1 array with 1.2 metadata. After that I stop the
array, and restart the array with only one disk. I write random data
on the array and then stop it again:

# mkfs.ext4 /dev/md125
# mdadm --stop /dev/md125
# mdadm -IRs /dev/loop0
# mount /dev/md125 /mnt/
# date >/mnt/foo
# umount /mnt
# mdadm --stop /dev/md125

Finally I restart the array with the 2 disks (one disk is outdated)
and mdadm happily activates the array without error. Note that I add
the outdated disk first in that case:

# mdadm -IRs /dev/loop1
mdadm: /dev/loop1 attached to /dev/md/array1, which has been started.
# mdadm -IRs /dev/loop0
mdadm: /dev/loop0 attached to /dev/md/array1 which is already active.
That's a worry.  I'm not sure how to fix it.

I would probably suggest you don't use "-IR" to add devices.  That would make
it a lot less likely to happen.
Well I'm not sure how I should start an array...

For example doing:

# mdadm -I /dev/loop0
# mdadm -I /dev/loop1
# mdadm -R /dev/md125

works for array using metadata 1.2 but doesn't if the array is using
DDF (mdmon not started). To workaround this issue you suggested to use
-IRs:

# mdadm -IRs /dev/loop0
# mdadm -IRs /dev/loop1
This isn't what I meant.
I mean that after you had run
  mdadm -I /dev/foo
for all devices, you then run
  mdadm -IRs
to start any that are degraded.

BTW I think I've fixed the issue with mdadm -R /dev/md125 for DDF.
Try the latest git.

NeilBrown

but now mdadm can't detect outdated disk anymore.

Could you suggest something to start an array which would work in all
cases (ddf or 1.2, add non-fresh disk...) ?
quoted
quoted
# cat /proc/mdstat
Personalities : [raid1]
md125 : active raid1 loop0[0] loop1[1]
      117056 blocks super 1.2 [2/2] [UU]
# mount /dev/md125 /mnt
# ls /mnt/
[  457.321771] EXT4-fs error (device md125): ext4_lookup:1047: inode
#2: comm ls: deleted inode referenced: 12
ls: cannot access /mnt/1: Input/output error

If I add the outdated disk last I got this:
# mdadm -IRs /dev/loop0
mdadm: /dev/loop0 attached to /dev/md/array1, which has been started.
# mdadm -IRs /dev/loop1
mdadm: can only add /dev/loop1 to /dev/md/array1 as a spare, and
force-spare is not set.
mdadm: failed to add /dev/loop1 to existing array /dev/md/array1:
Invalid argument.

which didn't tell me the reason why loop1 must be a spare.
It  must be a spare because it is out of date.
Yes but I think mdadm should tell the reason, no  ?

Thanks
  

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help