Mykola Ivanets b00379fbd6 appliance: init: Avoid running degraded md devices
The issue:
- raid1 will be in degraded state if one of its components is logical volume (LV)
- raid0 will be inoperable at all (inacessible from within appliance) if one of its component is LV
- raidN: you can expect the same issue for any raid level depends on how many components are inaccessible at the time mdadm is running and raid redundency.

It happens because mdadm is launched prior to lvm AND it is instructed to run found arrays immediately (--run flag) regardless of completeness of their components.
Later (when lvm activates found LVs) md signature on LV might be recognized BUT newly found raid components could't be inserted into already running (in degraded state)
or marked as inoperable raid arrays.

The patch fixes the issue in the following way:

1. Found arrays won't be run immediately unless ALL expected drives (components) are present. Here '--no-degraded' flag comes into a play. See mdadm(8).
2. Second mdadm call (after LVM is scanned) will scan UNUSED yet devices and make an attempt to run all found arrays (even they will be in degraded state).

There is no performance penalty because second pass scans UNUSED yet devices. Here is 'boot-benchmark' before and after patch:

             : libvirt backend : direct backend
------------------------------------------------
master       : 835.2ms ±1.1ms  : 670.4ms ±0.3ms
master+patch : 837.7ms ±2.4ms  : 671.8ms ±0.2ms
2018-01-16 09:49:21 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2017-11-21 16:36:32 +00:00
2017-12-10 09:34:50 +00:00
2017-01-26 15:05:46 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2018-01-04 15:30:10 +00:00
2017-12-10 09:34:50 +00:00
2018-01-04 15:30:10 +00:00
2016-02-10 14:15:05 +01:00

Libguestfs is tools and a library for accessing and modifying guest
disk images.  For more information see the home page:

  http://libguestfs.org/

For discussion, development, patches, etc. please use the mailing
list:

  http://www.redhat.com/mailman/listinfo/libguestfs

To find out how to build libguestfs from source, read:

  docs/guestfs-building.pod
  http://libguestfs.org/guestfs-building.1.html
  man docs/guestfs-building.1

Copyright (C) 2009-2018 Red Hat Inc.

The library is distributed under the LGPLv2+.  The programs are
distributed under the GPLv2+.  Please see the files COPYING and
COPYING.LIB for full license information.  The examples are under a
very liberal license.
Languages
C 42.7%
OCaml 35.5%
Shell 7.1%
Makefile 4%
Perl 2.6%
Other 8%