The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7976

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) ===
Fixes #7936 

Signed-off-by: D R Siddhartha <siddharthad...@gmail.com>

I had issues while trying to run the testsuites locally on my machine which I think are probably due to unideal local development environment. I am not sure if the test cases will pass.

Also I couldn't start `make check` without changing the line for `go get -v -x github.com/golang/lint/golint` to `go get -v -x golang.org/x/lint/golint`. [This](https://github.com/golang/lint/issues/415) golint issue resolved it. 
From 858f589003cb244856d500b51571b93cca73e240 Mon Sep 17 00:00:00 2001
From: drs-11 <siddharthad...@gmail.com>
Date: Sun, 4 Oct 2020 00:15:40 +0530
Subject: [PATCH] lxd/storage: Adds rsync.compression config key to
 storagePoolConfigKeys

Signed-off-by: D R Siddhartha <siddharthad...@gmail.com>
---
 doc/api-extensions.md                |  4 ++++
 doc/storage.md                       |  1 +
 lxd/storage/drivers/driver_btrfs.go  | 10 +++++++++-
 lxd/storage/drivers/driver_ceph.go   | 10 +++++++++-
 lxd/storage/drivers/driver_cephfs.go | 12 +++++++++++-
 lxd/storage/drivers/driver_common.go | 11 ++++++++++-
 lxd/storage/drivers/driver_zfs.go    | 10 +++++++++-
 lxd/storage_pools_config.go          |  3 +++
 shared/version/api.go                |  1 +
 test/suites/migration.sh             |  7 +++++++
 10 files changed, 64 insertions(+), 5 deletions(-)

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index 52be415f36..159d86d419 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -1176,3 +1176,7 @@ This includes the following new endpoints (see [RESTful 
API](rest-api.md) for de
 The following existing endpoint has been modified:
 
  * `POST /1.0/storage-pools/<pool>/<type>/<volume>` accepts the new source 
type `backup`
+
+## storage\_rsync\_compression
+Adds `rsync.compression` config key to storage pools. This key can be used
+to disable compression in rsync while migrating storage pools.
\ No newline at end of file
diff --git a/doc/storage.md b/doc/storage.md
index 6e0dd9f5fa..67dc5786f1 100644
--- a/doc/storage.md
+++ b/doc/storage.md
@@ -27,6 +27,7 @@ lvm.vg.force\_reuse             | bool      | lvm driver
 volume.lvm.stripes              | string    | lvm driver                       
 | -                          | storage\_lvm\_stripes              | Number of 
stripes to use for new volumes (or thin pool volume).
 volume.lvm.stripes.size         | string    | lvm driver                       
 | -                          | storage\_lvm\_stripes              | Size of 
stripes to use (at least 4096 bytes and multiple of 512bytes).
 rsync.bwlimit                   | string    | -                                
 | 0 (no limit)               | storage\_rsync\_bwlimit            | Specifies 
the upper limit to be placed on the socket I/O whenever rsync has to be used to 
transfer storage entities.
+rsync.compression               | bool      | appropriate driver               
 | true                       | storage\_rsync\_compression        | Whether to 
use compression while migrating storage pools.
 volatile.initial\_source        | string    | -                                
 | -                          | storage\_volatile\_initial\_source | Records 
the actual source passed during creating (e.g. /dev/sdb).
 volatile.pool.pristine          | string    | -                                
 | true                       | storage\_driver\_ceph              | Whether 
the pool has been empty on creation time.
 volume.block.filesystem         | string    | block based driver (lvm)         
 | ext4                       | storage                            | Filesystem 
to use for new volumes
diff --git a/lxd/storage/drivers/driver_btrfs.go 
b/lxd/storage/drivers/driver_btrfs.go
index 988e741277..d50d80366d 100644
--- a/lxd/storage/drivers/driver_btrfs.go
+++ b/lxd/storage/drivers/driver_btrfs.go
@@ -372,9 +372,17 @@ func (d *btrfs) GetResources() (*api.ResourcesStoragePool, 
error) {
 
 // MigrationType returns the type of transfer methods to be used when doing 
migrations between pools in preference order.
 func (d *btrfs) MigrationTypes(contentType ContentType, refresh bool) 
[]migration.Type {
-       rsyncFeatures := []string{"xattrs", "delete", "compress", 
"bidirectional"}
+       var rsyncFeatures []string
        btrfsFeatures := []string{migration.BTRFSFeatureMigrationHeader, 
migration.BTRFSFeatureSubvolumes}
 
+       // Do not pass compression argument to rsync if the assoicated
+       // config key, that is rsync.compression, is set to false.
+       if d.Config()["rsync.compression"] != "" && 
!shared.IsTrue(d.Config()["rsync.compression"]) {
+               rsyncFeatures = []string{"xattrs", "delete", "bidirectional"}
+       } else {
+               rsyncFeatures = []string{"xattrs", "delete", "compress", 
"bidirectional"}
+       }
+
        // Only offer rsync for refreshes or if running in an unprivileged 
container.
        if refresh || d.state.OS.RunningInUserNS {
                var transportType migration.MigrationFSType
diff --git a/lxd/storage/drivers/driver_ceph.go 
b/lxd/storage/drivers/driver_ceph.go
index f13f1a3c0e..17b16339c5 100644
--- a/lxd/storage/drivers/driver_ceph.go
+++ b/lxd/storage/drivers/driver_ceph.go
@@ -340,7 +340,15 @@ func (d *ceph) GetResources() (*api.ResourcesStoragePool, 
error) {
 
 // MigrationType returns the type of transfer methods to be used when doing 
migrations between pools in preference order.
 func (d *ceph) MigrationTypes(contentType ContentType, refresh bool) 
[]migration.Type {
-       rsyncFeatures := []string{"delete", "compress", "bidirectional"}
+       var rsyncFeatures []string
+
+       // Do not pass compression argument to rsync if the assoicated
+       // config key, that is rsync.compression, is set to false.
+       if d.Config()["rsync.compression"] != "" && 
!shared.IsTrue(d.Config()["rsync.compression"]) {
+               rsyncFeatures = []string{"delete", "bidirectional"}
+       } else {
+               rsyncFeatures = []string{"delete", "compress", "bidirectional"}
+       }
 
        if refresh {
                var transportType migration.MigrationFSType
diff --git a/lxd/storage/drivers/driver_cephfs.go 
b/lxd/storage/drivers/driver_cephfs.go
index d275212c45..fe70d1698b 100644
--- a/lxd/storage/drivers/driver_cephfs.go
+++ b/lxd/storage/drivers/driver_cephfs.go
@@ -312,6 +312,16 @@ func (d *cephfs) GetResources() 
(*api.ResourcesStoragePool, error) {
 
 // MigrationTypes returns the supported migration types and options supported 
by the driver.
 func (d *cephfs) MigrationTypes(contentType ContentType, refresh bool) 
[]migration.Type {
+       var rsyncFeatures []string
+
+       // Do not pass compression argument to rsync if the assoicated
+       // config key, that is rsync.compression, is set to false.
+       if d.Config()["rsync.compression"] != "" && 
!shared.IsTrue(d.Config()["rsync.compression"]) {
+               rsyncFeatures = []string{"delete", "bidirectional"}
+       } else {
+               rsyncFeatures = []string{"delete", "compress", "bidirectional"}
+       }
+
        if contentType != ContentTypeFS {
                return nil
        }
@@ -320,7 +330,7 @@ func (d *cephfs) MigrationTypes(contentType ContentType, 
refresh bool) []migrati
        return []migration.Type{
                {
                        FSType:   migration.MigrationFSType_RSYNC,
-                       Features: []string{"delete", "compress", 
"bidirectional"},
+                       Features: rsyncFeatures,
                },
        }
 }
diff --git a/lxd/storage/drivers/driver_common.go 
b/lxd/storage/drivers/driver_common.go
index 843f5652f0..10c880f8bd 100644
--- a/lxd/storage/drivers/driver_common.go
+++ b/lxd/storage/drivers/driver_common.go
@@ -132,6 +132,15 @@ func (d *common) validateVolume(vol Volume, driverRules 
map[string]func(value st
 // in preference order.
 func (d *common) MigrationTypes(contentType ContentType, refresh bool) 
[]migration.Type {
        var transportType migration.MigrationFSType
+       var rsyncFeatures []string
+
+       // Do not pass compression argument to rsync if the assoicated
+       // config key, that is rsync.compression, is set to false.
+       if d.Config()["rsync.compression"] != "" && 
!shared.IsTrue(d.Config()["rsync.compression"]) {
+               rsyncFeatures = []string{"xattrs", "delete", "bidirectional"}
+       } else {
+               rsyncFeatures = []string{"xattrs", "delete", "compress", 
"bidirectional"}
+       }
 
        if contentType == ContentTypeBlock {
                transportType = migration.MigrationFSType_BLOCK_AND_RSYNC
@@ -142,7 +151,7 @@ func (d *common) MigrationTypes(contentType ContentType, 
refresh bool) []migrati
        return []migration.Type{
                {
                        FSType:   transportType,
-                       Features: []string{"xattrs", "delete", "compress", 
"bidirectional"},
+                       Features: rsyncFeatures,
                },
        }
 }
diff --git a/lxd/storage/drivers/driver_zfs.go 
b/lxd/storage/drivers/driver_zfs.go
index 387a351f5f..1ddc78facc 100644
--- a/lxd/storage/drivers/driver_zfs.go
+++ b/lxd/storage/drivers/driver_zfs.go
@@ -452,7 +452,15 @@ func (d *zfs) GetResources() (*api.ResourcesStoragePool, 
error) {
 
 // MigrationType returns the type of transfer methods to be used when doing 
migrations between pools in preference order.
 func (d *zfs) MigrationTypes(contentType ContentType, refresh bool) 
[]migration.Type {
-       rsyncFeatures := []string{"xattrs", "delete", "compress", 
"bidirectional"}
+       var rsyncFeatures []string
+
+       // Do not pass compression argument to rsync if the assoicated
+       // config key, that is rsync.compression, is set to false.
+       if d.Config()["rsync.compression"] != "" && 
!shared.IsTrue(d.Config()["rsync.compression"]) {
+               rsyncFeatures = []string{"xattrs", "delete", "bidirectional"}
+       } else {
+               rsyncFeatures = []string{"xattrs", "delete", "compress", 
"bidirectional"}
+       }
 
        // When performing a refresh, always use rsync. Using zfs send/receive
        // here doesn't make sense since it would need to send everything again
diff --git a/lxd/storage_pools_config.go b/lxd/storage_pools_config.go
index cfcdf0b234..5c6892bd12 100644
--- a/lxd/storage_pools_config.go
+++ b/lxd/storage_pools_config.go
@@ -81,6 +81,9 @@ var storagePoolConfigKeys = map[string]func(value string) 
error{
        "zfs.clone_copy": validate.Optional(validate.IsBool),
        "zfs.pool_name":  validate.IsAny,
        "rsync.bwlimit":  validate.IsAny,
+
+       // valid drivers: btrfs, ceph, cephfs, zfs
+       "rsync.compression": validate.Optional(validate.IsBool),
 }
 
 func storagePoolValidateConfig(name string, driver string, config 
map[string]string, oldConfig map[string]string) error {
diff --git a/shared/version/api.go b/shared/version/api.go
index dfe5156e54..f893568048 100644
--- a/shared/version/api.go
+++ b/shared/version/api.go
@@ -227,6 +227,7 @@ var APIExtensions = []string{
        "projects_networks",
        "projects_networks_restricted_uplinks",
        "custom_volume_backup",
+       "storage_rsync_compress",
 }
 
 // APIExtensionsCount returns the number of available API extensions.
diff --git a/test/suites/migration.sh b/test/suites/migration.sh
index 6b3896f117..f2416eed6b 100644
--- a/test/suites/migration.sh
+++ b/test/suites/migration.sh
@@ -329,6 +329,13 @@ migration() {
   lxc_remote storage volume delete l2:"$remote_pool2" vol5
   lxc_remote storage volume delete l2:"$remote_pool2" vol6
 
+  # Test migration when rsync compression is disabled
+  lxc_remote storage set l1:"$remote_pool1" rsync.compression false
+  lxc_remote storage volume create l1:"$remote_pool1" foo
+  lxc_remote storage volume copy l1:"$remote_pool1"/foo l2:"$remote_pool2"/bar
+  lxc_remote storage volume delete l1:"$remote_pool1" foo
+  lxc_remote storage volume delete l2:"$remote_pool2" bar
+
   # Test some migration between projects
   lxc_remote project create l1:proj -c features.images=false -c 
features.profiles=false
   lxc_remote project switch l1:proj
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to