[PATCH] update mdraid superBlock space calculation (#883483)

Vratislav Podzimek vpodzime at redhat.com
Wed Dec 5 08:56:12 UTC 2012


On Tue, 2012-12-04 at 09:35 -0800, Brian C. Lane wrote:
> From: "Brian C. Lane" <bcl at redhat.com>
> 
> mdadm 3.2.4 made a major change in the amount of space used for 1.1 and
> 1.2 metadata in order to reserve space for reshaping. See commit
> 508a7f16 in the upstream mdadm repository.
> 
> This has resulted in a large difference between what anaconda thinks the
> size of the array should be and what it actually is.
> 
> We now use 2.0MB for metadata that isn't 1.1 or 1.2
> For 1.1 and 1.2 we calculate the reserved space value and use that.
> 
> NOTE: This is the f18 variation of 87640, tested against anaconda 18.34-1
> ---
>  pyanaconda/storage/devices.py | 57 ++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 56 insertions(+), 1 deletion(-)
> 
> diff --git a/pyanaconda/storage/devices.py b/pyanaconda/storage/devices.py
> index 6967b30..06baab2 100644
> --- a/pyanaconda/storage/devices.py
> +++ b/pyanaconda/storage/devices.py
> @@ -2670,7 +2670,6 @@ class MDRaidArrayDevice(StorageDevice):
>          self._memberDevices = numeric_type(memberDevices)
>  
>          self.chunkSize = 512.0 / 1024.0         # chunk size in MB
> -        self.superBlockSize = 2.0               # superblock size in MB
>  
>          if not self.exists and not isinstance(metadataVersion, str):
>              self.metadataVersion = "default"
> @@ -2699,6 +2698,62 @@ class MDRaidArrayDevice(StorageDevice):
>                                                  % (self.path, self.uuid))
>  
>      @property
> +    def rawArraySize(self):
> +        """ Calculate the raw array size without taking into account space
> +        reserved for metadata or chunkSize alignment.
> +
> +        This is used to calculate the superBlockSize for v1.1 and v1.2
> +        metadata.
> +
> +        Returns the raw size in MB
> +        """
> +        smallestMemberSize = self.smallestMember.size
> +        if self.level == mdraid.RAID0:
> +            size = self.memberDevices * smallestMemberSize
> +        elif self.level == mdraid.RAID1:
> +            size = smallestMemberSize
> +        elif self.level == mdraid.RAID4:
> +            size = (self.memberDevices - 1) * smallestMemberSize
> +        elif self.level == mdraid.RAID5:
> +            size = (self.memberDevices - 1) * smallestMemberSize
> +        elif self.level == mdraid.RAID6:
> +            size = (self.memberDevices - 2) * smallestMemberSize
> +        elif self.level == mdraid.RAID10:
> +            size = (self.memberDevices / 2.0) * smallestMemberSize
> +        else:
> +            size = smallestMemberSize
> +            log.error("unknown RAID level %s" % (self.level))
> +        log.debug("raw RAID %s size == %s" % (self.level, size))
> +        return size
> +
> +    @property
> +    def superBlockSize(self):
> +        """ mdadm has different amounts of space reserved for its use depending
> +        on the metadata type and size of the array.
> +
> +        0.9 use 2.0 MB
> +        1.0 use 2.0 MB
> +        1.1 or 1.2 use the formula lifted from mdadm/super1.c to calculate it
> +        based on the array size.
> +        """
> +        # mdadm 3.2.4 made a major change in the amount of space used for 1.1 and 1.2
> +        # in order to reserve space for reshaping. See commit 508a7f16 in the
> +        # upstream mdadm repository.
> +        if self.metadataVersion not in ["default", "1.1", "1.2"]:
> +            headroom = 2.0
> +        else:
> +            array_size = self.rawArraySize
> +            # MDADM: We try to leave 0.1% at the start for reshape
> +            # MDADM: operations, but limit this to 128Meg (0.1% of 10Gig)
> +            # MDADM: which is plenty for efficient reshapes
> +            # NOTE: In the mdadm code this is in 512b sectors. Converted to use MB
> +            headroom = 128
> +            while headroom << 10 > array_size:
> +                headroom >>= 1
> +        log.info("Using %sMB superBlockSize" % (headroom))
	               no parentheses needed here^^

Otherwise this looks good to me.

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list