[lxc-devel] [lxd/master] Storage migration target - support 2 phase sync
tomponline on Github
lxc-bot at linuxcontainers.org
Wed Dec 4 09:05:48 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 377 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20191204/9d01a046/attachment.bin>
-------------- next part --------------
From 37fbfa8f7c502c69380a80812dfa90bce529765d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 3 Dec 2019 15:40:21 +0000
Subject: [PATCH 1/4] lxd/storage/backend/lxd: Comment typos
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/storage/backend_lxd.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lxd/storage/backend_lxd.go b/lxd/storage/backend_lxd.go
index 18840f0008..a347fb62e8 100644
--- a/lxd/storage/backend_lxd.go
+++ b/lxd/storage/backend_lxd.go
@@ -842,8 +842,8 @@ func (b *lxdBackend) CreateInstanceFromMigration(inst instance.Instance, conn io
}()
// If the negotiated migration method is rsync and the instance's base image is
- // already on the host then pre-create the instance's volume using the locla image
- // to try and speed up the rsync of the incoming volume by avoiding the new to
+ // already on the host then pre-create the instance's volume using the local image
+ // to try and speed up the rsync of the incoming volume by avoiding the need to
// transfer the base image files too.
if args.MigrationType.FSType == migration.MigrationFSType_RSYNC {
fingerprint := inst.ExpandedConfig()["volatile.base_image"]
From 33be0f9b99db85d3ecb081059616d12f8662c217 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 4 Dec 2019 08:56:06 +0000
Subject: [PATCH 2/4] lxd/storage/drivers/drive/dir: Add support for 2-phase
migration
Adds support for a final rootfs volume sync stage which is sometimes requested by sender.
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/storage/drivers/driver_dir.go | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go
index 2a6b83c6b3..7d8a0563bd 100644
--- a/lxd/storage/drivers/driver_dir.go
+++ b/lxd/storage/drivers/driver_dir.go
@@ -431,7 +431,24 @@ func (d *dir) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, vol
wrapper = migration.ProgressTracker(op, "fs_progress", vol.name)
}
- return rsync.Recv(path, conn, wrapper, volTargetArgs.MigrationType.Features)
+ err = rsync.Recv(path, conn, wrapper, volTargetArgs.MigrationType.Features)
+ if err != nil {
+ return err
+ }
+
+ // Receive the final main volume sync if needed.
+ if volTargetArgs.Live {
+ if volTargetArgs.TrackProgress {
+ wrapper = migration.ProgressTracker(op, "fs_progress", vol.name)
+ }
+
+ err = rsync.Recv(path, conn, wrapper, volTargetArgs.MigrationType.Features)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
}, op)
if err != nil {
return err
From c9f000ad7828f419b7b95fc45e0318be60311795 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 4 Dec 2019 08:57:06 +0000
Subject: [PATCH 3/4] lxd/migration/migration/volumes: Adds Live property to
VolumeTargetArgs
Allows source node to indicate to target node that a 2-phase volume sync is needed.
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/migration/migration_volumes.go | 1 +
1 file changed, 1 insertion(+)
diff --git a/lxd/migration/migration_volumes.go b/lxd/migration/migration_volumes.go
index 18b329d1a9..391a0e8353 100644
--- a/lxd/migration/migration_volumes.go
+++ b/lxd/migration/migration_volumes.go
@@ -34,6 +34,7 @@ type VolumeTargetArgs struct {
MigrationType Type
TrackProgress bool
Refresh bool
+ Live bool
}
// TypesToHeader converts one or more Types to a MigrationHeader. It uses the first type argument
From c3661764266e2fb0aa12a9c7c71aaa19c436f3b3 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 4 Dec 2019 09:00:48 +0000
Subject: [PATCH 4/4] lxd/migrate/container: Add support for 2-phase sync in
migrationSink.Do()
This fixes a bug where the criu property was not being populated in the migration response header.
This field is leveraged in the source to indicate whether the instance is running and whether a 2-phase sync is needed so its important this is sent back even if criu not being used.
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/migrate_container.go | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/lxd/migrate_container.go b/lxd/migrate_container.go
index 9c8f5787bf..b33dcd37f0 100644
--- a/lxd/migrate_container.go
+++ b/lxd/migrate_container.go
@@ -893,6 +893,7 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
MigrationType: respType,
Refresh: args.Refresh, // Indicate to receiver volume should exist.
TrackProgress: false, // Do not use a progress tracker on receiver.
+ Live: args.Live, // Indicates we will get a final rootfs sync.
}
// At this point we have already figured out the parent container's root
@@ -950,7 +951,6 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
respHeader = migration.MigrationHeader{
Fs: &myType,
- Criu: criuType,
Snapshots: offerHeader.Snapshots,
SnapshotNames: offerHeader.SnapshotNames,
Refresh: &c.refresh,
@@ -985,6 +985,9 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
return fmt.Errorf("Instance type not supported")
}
+ // Add CRIU info to response.
+ respHeader.Criu = criuType
+
if c.refresh {
// Get our existing snapshots.
targetSnapshots, err := c.src.instance.Snapshots()
@@ -1078,7 +1081,12 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
fsConn = c.src.fsConn
}
+ // Default to not expecting to receive the final rootfs sync.
sendFinalFsDelta := false
+
+ // If we are doing a stateful live transfer or the CRIU type indicates we
+ // are doing a stateless transfer with a running instance then we should
+ // expect the source to send us a final rootfs sync.
if live {
sendFinalFsDelta = true
}
More information about the lxc-devel
mailing list