Comment 24 for bug 1020436

Revision history for this message
Steve Fisher (stefan-nicolaivic) wrote :

The root cause was in fact the lvm.conf filter, but explicitly not for the reason you'd think.

The issue is that if I added "a|.*|" into regex array, it was ignoring my 'sd[b-z]', loop and ram exclusions, both singly and in combination.

It seems to be an obscure issue with the use of square brackets inside the regex in certain ways.

Eg if I use the line:

filter = [ "a|.*|", "r|.*|" ]
or
filter = [ "a|.*|", "r|loop|" ]

Then this filters _everything_ in the first example, or just loop devices respectively... just as you would expect.

However as soon as I use something like:

filter = [ "a|.*|", "r|loop[0-9]|" ]

Then I don't get any filtering at all... except that defining _only_ the removal filters, per:

filter = [ "r|loop[0-9]+|" ]

.. and other filters of that ilk DO work as expected -- so long as I remove the "accept-all" regex.

I'm not sure if this parsing behaviour is intended -- it could be to do with the way the array is encapsulated.

Even this line works as expected:

filter = [ "a|.*|", "r|sd.[b-z]|" ]

-- Possibly since placing the the match-any-single-character (".") in there changes the behaviour.

The filter currently in use works as expected and looks like:

    filter = [ "r|sd[b-z]|", "r|ram[0-9]+|", "r|loop[0-9]+|", ]

After update-initramfs and reboot, I can successfully disable paths, and the failover works perfectly.

Your insight is much appreciated, I would never have expected /dev/mapper/mpath0 to become aliased to a single disk target.

I suspect that what has actually happened is that things were working perfectly for a time, but then broke upon a reboot of the server.

Ie, due to the lack of filtering, LVM jumbled the detected volumes at boot time (due to the way /dev is traversed) such that mpath0 was actually pointing at a fixed location eg /dev/sdb rather than being multipathed as expected.