Revision 153d9724 lib/bdev.py
b/lib/bdev.py | ||
---|---|---|
701 | 701 |
return self.Shutdown() |
702 | 702 |
|
703 | 703 |
|
704 |
def AddChild(self, device):
|
|
705 |
"""Add a new member to the md raid1.
|
|
704 |
def AddChildren(self, devices):
|
|
705 |
"""Add new member(s) to the md raid1.
|
|
706 | 706 |
|
707 | 707 |
""" |
708 | 708 |
if self.minor is None and not self.Attach(): |
709 | 709 |
raise errors.BlockDeviceError("Can't attach to device") |
710 |
if device.dev_path is None: |
|
711 |
raise errors.BlockDeviceError("New child is not initialised") |
|
712 |
result = utils.RunCmd(["mdadm", "-a", self.dev_path, device.dev_path]) |
|
710 |
|
|
711 |
args = ["mdadm", "-a", self.dev_path] |
|
712 |
for dev in devices: |
|
713 |
if dev.dev_path is None: |
|
714 |
raise errors.BlockDeviceError("Child '%s' is not initialised" % dev) |
|
715 |
dev.Open() |
|
716 |
args.append(dev.dev_path) |
|
717 |
result = utils.RunCmd(args) |
|
713 | 718 |
if result.failed: |
714 | 719 |
raise errors.BlockDeviceError("Failed to add new device to array: %s" % |
715 | 720 |
result.output) |
716 |
new_len = len(self._children) + 1
|
|
721 |
new_len = len(self._children) + len(devices)
|
|
717 | 722 |
result = utils.RunCmd(["mdadm", "--grow", self.dev_path, "-n", new_len]) |
718 | 723 |
if result.failed: |
719 | 724 |
raise errors.BlockDeviceError("Can't grow md array: %s" % |
720 | 725 |
result.output) |
721 |
self._children.append(device)
|
|
726 |
self._children.extend(devices)
|
|
722 | 727 |
|
723 | 728 |
|
724 |
def RemoveChild(self, dev_path):
|
|
725 |
"""Remove member from the md raid1. |
|
729 |
def RemoveChildren(self, devices):
|
|
730 |
"""Remove member(s) from the md raid1.
|
|
726 | 731 |
|
727 | 732 |
""" |
728 | 733 |
if self.minor is None and not self.Attach(): |
729 | 734 |
raise errors.BlockDeviceError("Can't attach to device") |
730 |
if len(self._children) == 1: |
|
731 |
raise errors.BlockDeviceError("Can't reduce member when only one" |
|
732 |
" child left") |
|
733 |
for device in self._children: |
|
734 |
if device.dev_path == dev_path: |
|
735 |
break |
|
736 |
else: |
|
737 |
raise errors.BlockDeviceError("Can't find child with this path") |
|
738 |
new_len = len(self._children) - 1 |
|
739 |
result = utils.RunCmd(["mdadm", "-f", self.dev_path, dev_path]) |
|
735 |
new_len = len(self._children) - len(devices) |
|
736 |
if new_len < 1: |
|
737 |
raise errors.BlockDeviceError("Can't reduce to less than one child") |
|
738 |
args = ["mdadm", "-f", self.dev_path] |
|
739 |
orig_devs = [] |
|
740 |
for dev in devices: |
|
741 |
args.append(dev.dev_path) |
|
742 |
for c in self._children: |
|
743 |
if c.dev_path == dev.dev_path: |
|
744 |
orig_devs.append(c) |
|
745 |
break |
|
746 |
else: |
|
747 |
raise errors.BlockDeviceError("Can't find device '%s' for removal" % |
|
748 |
dev) |
|
749 |
result = utils.RunCmd(args) |
|
740 | 750 |
if result.failed: |
741 |
raise errors.BlockDeviceError("Failed to mark device as failed: %s" % |
|
751 |
raise errors.BlockDeviceError("Failed to mark device(s) as failed: %s" %
|
|
742 | 752 |
result.output) |
743 | 753 |
|
744 | 754 |
# it seems here we need a short delay for MD to update its |
745 | 755 |
# superblocks |
746 | 756 |
time.sleep(0.5) |
747 |
result = utils.RunCmd(["mdadm", "-r", self.dev_path, dev_path]) |
|
757 |
args[1] = "-r" |
|
758 |
result = utils.RunCmd(args) |
|
748 | 759 |
if result.failed: |
749 |
raise errors.BlockDeviceError("Failed to remove device from array:" |
|
750 |
" %s" % result.output)
|
|
760 |
raise errors.BlockDeviceError("Failed to remove device(s) from array:"
|
|
761 |
" %s" % result.output) |
|
751 | 762 |
result = utils.RunCmd(["mdadm", "--grow", "--force", self.dev_path, |
752 | 763 |
"-n", new_len]) |
753 | 764 |
if result.failed: |
754 | 765 |
raise errors.BlockDeviceError("Can't shrink md array: %s" % |
755 | 766 |
result.output) |
756 |
self._children.remove(device) |
|
767 |
for dev in orig_devs: |
|
768 |
self._children.remove(dev) |
|
757 | 769 |
|
758 | 770 |
|
759 | 771 |
def GetStatus(self): |
Also available in: Unified diff