Skip to contentSkip to conversation

smarter md minor search than "find_free_devnum" needed

DISCUSSION Sebastian Riemer 1 participant 2 messages Jul 23, 2012 – Jul 24, 2012 MD RAID

lore
Share & tools
lore
#0 lore raw

Hi list,

I'm thinking about creation of many MD RAID 1 devices by automatic scripts. The MD minor numbers should be auto-determined. But if I do this with mdadm 3.2.5 and kernel 3.4.2 without udev, then it gets slower the more devices I create. I also had to patch mdadm to make "--symlinks=no" really work (preventing "/dev/md/*" symlinks to be created).

Looks like this:
# MDADM_NO_UDEV=1 mdadm -C auto --symlinks=no --assume-clean --force -l 1 -n 2 /dev/loop$i /dev/loop$j

Btw.: With udev it hangs for some seconds.

With this it is fast but can't use it for production (I only have the UUIDs):
# MDADM_NO_UDEV=1 mdadm -C /dev/md$k --assume-clean --force -l 1 -n 2 /dev/loop$i /dev/loop$j

What about caching the next free minor number in kernel space, taking it, finding the next free and updating it?
Or is there another possibility (putting this into a custom daemon should be avoided)?

If I identify the MD devices by UUID, I don't want to care which minor number they actually have upon creation/assembly.

Cheers,
Sebastian

Signature · 14 lines
Sebastian Riemer
Linux Kernel Developer

ProfitBricks GmbH • Greifswalder Str. 207 • 10405 Berlin, Germany
www.profitbricks.com • [email protected]

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Andreas Gauger, Achim Weiss

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#1 lore raw

Hi all,

I've found a faster solution by reading the names of active MD devices from sysfs into memory and processing them from there. With 500 devices this lasts approx. 70 ms instead of 3 s with "find_free_devnum()" in mdadm.

Here I've got it as shell code. In C it can be implemented better.

#!/bin/bash
cd /sys/block
LIST=ls -1d md* 2>/dev/null | egrep -o '[0-9]*' | sort -n LIST_ARR=($LIST)

if [ "$LIST" == "" ]; then
echo "md0"
exit 0
fi

for ((i=0; i<1048575; i++)); do
if [ $i -ge ${#LIST_ARR[*]} ]; then

    echo "md$i"
    exit 0
  elif [ ${LIST_ARR[$i]} -gt $i ]; then
    echo "md$i"
    exit 0

fi
done
exit 1

Of cause this needs locking until the MD device is created (further 0.8s).

Cheers,
Sebastian

Quoted 29 lines · Sebastian Riemer

Hi list,

I'm thinking about creation of many MD RAID 1 devices by automatic scripts. The MD minor numbers should be auto-determined. But if I do this with mdadm 3.2.5 and kernel 3.4.2 without udev, then it gets slower the more devices I create. I also had to patch mdadm to make "--symlinks=no" really work (preventing "/dev/md/*" symlinks to be created).

Looks like this:
# MDADM_NO_UDEV=1 mdadm -C auto --symlinks=no --assume-clean --force -l 1 -n 2 /dev/loop$i /dev/loop$j

Btw.: With udev it hangs for some seconds.

With this it is fast but can't use it for production (I only have the UUIDs):
# MDADM_NO_UDEV=1 mdadm -C /dev/md$k --assume-clean --force -l 1 -n 2 /dev/loop$i /dev/loop$j

What about caching the next free minor number in kernel space, taking it, finding the next free and updating it?
Or is there another possibility (putting this into a custom daemon should be avoided)?

If I identify the MD devices by UUID, I don't want to care which minor number they actually have upon creation/assembly.

Cheers,
Sebastian