On Tue, Aug 01 2017, Guoqing Jiang wrote: > For cluster scenario, add device is different with native raid. > When a node issues adds a device, then the node will broadcast > a message with UUID to other nodes in the cluster. If receiving > node can find the device with the specific UUID, it must confirm > the device, otherwise reports it is missing. > > Signed-off-by: Guoqing Jiang <gqjiang@xxxxxxxx> > --- > Makefile | 6 ++++-- > udev-md-clustered-confirm-device.rules | 20 ++++++++++++++++++++ > 2 files changed, 24 insertions(+), 2 deletions(-) > create mode 100644 udev-md-clustered-confirm-device.rules > > diff --git a/Makefile b/Makefile > index 021d3ad..0977f27 100644 > --- a/Makefile > +++ b/Makefile > @@ -256,8 +256,10 @@ install-man: mdadm.8 md.4 mdadm.conf.5 mdmon.8 > $(INSTALL) -D -m 644 md.4 $(DESTDIR)$(MAN4DIR)/md.4 > $(INSTALL) -D -m 644 mdadm.conf.5 $(DESTDIR)$(MAN5DIR)/mdadm.conf.5 > > -install-udev: udev-md-raid-arrays.rules udev-md-raid-assembly.rules udev-md-raid-creating.rules > - @for file in 01-md-raid-creating.rules 63-md-raid-arrays.rules 64-md-raid-assembly.rules ; \ > +install-udev: udev-md-raid-arrays.rules udev-md-raid-assembly.rules udev-md-raid-creating.rules \ > + udev-md-clustered-confirm-device.rules > + @for file in 01-md-raid-creating.rules 63-md-raid-arrays.rules 64-md-raid-assembly.rules \ > + 69-md-clustered-confirm-device.rules ; \ > do sed -e 's,BINDIR,$(BINDIR),g' udev-$${file#??-} > .install.tmp.1 && \ > $(ECHO) $(INSTALL) -D -m 644 udev-$${file#??-} $(DESTDIR)$(UDEVDIR)/rules.d/$$file ; \ > $(INSTALL) -D -m 644 .install.tmp.1 $(DESTDIR)$(UDEVDIR)/rules.d/$$file ; \ > diff --git a/udev-md-clustered-confirm-device.rules b/udev-md-clustered-confirm-device.rules > new file mode 100644 > index 0000000..d763e27 > --- /dev/null > +++ b/udev-md-clustered-confirm-device.rules > @@ -0,0 +1,20 @@ > +# do not edit this file, it will be overwritten on update > + > +SUBSYSTEM!="block", GOTO="clustermd_end" > + > +# handle md arrays > +KERNEL!="md*", GOTO="clustermd_end" > +ENV{DEVTYPE}!="disk", GOTO="clustermd_end" > + > +# Based on the received UUID, node confirms the device if > +# it is found by blkid, otherwise the node reports it is > +# missing. > +ACTION=="change", ENV{EVENT}=="ADD_DEVICE", ENV{DEVICE_UUID}=="?*", ENV{RAID_DISK}=="?*", \ > +PROGRAM="BINDIR/blkid -o device -t UUID_SUB=$env{DEVICE_UUID}", RESULT!="", \ > +RUN+="BINDIR/mdadm --manage $env{DEVNAME} --cluster-confirm $env{RAID_DISK}:$result" > + > +ACTION=="change", ENV{EVENT}=="ADD_DEVICE", ENV{DEVICE_UUID}=="?*", ENV{RAID_DISK}=="?*", \ > +PROGRAM="BINDIR/blkid -o device -t UUID_SUB=$env{DEVICE_UUID}", RESULT=="", \ > +RUN+="BINDIR/mdadm --manage $env{DEVNAME} --cluster-confirm $env{RAID_DISK}:missing" > + > +LABEL="clustermd_end" > -- > 2.10.0 This can run "blkid" twice, which seems wasteful. I think it would be best to skip to the end if ACTION != "change" and if event != ADD_DEVICE etc. Then PROGRAM="BINDIR/blkid -o device -t UUID_SUB=$env{DEVICE_UUID}", ENV{".mdadm.blkid"} = "$result" Then have two rules which tests ENV{".mdadm.blkid"} and run one of the two mdadm commands. NeilBrown
Attachment:
signature.asc
Description: PGP signature