The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/3850
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) ===
From 69b496ea4077806db9d81b07436804af5e77ff54 Mon Sep 17 00:00:00 2001 From: Alberto Donato <[email protected]> Date: Mon, 25 Sep 2017 14:31:02 -0400 Subject: [PATCH 1/4] storage/utils: add growFileSystem helper Signed-off-by: Alberto Donato <[email protected]> --- lxd/storage_lvm_utils.go | 15 +-------------- lxd/storage_utils.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go index e12884e0e..28850a443 100644 --- a/lxd/storage_lvm_utils.go +++ b/lxd/storage_lvm_utils.go @@ -57,20 +57,7 @@ func (s *storageLvm) lvExtend(lvPath string, lvSize int64, fsType string, fsMntP `volume type %d`, volumeType) } - switch fsType { - case "xfs": - msg, err = shared.TryRunCommand("xfs_growfs", fsMntPoint) - default: - // default = ext4 - msg, err = shared.TryRunCommand("resize2fs", lvPath) - } - if err != nil { - logger.Errorf("could not extend underlying %s filesystem for LV \"%s\": %s", fsType, lvPath, msg) - return fmt.Errorf("could not extend underlying %s filesystem for LV \"%s\": %s", fsType, lvPath, msg) - } - - logger.Debugf("extended underlying %s filesystem for LV \"%s\"", fsType, lvPath) - return nil + return growFileSystem(fsType, fsMntPoint, lvPath) } func (s *storageLvm) lvReduce(lvPath string, lvSize int64, fsType string, fsMntPoint string, volumeType int, data interface{}) error { diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go index 8d26f9a1f..df1df29ed 100644 --- a/lxd/storage_utils.go +++ b/lxd/storage_utils.go @@ -10,6 +10,7 @@ import ( "github.com/lxc/lxd/lxd/db" "github.com/lxc/lxd/shared" + "github.com/lxc/lxd/shared/logger" ) // Options for filesystem creation @@ -224,3 +225,27 @@ func xfsGenerateNewUUID(lvpath string) (string, error) { return "", nil } + +func growFileSystem(fsType string, devPath string, mntpoint string) error { + var msg string + var err error + switch fsType { + case "": // if not specified, default to ext4 + fallthrough + case "ext4": + msg, err = shared.TryRunCommand("resize2fs", mntpoint) + case "xfs": + msg, err = shared.TryRunCommand("xfs_growfs", devPath) + default: + return fmt.Errorf(`Unsupported filesystem type "%s"`, fsType) + } + + if err != nil { + errorMsg := fmt.Sprintf(`Could not extend underlying %s filesystem for "%s": %s`, fsType, devPath, msg) + logger.Errorf(errorMsg) + return fmt.Errorf(errorMsg) + } + + logger.Debugf(`extended underlying %s filesystem for "%s"`, fsType, devPath) + return nil +} From 083ad93250fb7126edba9749398df933abacca2f Mon Sep 17 00:00:00 2001 From: Alberto Donato <[email protected]> Date: Mon, 25 Sep 2017 14:55:29 -0400 Subject: [PATCH 2/4] storage/utils: add shrinkFileSystem helper Signed-off-by: Alberto Donato <[email protected]> --- lxd/storage_lvm_utils.go | 18 ++++-------------- lxd/storage_utils.go | 28 +++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go index 28850a443..546fd4241 100644 --- a/lxd/storage_lvm_utils.go +++ b/lxd/storage_lvm_utils.go @@ -101,21 +101,11 @@ func (s *storageLvm) lvReduce(lvPath string, lvSize int64, fsType string, fsMntP `storage volume type %d`, volumeType) } - msg, err = shared.TryRunCommand("e2fsck", "-f", "-y", lvPath) - if err != nil { - return err - } + } - // don't assume resize2fs semantics are sane (because they - // aren't) - kbSize := lvSize / 1024 - ext4LvSizeString := strconv.FormatInt(kbSize, 10) - ext4LvSizeString += "K" - msg, err = shared.TryRunCommand("resize2fs", lvPath, ext4LvSizeString) - if err != nil { - logger.Errorf("could not reduce underlying %s filesystem for LV \"%s\": %s", fsType, lvPath, msg) - return fmt.Errorf("could not reduce underlying %s filesystem for LV \"%s\": %s", fsType, lvPath, msg) - } + err = shrinkFileSystem(fsType, lvPath, lvSize) + if err != nil { + return err } msg, err = shared.TryRunCommand( diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go index df1df29ed..64946175f 100644 --- a/lxd/storage_utils.go +++ b/lxd/storage_utils.go @@ -237,7 +237,7 @@ func growFileSystem(fsType string, devPath string, mntpoint string) error { case "xfs": msg, err = shared.TryRunCommand("xfs_growfs", devPath) default: - return fmt.Errorf(`Unsupported filesystem type "%s"`, fsType) + return fmt.Errorf(`Growing not supported for filesystem type "%s"`, fsType) } if err != nil { @@ -249,3 +249,29 @@ func growFileSystem(fsType string, devPath string, mntpoint string) error { logger.Debugf(`extended underlying %s filesystem for "%s"`, fsType, devPath) return nil } + +func shrinkFileSystem(fsType string, devPath string, byteSize int64) error { + var msg string + var err error + switch fsType { + case "": // if not specified, default to ext4 + fallthrough + case "ext4": + msg, err = shared.TryRunCommand("e2fsck", "-f", "-y", devPath) + if err != nil { + return err + } + kbSize := byteSize / 1024 + msg, err = shared.TryRunCommand("resize2fs", devPath, fmt.Sprintf("%dK", kbSize)) + + default: + return fmt.Errorf(`Shrinking not supported for filesystem type "%s"`, fsType) + } + + if err != nil { + errorMsg := fmt.Sprintf(`Could not reduce underlying %s filesystem for "%s": %s`, fsType, devPath, msg) + logger.Errorf(errorMsg) + return fmt.Errorf(errorMsg) + } + return nil +} From 871672b4325e2ff5568a4b015dd140e746d8fd6b Mon Sep 17 00:00:00 2001 From: Alberto Donato <[email protected]> Date: Mon, 25 Sep 2017 15:00:58 -0400 Subject: [PATCH 3/4] storage/ceph: use [grow|shrink]FileSystem helpers Signed-off-by: Alberto Donato <[email protected]> --- lxd/storage_ceph_utils.go | 42 +++++------------------------------------- 1 file changed, 5 insertions(+), 37 deletions(-) diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go index 10504fa2d..5fe5609c0 100644 --- a/lxd/storage_ceph_utils.go +++ b/lxd/storage_ceph_utils.go @@ -1587,26 +1587,11 @@ func (s *storageCeph) rbdShrink(path string, size int64, fsType string, return fmt.Errorf(`Resizing not implemented for `+ `storage volume type %d`, volumeType) } + } - msg, err = shared.TryRunCommand("e2fsck", "-f", "-y", path) - if err != nil { - return err - } - - // don't assume resize2fs semantics are sane (because they - // aren't) - kbSize := size / 1024 - ext4SizeString := strconv.FormatInt(kbSize, 10) - ext4SizeString += "K" - msg, err = shared.TryRunCommand("resize2fs", path, ext4SizeString) - if err != nil { - logger.Errorf(`Could not reduce underlying %s `+ - `filesystem for RBD storage volume "%s": %s`, - fsType, path, msg) - return fmt.Errorf(`Could not reduce underlying %s `+ - `filesystem for RBD storage volume "%s": %s`, - fsType, path, msg) - } + err = shrinkFileSystem(fsType, path, size) + if err != nil { + return err } msg, err = shared.TryRunCommand( @@ -1680,22 +1665,5 @@ func (s *storageCeph) rbdGrow(path string, size int64, fsType string, %s`, path, msg) } - switch fsType { - case "xfs": - msg, err = shared.TryRunCommand("xfs_growfs", fsMntPoint) - default: - // default = ext4 - msg, err = shared.TryRunCommand("resize2fs", path) - } - if err != nil { - logger.Errorf(`Could not extend underlying %s `+ - `filesystem for RBD storage volume "%s": %s`, - fsType, path, msg) - return fmt.Errorf(`Could not extend underlying %s `+ - `filesystem for RBD storage volume "%s": %s`, - fsType, path, msg) - } - - logger.Debugf("extended underlying %s filesystem for LV \"%s\"", fsType, path) - return nil + return growFileSystem(fsType, path, fsMntPoint) } From dc93a29be5f3748fc84fc58e7785d34b6e2f66d2 Mon Sep 17 00:00:00 2001 From: Alberto Donato <[email protected]> Date: Mon, 25 Sep 2017 16:57:39 -0400 Subject: [PATCH 4/4] storage/utils: add shrinkVolumeFilesystem helper Signed-off-by: Alberto Donato <[email protected]> --- lxd/storage_ceph_utils.go | 46 +++++++++++++--------------------------------- lxd/storage_lvm_utils.go | 37 ++++--------------------------------- lxd/storage_utils.go | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 66 deletions(-) diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go index 5fe5609c0..a6510e848 100644 --- a/lxd/storage_ceph_utils.go +++ b/lxd/storage_ceph_utils.go @@ -1556,44 +1556,24 @@ func (s *storageCeph) rbdShrink(path string, size int64, fsType string, `less than 1MB`) } - volumeTypeName := "" - switch fsType { - case "xfs": - logger.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, and restore are required") - return fmt.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, and restore are required") - default: - // default = ext4 - switch volumeType { - case storagePoolVolumeTypeContainer: - c := data.(container) - ourMount, err := c.StorageStop() - if err != nil { - return err - } - if !ourMount { - defer c.StorageStart() - } - volumeTypeName = storagePoolVolumeTypeNameContainer - case storagePoolVolumeTypeCustom: - ourMount, err := s.StoragePoolVolumeUmount() - if err != nil { - return err - } - if !ourMount { - defer s.StoragePoolVolumeMount() - } - volumeTypeName = storagePoolVolumeTypeNameCustom - default: - return fmt.Errorf(`Resizing not implemented for `+ - `storage volume type %d`, volumeType) - } + cleanupFunc, err := shrinkVolumeFilesystem(s, volumeType, fsType, path, size, data) + if cleanupFunc != nil { + defer cleanupFunc() } - - err = shrinkFileSystem(fsType, path, size) if err != nil { return err } + volumeTypeName := "" + switch volumeType { + case storagePoolVolumeTypeContainer: + volumeTypeName = storagePoolVolumeTypeNameContainer + case storagePoolVolumeTypeCustom: + volumeTypeName = storagePoolVolumeTypeNameCustom + default: + return fmt.Errorf(`Resizing not implemented for `+ + `storage volume type %d`, volumeType) + } msg, err = shared.TryRunCommand( "rbd", "resize", diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go index 546fd4241..62e61d7c6 100644 --- a/lxd/storage_lvm_utils.go +++ b/lxd/storage_lvm_utils.go @@ -70,44 +70,15 @@ func (s *storageLvm) lvReduce(lvPath string, lvSize int64, fsType string, fsMntP return fmt.Errorf(`The size of the storage volume would be ` + `less than 1MB`) } - - lvSizeString := strconv.FormatInt(lvSize, 10) - switch fsType { - case "xfs": - logger.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, and restore are required") - return fmt.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, and restore are required") - default: - // default = ext4 - switch volumeType { - case storagePoolVolumeTypeContainer: - c := data.(container) - ourMount, err := c.StorageStop() - if err != nil { - return err - } - if !ourMount { - defer c.StorageStart() - } - case storagePoolVolumeTypeCustom: - ourMount, err := s.StoragePoolVolumeUmount() - if err != nil { - return err - } - if !ourMount { - defer s.StoragePoolVolumeMount() - } - default: - return fmt.Errorf(`Resizing not implemented for `+ - `storage volume type %d`, volumeType) - } - + cleanupFunc, err := shrinkVolumeFilesystem(s, volumeType, fsType, lvPath, lvSize, data) + if cleanupFunc != nil { + defer cleanupFunc() } - - err = shrinkFileSystem(fsType, lvPath, lvSize) if err != nil { return err } + lvSizeString := strconv.FormatInt(lvSize, 10) msg, err = shared.TryRunCommand( "lvreduce", "-L", lvSizeString+"B", diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go index 64946175f..81171a0fd 100644 --- a/lxd/storage_utils.go +++ b/lxd/storage_utils.go @@ -275,3 +275,42 @@ func shrinkFileSystem(fsType string, devPath string, byteSize int64) error { } return nil } + +func shrinkVolumeFilesystem(s storage, volumeType int, fsType string, devPath string, byteSize int64, data interface{}) (func() (bool, error), error) { + var cleanupFunc func() (bool, error) + switch fsType { + case "xfs": + logger.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, and restore are required") + return nil, fmt.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, and restore are required") + case "": // if not specified, default to ext4 + fallthrough + case "ext4": + switch volumeType { + case storagePoolVolumeTypeContainer: + c := data.(container) + ourMount, err := c.StorageStop() + if err != nil { + return nil, err + } + if !ourMount { + cleanupFunc = c.StorageStart + } + case storagePoolVolumeTypeCustom: + ourMount, err := s.StoragePoolVolumeUmount() + if err != nil { + return nil, err + } + if !ourMount { + cleanupFunc = s.StoragePoolVolumeMount + } + default: + return nil, fmt.Errorf(`Resizing not implemented for storage volume type %d`, volumeType) + } + + default: + return nil, fmt.Errorf(`Shrinking not supported for filesystem type "%s"`, fsType) + } + + err := shrinkFileSystem(fsType, devPath, byteSize) + return cleanupFunc, err +}
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
