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.
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.