[lxc-devel] [lxd/master] Instance: Copy snapshot expiry date

tomponline on Github lxc-bot at linuxcontainers.org
Mon Jan 4 17:35:19 UTC 2021


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 405 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20210104/d5a64938/attachment-0001.bin>
-------------- next part --------------
From e2c1d7e4ecda563f21b3c8136b3dec4afbe0a246 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 16:11:17 +0000
Subject: [PATCH 1/9] lxd/instance: Copy snapshot expiry in
 instanceCreateAsCopy

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lxd/instance.go b/lxd/instance.go
index 7d14be5be8..2f85dbfd13 100644
--- a/lxd/instance.go
+++ b/lxd/instance.go
@@ -282,6 +282,7 @@ func instanceCreateAsCopy(s *state.State, args db.InstanceArgs, sourceInst insta
 				Name:         newSnapName,
 				Profiles:     srcSnap.Profiles(),
 				Project:      args.Project,
+				ExpiryDate:   srcSnap.ExpiryDate(),
 			}
 
 			// Create the snapshots.

From f1a6d46424699f8fb153bf3ab438cb823d0a658f Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 16:32:05 +0000
Subject: [PATCH 2/9] lxd/migration: Rebuilds protobuf using protoc v3.14 and
 latest google.golang.org/protobuf/cmd/protoc-gen-go

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/migration/migrate.pb.go | 1770 ++++++++++++++++++++++-------------
 1 file changed, 1103 insertions(+), 667 deletions(-)

diff --git a/lxd/migration/migrate.pb.go b/lxd/migration/migrate.pb.go
index 0e824a7be0..6aba7e59e2 100644
--- a/lxd/migration/migrate.pb.go
+++ b/lxd/migration/migrate.pb.go
@@ -1,24 +1,26 @@
+// silence the protobuf compiler warning by setting the default
+
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0-devel
+// 	protoc        v3.14.0
 // source: lxd/migration/migrate.proto
 
 package migration
 
 import (
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
 type MigrationFSType int32
 
@@ -30,21 +32,23 @@ const (
 	MigrationFSType_BLOCK_AND_RSYNC MigrationFSType = 4
 )
 
-var MigrationFSType_name = map[int32]string{
-	0: "RSYNC",
-	1: "BTRFS",
-	2: "ZFS",
-	3: "RBD",
-	4: "BLOCK_AND_RSYNC",
-}
-
-var MigrationFSType_value = map[string]int32{
-	"RSYNC":           0,
-	"BTRFS":           1,
-	"ZFS":             2,
-	"RBD":             3,
-	"BLOCK_AND_RSYNC": 4,
-}
+// Enum value maps for MigrationFSType.
+var (
+	MigrationFSType_name = map[int32]string{
+		0: "RSYNC",
+		1: "BTRFS",
+		2: "ZFS",
+		3: "RBD",
+		4: "BLOCK_AND_RSYNC",
+	}
+	MigrationFSType_value = map[string]int32{
+		"RSYNC":           0,
+		"BTRFS":           1,
+		"ZFS":             2,
+		"RBD":             3,
+		"BLOCK_AND_RSYNC": 4,
+	}
+)
 
 func (x MigrationFSType) Enum() *MigrationFSType {
 	p := new(MigrationFSType)
@@ -53,20 +57,34 @@ func (x MigrationFSType) Enum() *MigrationFSType {
 }
 
 func (x MigrationFSType) String() string {
-	return proto.EnumName(MigrationFSType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (MigrationFSType) Descriptor() protoreflect.EnumDescriptor {
+	return file_lxd_migration_migrate_proto_enumTypes[0].Descriptor()
+}
+
+func (MigrationFSType) Type() protoreflect.EnumType {
+	return &file_lxd_migration_migrate_proto_enumTypes[0]
 }
 
-func (x *MigrationFSType) UnmarshalJSON(data []byte) error {
-	value, err := proto.UnmarshalJSONEnum(MigrationFSType_value, data, "MigrationFSType")
+func (x MigrationFSType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *MigrationFSType) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
 	if err != nil {
 		return err
 	}
-	*x = MigrationFSType(value)
+	*x = MigrationFSType(num)
 	return nil
 }
 
+// Deprecated: Use MigrationFSType.Descriptor instead.
 func (MigrationFSType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{0}
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{0}
 }
 
 type CRIUType int32
@@ -77,17 +95,19 @@ const (
 	CRIUType_NONE       CRIUType = 2
 )
 
-var CRIUType_name = map[int32]string{
-	0: "CRIU_RSYNC",
-	1: "PHAUL",
-	2: "NONE",
-}
-
-var CRIUType_value = map[string]int32{
-	"CRIU_RSYNC": 0,
-	"PHAUL":      1,
-	"NONE":       2,
-}
+// Enum value maps for CRIUType.
+var (
+	CRIUType_name = map[int32]string{
+		0: "CRIU_RSYNC",
+		1: "PHAUL",
+		2: "NONE",
+	}
+	CRIUType_value = map[string]int32{
+		"CRIU_RSYNC": 0,
+		"PHAUL":      1,
+		"NONE":       2,
+	}
+)
 
 func (x CRIUType) Enum() *CRIUType {
 	p := new(CRIUType)
@@ -96,974 +116,1390 @@ func (x CRIUType) Enum() *CRIUType {
 }
 
 func (x CRIUType) String() string {
-	return proto.EnumName(CRIUType_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
-func (x *CRIUType) UnmarshalJSON(data []byte) error {
-	value, err := proto.UnmarshalJSONEnum(CRIUType_value, data, "CRIUType")
+func (CRIUType) Descriptor() protoreflect.EnumDescriptor {
+	return file_lxd_migration_migrate_proto_enumTypes[1].Descriptor()
+}
+
+func (CRIUType) Type() protoreflect.EnumType {
+	return &file_lxd_migration_migrate_proto_enumTypes[1]
+}
+
+func (x CRIUType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *CRIUType) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
 	if err != nil {
 		return err
 	}
-	*x = CRIUType(value)
+	*x = CRIUType(num)
 	return nil
 }
 
+// Deprecated: Use CRIUType.Descriptor instead.
 func (CRIUType) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{1}
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{1}
 }
 
 type IDMapType struct {
-	Isuid                *bool    `protobuf:"varint,1,req,name=isuid" json:"isuid,omitempty"`
-	Isgid                *bool    `protobuf:"varint,2,req,name=isgid" json:"isgid,omitempty"`
-	Hostid               *int32   `protobuf:"varint,3,req,name=hostid" json:"hostid,omitempty"`
-	Nsid                 *int32   `protobuf:"varint,4,req,name=nsid" json:"nsid,omitempty"`
-	Maprange             *int32   `protobuf:"varint,5,req,name=maprange" json:"maprange,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *IDMapType) Reset()         { *m = IDMapType{} }
-func (m *IDMapType) String() string { return proto.CompactTextString(m) }
-func (*IDMapType) ProtoMessage()    {}
-func (*IDMapType) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{0}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Isuid    *bool  `protobuf:"varint,1,req,name=isuid" json:"isuid,omitempty"`
+	Isgid    *bool  `protobuf:"varint,2,req,name=isgid" json:"isgid,omitempty"`
+	Hostid   *int32 `protobuf:"varint,3,req,name=hostid" json:"hostid,omitempty"`
+	Nsid     *int32 `protobuf:"varint,4,req,name=nsid" json:"nsid,omitempty"`
+	Maprange *int32 `protobuf:"varint,5,req,name=maprange" json:"maprange,omitempty"`
+}
+
+func (x *IDMapType) Reset() {
+	*x = IDMapType{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *IDMapType) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_IDMapType.Unmarshal(m, b)
-}
-func (m *IDMapType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_IDMapType.Marshal(b, m, deterministic)
-}
-func (m *IDMapType) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_IDMapType.Merge(m, src)
-}
-func (m *IDMapType) XXX_Size() int {
-	return xxx_messageInfo_IDMapType.Size(m)
+func (x *IDMapType) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *IDMapType) XXX_DiscardUnknown() {
-	xxx_messageInfo_IDMapType.DiscardUnknown(m)
+
+func (*IDMapType) ProtoMessage() {}
+
+func (x *IDMapType) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_IDMapType proto.InternalMessageInfo
+// Deprecated: Use IDMapType.ProtoReflect.Descriptor instead.
+func (*IDMapType) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *IDMapType) GetIsuid() bool {
-	if m != nil && m.Isuid != nil {
-		return *m.Isuid
+func (x *IDMapType) GetIsuid() bool {
+	if x != nil && x.Isuid != nil {
+		return *x.Isuid
 	}
 	return false
 }
 
-func (m *IDMapType) GetIsgid() bool {
-	if m != nil && m.Isgid != nil {
-		return *m.Isgid
+func (x *IDMapType) GetIsgid() bool {
+	if x != nil && x.Isgid != nil {
+		return *x.Isgid
 	}
 	return false
 }
 
-func (m *IDMapType) GetHostid() int32 {
-	if m != nil && m.Hostid != nil {
-		return *m.Hostid
+func (x *IDMapType) GetHostid() int32 {
+	if x != nil && x.Hostid != nil {
+		return *x.Hostid
 	}
 	return 0
 }
 
-func (m *IDMapType) GetNsid() int32 {
-	if m != nil && m.Nsid != nil {
-		return *m.Nsid
+func (x *IDMapType) GetNsid() int32 {
+	if x != nil && x.Nsid != nil {
+		return *x.Nsid
 	}
 	return 0
 }
 
-func (m *IDMapType) GetMaprange() int32 {
-	if m != nil && m.Maprange != nil {
-		return *m.Maprange
+func (x *IDMapType) GetMaprange() int32 {
+	if x != nil && x.Maprange != nil {
+		return *x.Maprange
 	}
 	return 0
 }
 
 type Config struct {
-	Key                  *string  `protobuf:"bytes,1,req,name=key" json:"key,omitempty"`
-	Value                *string  `protobuf:"bytes,2,req,name=value" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Config) Reset()         { *m = Config{} }
-func (m *Config) String() string { return proto.CompactTextString(m) }
-func (*Config) ProtoMessage()    {}
-func (*Config) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{1}
+	Key   *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"`
+	Value *string `protobuf:"bytes,2,req,name=value" json:"value,omitempty"`
 }
 
-func (m *Config) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Config.Unmarshal(m, b)
-}
-func (m *Config) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Config.Marshal(b, m, deterministic)
-}
-func (m *Config) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Config.Merge(m, src)
+func (x *Config) Reset() {
+	*x = Config{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Config) XXX_Size() int {
-	return xxx_messageInfo_Config.Size(m)
+
+func (x *Config) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Config) XXX_DiscardUnknown() {
-	xxx_messageInfo_Config.DiscardUnknown(m)
+
+func (*Config) ProtoMessage() {}
+
+func (x *Config) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Config proto.InternalMessageInfo
+// Deprecated: Use Config.ProtoReflect.Descriptor instead.
+func (*Config) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *Config) GetKey() string {
-	if m != nil && m.Key != nil {
-		return *m.Key
+func (x *Config) GetKey() string {
+	if x != nil && x.Key != nil {
+		return *x.Key
 	}
 	return ""
 }
 
-func (m *Config) GetValue() string {
-	if m != nil && m.Value != nil {
-		return *m.Value
+func (x *Config) GetValue() string {
+	if x != nil && x.Value != nil {
+		return *x.Value
 	}
 	return ""
 }
 
 type Device struct {
-	Name                 *string   `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
-	Config               []*Config `protobuf:"bytes,2,rep,name=config" json:"config,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Device) Reset()         { *m = Device{} }
-func (m *Device) String() string { return proto.CompactTextString(m) }
-func (*Device) ProtoMessage()    {}
-func (*Device) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{2}
+	Name   *string   `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
+	Config []*Config `protobuf:"bytes,2,rep,name=config" json:"config,omitempty"`
 }
 
-func (m *Device) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Device.Unmarshal(m, b)
-}
-func (m *Device) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Device.Marshal(b, m, deterministic)
-}
-func (m *Device) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Device.Merge(m, src)
+func (x *Device) Reset() {
+	*x = Device{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Device) XXX_Size() int {
-	return xxx_messageInfo_Device.Size(m)
+
+func (x *Device) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Device) XXX_DiscardUnknown() {
-	xxx_messageInfo_Device.DiscardUnknown(m)
+
+func (*Device) ProtoMessage() {}
+
+func (x *Device) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Device proto.InternalMessageInfo
+// Deprecated: Use Device.ProtoReflect.Descriptor instead.
+func (*Device) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *Device) GetName() string {
-	if m != nil && m.Name != nil {
-		return *m.Name
+func (x *Device) GetName() string {
+	if x != nil && x.Name != nil {
+		return *x.Name
 	}
 	return ""
 }
 
-func (m *Device) GetConfig() []*Config {
-	if m != nil {
-		return m.Config
+func (x *Device) GetConfig() []*Config {
+	if x != nil {
+		return x.Config
 	}
 	return nil
 }
 
 type Snapshot struct {
-	Name                 *string   `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
-	LocalConfig          []*Config `protobuf:"bytes,2,rep,name=localConfig" json:"localConfig,omitempty"`
-	Profiles             []string  `protobuf:"bytes,3,rep,name=profiles" json:"profiles,omitempty"`
-	Ephemeral            *bool     `protobuf:"varint,4,req,name=ephemeral" json:"ephemeral,omitempty"`
-	LocalDevices         []*Device `protobuf:"bytes,5,rep,name=localDevices" json:"localDevices,omitempty"`
-	Architecture         *int32    `protobuf:"varint,6,req,name=architecture" json:"architecture,omitempty"`
-	Stateful             *bool     `protobuf:"varint,7,req,name=stateful" json:"stateful,omitempty"`
-	CreationDate         *int64    `protobuf:"varint,8,opt,name=creation_date,json=creationDate" json:"creation_date,omitempty"`
-	LastUsedDate         *int64    `protobuf:"varint,9,opt,name=last_used_date,json=lastUsedDate" json:"last_used_date,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
-	XXX_unrecognized     []byte    `json:"-"`
-	XXX_sizecache        int32     `json:"-"`
-}
-
-func (m *Snapshot) Reset()         { *m = Snapshot{} }
-func (m *Snapshot) String() string { return proto.CompactTextString(m) }
-func (*Snapshot) ProtoMessage()    {}
-func (*Snapshot) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{3}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name         *string   `protobuf:"bytes,1,req,name=name" json:"name,omitempty"`
+	LocalConfig  []*Config `protobuf:"bytes,2,rep,name=localConfig" json:"localConfig,omitempty"`
+	Profiles     []string  `protobuf:"bytes,3,rep,name=profiles" json:"profiles,omitempty"`
+	Ephemeral    *bool     `protobuf:"varint,4,req,name=ephemeral" json:"ephemeral,omitempty"`
+	LocalDevices []*Device `protobuf:"bytes,5,rep,name=localDevices" json:"localDevices,omitempty"`
+	Architecture *int32    `protobuf:"varint,6,req,name=architecture" json:"architecture,omitempty"`
+	Stateful     *bool     `protobuf:"varint,7,req,name=stateful" json:"stateful,omitempty"`
+	CreationDate *int64    `protobuf:"varint,8,opt,name=creation_date,json=creationDate" json:"creation_date,omitempty"`
+	LastUsedDate *int64    `protobuf:"varint,9,opt,name=last_used_date,json=lastUsedDate" json:"last_used_date,omitempty"`
+}
+
+func (x *Snapshot) Reset() {
+	*x = Snapshot{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Snapshot) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Snapshot.Unmarshal(m, b)
-}
-func (m *Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Snapshot.Marshal(b, m, deterministic)
-}
-func (m *Snapshot) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Snapshot.Merge(m, src)
+func (x *Snapshot) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Snapshot) XXX_Size() int {
-	return xxx_messageInfo_Snapshot.Size(m)
-}
-func (m *Snapshot) XXX_DiscardUnknown() {
-	xxx_messageInfo_Snapshot.DiscardUnknown(m)
+
+func (*Snapshot) ProtoMessage() {}
+
+func (x *Snapshot) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Snapshot proto.InternalMessageInfo
+// Deprecated: Use Snapshot.ProtoReflect.Descriptor instead.
+func (*Snapshot) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *Snapshot) GetName() string {
-	if m != nil && m.Name != nil {
-		return *m.Name
+func (x *Snapshot) GetName() string {
+	if x != nil && x.Name != nil {
+		return *x.Name
 	}
 	return ""
 }
 
-func (m *Snapshot) GetLocalConfig() []*Config {
-	if m != nil {
-		return m.LocalConfig
+func (x *Snapshot) GetLocalConfig() []*Config {
+	if x != nil {
+		return x.LocalConfig
 	}
 	return nil
 }
 
-func (m *Snapshot) GetProfiles() []string {
-	if m != nil {
-		return m.Profiles
+func (x *Snapshot) GetProfiles() []string {
+	if x != nil {
+		return x.Profiles
 	}
 	return nil
 }
 
-func (m *Snapshot) GetEphemeral() bool {
-	if m != nil && m.Ephemeral != nil {
-		return *m.Ephemeral
+func (x *Snapshot) GetEphemeral() bool {
+	if x != nil && x.Ephemeral != nil {
+		return *x.Ephemeral
 	}
 	return false
 }
 
-func (m *Snapshot) GetLocalDevices() []*Device {
-	if m != nil {
-		return m.LocalDevices
+func (x *Snapshot) GetLocalDevices() []*Device {
+	if x != nil {
+		return x.LocalDevices
 	}
 	return nil
 }
 
-func (m *Snapshot) GetArchitecture() int32 {
-	if m != nil && m.Architecture != nil {
-		return *m.Architecture
+func (x *Snapshot) GetArchitecture() int32 {
+	if x != nil && x.Architecture != nil {
+		return *x.Architecture
 	}
 	return 0
 }
 
-func (m *Snapshot) GetStateful() bool {
-	if m != nil && m.Stateful != nil {
-		return *m.Stateful
+func (x *Snapshot) GetStateful() bool {
+	if x != nil && x.Stateful != nil {
+		return *x.Stateful
 	}
 	return false
 }
 
-func (m *Snapshot) GetCreationDate() int64 {
-	if m != nil && m.CreationDate != nil {
-		return *m.CreationDate
+func (x *Snapshot) GetCreationDate() int64 {
+	if x != nil && x.CreationDate != nil {
+		return *x.CreationDate
 	}
 	return 0
 }
 
-func (m *Snapshot) GetLastUsedDate() int64 {
-	if m != nil && m.LastUsedDate != nil {
-		return *m.LastUsedDate
+func (x *Snapshot) GetLastUsedDate() int64 {
+	if x != nil && x.LastUsedDate != nil {
+		return *x.LastUsedDate
 	}
 	return 0
 }
 
 type RsyncFeatures struct {
-	Xattrs               *bool    `protobuf:"varint,1,opt,name=xattrs" json:"xattrs,omitempty"`
-	Delete               *bool    `protobuf:"varint,2,opt,name=delete" json:"delete,omitempty"`
-	Compress             *bool    `protobuf:"varint,3,opt,name=compress" json:"compress,omitempty"`
-	Bidirectional        *bool    `protobuf:"varint,4,opt,name=bidirectional" json:"bidirectional,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *RsyncFeatures) Reset()         { *m = RsyncFeatures{} }
-func (m *RsyncFeatures) String() string { return proto.CompactTextString(m) }
-func (*RsyncFeatures) ProtoMessage()    {}
-func (*RsyncFeatures) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{4}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Xattrs        *bool `protobuf:"varint,1,opt,name=xattrs" json:"xattrs,omitempty"`
+	Delete        *bool `protobuf:"varint,2,opt,name=delete" json:"delete,omitempty"`
+	Compress      *bool `protobuf:"varint,3,opt,name=compress" json:"compress,omitempty"`
+	Bidirectional *bool `protobuf:"varint,4,opt,name=bidirectional" json:"bidirectional,omitempty"`
+}
+
+func (x *RsyncFeatures) Reset() {
+	*x = RsyncFeatures{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *RsyncFeatures) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RsyncFeatures.Unmarshal(m, b)
-}
-func (m *RsyncFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RsyncFeatures.Marshal(b, m, deterministic)
-}
-func (m *RsyncFeatures) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RsyncFeatures.Merge(m, src)
-}
-func (m *RsyncFeatures) XXX_Size() int {
-	return xxx_messageInfo_RsyncFeatures.Size(m)
+func (x *RsyncFeatures) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *RsyncFeatures) XXX_DiscardUnknown() {
-	xxx_messageInfo_RsyncFeatures.DiscardUnknown(m)
+
+func (*RsyncFeatures) ProtoMessage() {}
+
+func (x *RsyncFeatures) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_RsyncFeatures proto.InternalMessageInfo
+// Deprecated: Use RsyncFeatures.ProtoReflect.Descriptor instead.
+func (*RsyncFeatures) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{4}
+}
 
-func (m *RsyncFeatures) GetXattrs() bool {
-	if m != nil && m.Xattrs != nil {
-		return *m.Xattrs
+func (x *RsyncFeatures) GetXattrs() bool {
+	if x != nil && x.Xattrs != nil {
+		return *x.Xattrs
 	}
 	return false
 }
 
-func (m *RsyncFeatures) GetDelete() bool {
-	if m != nil && m.Delete != nil {
-		return *m.Delete
+func (x *RsyncFeatures) GetDelete() bool {
+	if x != nil && x.Delete != nil {
+		return *x.Delete
 	}
 	return false
 }
 
-func (m *RsyncFeatures) GetCompress() bool {
-	if m != nil && m.Compress != nil {
-		return *m.Compress
+func (x *RsyncFeatures) GetCompress() bool {
+	if x != nil && x.Compress != nil {
+		return *x.Compress
 	}
 	return false
 }
 
-func (m *RsyncFeatures) GetBidirectional() bool {
-	if m != nil && m.Bidirectional != nil {
-		return *m.Bidirectional
+func (x *RsyncFeatures) GetBidirectional() bool {
+	if x != nil && x.Bidirectional != nil {
+		return *x.Bidirectional
 	}
 	return false
 }
 
 type ZfsFeatures struct {
-	Compress             *bool    `protobuf:"varint,1,opt,name=compress" json:"compress,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *ZfsFeatures) Reset()         { *m = ZfsFeatures{} }
-func (m *ZfsFeatures) String() string { return proto.CompactTextString(m) }
-func (*ZfsFeatures) ProtoMessage()    {}
-func (*ZfsFeatures) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{5}
+	Compress *bool `protobuf:"varint,1,opt,name=compress" json:"compress,omitempty"`
 }
 
-func (m *ZfsFeatures) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_ZfsFeatures.Unmarshal(m, b)
-}
-func (m *ZfsFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_ZfsFeatures.Marshal(b, m, deterministic)
-}
-func (m *ZfsFeatures) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ZfsFeatures.Merge(m, src)
+func (x *ZfsFeatures) Reset() {
+	*x = ZfsFeatures{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *ZfsFeatures) XXX_Size() int {
-	return xxx_messageInfo_ZfsFeatures.Size(m)
+
+func (x *ZfsFeatures) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *ZfsFeatures) XXX_DiscardUnknown() {
-	xxx_messageInfo_ZfsFeatures.DiscardUnknown(m)
+
+func (*ZfsFeatures) ProtoMessage() {}
+
+func (x *ZfsFeatures) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_ZfsFeatures proto.InternalMessageInfo
+// Deprecated: Use ZfsFeatures.ProtoReflect.Descriptor instead.
+func (*ZfsFeatures) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{5}
+}
 
-func (m *ZfsFeatures) GetCompress() bool {
-	if m != nil && m.Compress != nil {
-		return *m.Compress
+func (x *ZfsFeatures) GetCompress() bool {
+	if x != nil && x.Compress != nil {
+		return *x.Compress
 	}
 	return false
 }
 
 type BtrfsFeatures struct {
-	MigrationHeader      *bool    `protobuf:"varint,1,opt,name=migration_header,json=migrationHeader" json:"migration_header,omitempty"`
-	HeaderSubvolumes     *bool    `protobuf:"varint,2,opt,name=header_subvolumes,json=headerSubvolumes" json:"header_subvolumes,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *BtrfsFeatures) Reset()         { *m = BtrfsFeatures{} }
-func (m *BtrfsFeatures) String() string { return proto.CompactTextString(m) }
-func (*BtrfsFeatures) ProtoMessage()    {}
-func (*BtrfsFeatures) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{6}
+	MigrationHeader  *bool `protobuf:"varint,1,opt,name=migration_header,json=migrationHeader" json:"migration_header,omitempty"`
+	HeaderSubvolumes *bool `protobuf:"varint,2,opt,name=header_subvolumes,json=headerSubvolumes" json:"header_subvolumes,omitempty"`
 }
 
-func (m *BtrfsFeatures) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_BtrfsFeatures.Unmarshal(m, b)
-}
-func (m *BtrfsFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_BtrfsFeatures.Marshal(b, m, deterministic)
-}
-func (m *BtrfsFeatures) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BtrfsFeatures.Merge(m, src)
+func (x *BtrfsFeatures) Reset() {
+	*x = BtrfsFeatures{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *BtrfsFeatures) XXX_Size() int {
-	return xxx_messageInfo_BtrfsFeatures.Size(m)
+
+func (x *BtrfsFeatures) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *BtrfsFeatures) XXX_DiscardUnknown() {
-	xxx_messageInfo_BtrfsFeatures.DiscardUnknown(m)
+
+func (*BtrfsFeatures) ProtoMessage() {}
+
+func (x *BtrfsFeatures) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_BtrfsFeatures proto.InternalMessageInfo
+// Deprecated: Use BtrfsFeatures.ProtoReflect.Descriptor instead.
+func (*BtrfsFeatures) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{6}
+}
 
-func (m *BtrfsFeatures) GetMigrationHeader() bool {
-	if m != nil && m.MigrationHeader != nil {
-		return *m.MigrationHeader
+func (x *BtrfsFeatures) GetMigrationHeader() bool {
+	if x != nil && x.MigrationHeader != nil {
+		return *x.MigrationHeader
 	}
 	return false
 }
 
-func (m *BtrfsFeatures) GetHeaderSubvolumes() bool {
-	if m != nil && m.HeaderSubvolumes != nil {
-		return *m.HeaderSubvolumes
+func (x *BtrfsFeatures) GetHeaderSubvolumes() bool {
+	if x != nil && x.HeaderSubvolumes != nil {
+		return *x.HeaderSubvolumes
 	}
 	return false
 }
 
 type MigrationHeader struct {
-	Fs                   *MigrationFSType `protobuf:"varint,1,req,name=fs,enum=migration.MigrationFSType" json:"fs,omitempty"`
-	Criu                 *CRIUType        `protobuf:"varint,2,opt,name=criu,enum=migration.CRIUType" json:"criu,omitempty"`
-	Idmap                []*IDMapType     `protobuf:"bytes,3,rep,name=idmap" json:"idmap,omitempty"`
-	SnapshotNames        []string         `protobuf:"bytes,4,rep,name=snapshotNames" json:"snapshotNames,omitempty"`
-	Snapshots            []*Snapshot      `protobuf:"bytes,5,rep,name=snapshots" json:"snapshots,omitempty"`
-	Predump              *bool            `protobuf:"varint,7,opt,name=predump" json:"predump,omitempty"`
-	RsyncFeatures        *RsyncFeatures   `protobuf:"bytes,8,opt,name=rsyncFeatures" json:"rsyncFeatures,omitempty"`
-	Refresh              *bool            `protobuf:"varint,9,opt,name=refresh" json:"refresh,omitempty"`
-	ZfsFeatures          *ZfsFeatures     `protobuf:"bytes,10,opt,name=zfsFeatures" json:"zfsFeatures,omitempty"`
-	VolumeSize           *int64           `protobuf:"varint,11,opt,name=volumeSize" json:"volumeSize,omitempty"`
-	BtrfsFeatures        *BtrfsFeatures   `protobuf:"bytes,12,opt,name=btrfsFeatures" json:"btrfsFeatures,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
-	XXX_unrecognized     []byte           `json:"-"`
-	XXX_sizecache        int32            `json:"-"`
-}
-
-func (m *MigrationHeader) Reset()         { *m = MigrationHeader{} }
-func (m *MigrationHeader) String() string { return proto.CompactTextString(m) }
-func (*MigrationHeader) ProtoMessage()    {}
-func (*MigrationHeader) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{7}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Fs            *MigrationFSType `protobuf:"varint,1,req,name=fs,enum=migration.MigrationFSType" json:"fs,omitempty"`
+	Criu          *CRIUType        `protobuf:"varint,2,opt,name=criu,enum=migration.CRIUType" json:"criu,omitempty"`
+	Idmap         []*IDMapType     `protobuf:"bytes,3,rep,name=idmap" json:"idmap,omitempty"`
+	SnapshotNames []string         `protobuf:"bytes,4,rep,name=snapshotNames" json:"snapshotNames,omitempty"`
+	Snapshots     []*Snapshot      `protobuf:"bytes,5,rep,name=snapshots" json:"snapshots,omitempty"`
+	Predump       *bool            `protobuf:"varint,7,opt,name=predump" json:"predump,omitempty"`
+	RsyncFeatures *RsyncFeatures   `protobuf:"bytes,8,opt,name=rsyncFeatures" json:"rsyncFeatures,omitempty"`
+	Refresh       *bool            `protobuf:"varint,9,opt,name=refresh" json:"refresh,omitempty"`
+	ZfsFeatures   *ZfsFeatures     `protobuf:"bytes,10,opt,name=zfsFeatures" json:"zfsFeatures,omitempty"`
+	VolumeSize    *int64           `protobuf:"varint,11,opt,name=volumeSize" json:"volumeSize,omitempty"`
+	BtrfsFeatures *BtrfsFeatures   `protobuf:"bytes,12,opt,name=btrfsFeatures" json:"btrfsFeatures,omitempty"`
+}
+
+func (x *MigrationHeader) Reset() {
+	*x = MigrationHeader{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *MigrationHeader) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MigrationHeader.Unmarshal(m, b)
-}
-func (m *MigrationHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MigrationHeader.Marshal(b, m, deterministic)
-}
-func (m *MigrationHeader) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MigrationHeader.Merge(m, src)
+func (x *MigrationHeader) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *MigrationHeader) XXX_Size() int {
-	return xxx_messageInfo_MigrationHeader.Size(m)
-}
-func (m *MigrationHeader) XXX_DiscardUnknown() {
-	xxx_messageInfo_MigrationHeader.DiscardUnknown(m)
+
+func (*MigrationHeader) ProtoMessage() {}
+
+func (x *MigrationHeader) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_MigrationHeader proto.InternalMessageInfo
+// Deprecated: Use MigrationHeader.ProtoReflect.Descriptor instead.
+func (*MigrationHeader) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{7}
+}
 
-func (m *MigrationHeader) GetFs() MigrationFSType {
-	if m != nil && m.Fs != nil {
-		return *m.Fs
+func (x *MigrationHeader) GetFs() MigrationFSType {
+	if x != nil && x.Fs != nil {
+		return *x.Fs
 	}
 	return MigrationFSType_RSYNC
 }
 
-func (m *MigrationHeader) GetCriu() CRIUType {
-	if m != nil && m.Criu != nil {
-		return *m.Criu
+func (x *MigrationHeader) GetCriu() CRIUType {
+	if x != nil && x.Criu != nil {
+		return *x.Criu
 	}
 	return CRIUType_CRIU_RSYNC
 }
 
-func (m *MigrationHeader) GetIdmap() []*IDMapType {
-	if m != nil {
-		return m.Idmap
+func (x *MigrationHeader) GetIdmap() []*IDMapType {
+	if x != nil {
+		return x.Idmap
 	}
 	return nil
 }
 
-func (m *MigrationHeader) GetSnapshotNames() []string {
-	if m != nil {
-		return m.SnapshotNames
+func (x *MigrationHeader) GetSnapshotNames() []string {
+	if x != nil {
+		return x.SnapshotNames
 	}
 	return nil
 }
 
-func (m *MigrationHeader) GetSnapshots() []*Snapshot {
-	if m != nil {
-		return m.Snapshots
+func (x *MigrationHeader) GetSnapshots() []*Snapshot {
+	if x != nil {
+		return x.Snapshots
 	}
 	return nil
 }
 
-func (m *MigrationHeader) GetPredump() bool {
-	if m != nil && m.Predump != nil {
-		return *m.Predump
+func (x *MigrationHeader) GetPredump() bool {
+	if x != nil && x.Predump != nil {
+		return *x.Predump
 	}
 	return false
 }
 
-func (m *MigrationHeader) GetRsyncFeatures() *RsyncFeatures {
-	if m != nil {
-		return m.RsyncFeatures
+func (x *MigrationHeader) GetRsyncFeatures() *RsyncFeatures {
+	if x != nil {
+		return x.RsyncFeatures
 	}
 	return nil
 }
 
-func (m *MigrationHeader) GetRefresh() bool {
-	if m != nil && m.Refresh != nil {
-		return *m.Refresh
+func (x *MigrationHeader) GetRefresh() bool {
+	if x != nil && x.Refresh != nil {
+		return *x.Refresh
 	}
 	return false
 }
 
-func (m *MigrationHeader) GetZfsFeatures() *ZfsFeatures {
-	if m != nil {
-		return m.ZfsFeatures
+func (x *MigrationHeader) GetZfsFeatures() *ZfsFeatures {
+	if x != nil {
+		return x.ZfsFeatures
 	}
 	return nil
 }
 
-func (m *MigrationHeader) GetVolumeSize() int64 {
-	if m != nil && m.VolumeSize != nil {
-		return *m.VolumeSize
+func (x *MigrationHeader) GetVolumeSize() int64 {
+	if x != nil && x.VolumeSize != nil {
+		return *x.VolumeSize
 	}
 	return 0
 }
 
-func (m *MigrationHeader) GetBtrfsFeatures() *BtrfsFeatures {
-	if m != nil {
-		return m.BtrfsFeatures
+func (x *MigrationHeader) GetBtrfsFeatures() *BtrfsFeatures {
+	if x != nil {
+		return x.BtrfsFeatures
 	}
 	return nil
 }
 
 type MigrationControl struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	Success *bool `protobuf:"varint,1,req,name=success" json:"success,omitempty"`
 	// optional failure message if sending a failure
-	Message              *string  `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
 }
 
-func (m *MigrationControl) Reset()         { *m = MigrationControl{} }
-func (m *MigrationControl) String() string { return proto.CompactTextString(m) }
-func (*MigrationControl) ProtoMessage()    {}
-func (*MigrationControl) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{8}
+func (x *MigrationControl) Reset() {
+	*x = MigrationControl{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *MigrationControl) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MigrationControl.Unmarshal(m, b)
-}
-func (m *MigrationControl) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MigrationControl.Marshal(b, m, deterministic)
-}
-func (m *MigrationControl) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MigrationControl.Merge(m, src)
+func (x *MigrationControl) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *MigrationControl) XXX_Size() int {
-	return xxx_messageInfo_MigrationControl.Size(m)
-}
-func (m *MigrationControl) XXX_DiscardUnknown() {
-	xxx_messageInfo_MigrationControl.DiscardUnknown(m)
+
+func (*MigrationControl) ProtoMessage() {}
+
+func (x *MigrationControl) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_MigrationControl proto.InternalMessageInfo
+// Deprecated: Use MigrationControl.ProtoReflect.Descriptor instead.
+func (*MigrationControl) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{8}
+}
 
-func (m *MigrationControl) GetSuccess() bool {
-	if m != nil && m.Success != nil {
-		return *m.Success
+func (x *MigrationControl) GetSuccess() bool {
+	if x != nil && x.Success != nil {
+		return *x.Success
 	}
 	return false
 }
 
-func (m *MigrationControl) GetMessage() string {
-	if m != nil && m.Message != nil {
-		return *m.Message
+func (x *MigrationControl) GetMessage() string {
+	if x != nil && x.Message != nil {
+		return *x.Message
 	}
 	return ""
 }
 
 type MigrationSync struct {
-	FinalPreDump         *bool    `protobuf:"varint,1,req,name=finalPreDump" json:"finalPreDump,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *MigrationSync) Reset()         { *m = MigrationSync{} }
-func (m *MigrationSync) String() string { return proto.CompactTextString(m) }
-func (*MigrationSync) ProtoMessage()    {}
-func (*MigrationSync) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{9}
+	FinalPreDump *bool `protobuf:"varint,1,req,name=finalPreDump" json:"finalPreDump,omitempty"`
 }
 
-func (m *MigrationSync) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MigrationSync.Unmarshal(m, b)
-}
-func (m *MigrationSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MigrationSync.Marshal(b, m, deterministic)
-}
-func (m *MigrationSync) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MigrationSync.Merge(m, src)
+func (x *MigrationSync) Reset() {
+	*x = MigrationSync{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *MigrationSync) XXX_Size() int {
-	return xxx_messageInfo_MigrationSync.Size(m)
+
+func (x *MigrationSync) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *MigrationSync) XXX_DiscardUnknown() {
-	xxx_messageInfo_MigrationSync.DiscardUnknown(m)
+
+func (*MigrationSync) ProtoMessage() {}
+
+func (x *MigrationSync) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_MigrationSync proto.InternalMessageInfo
+// Deprecated: Use MigrationSync.ProtoReflect.Descriptor instead.
+func (*MigrationSync) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{9}
+}
 
-func (m *MigrationSync) GetFinalPreDump() bool {
-	if m != nil && m.FinalPreDump != nil {
-		return *m.FinalPreDump
+func (x *MigrationSync) GetFinalPreDump() bool {
+	if x != nil && x.FinalPreDump != nil {
+		return *x.FinalPreDump
 	}
 	return false
 }
 
 // This one contains statistics about dump/restore process
 type DumpStatsEntry struct {
-	FreezingTime         *uint32  `protobuf:"varint,1,req,name=freezing_time,json=freezingTime" json:"freezing_time,omitempty"`
-	FrozenTime           *uint32  `protobuf:"varint,2,req,name=frozen_time,json=frozenTime" json:"frozen_time,omitempty"`
-	MemdumpTime          *uint32  `protobuf:"varint,3,req,name=memdump_time,json=memdumpTime" json:"memdump_time,omitempty"`
-	MemwriteTime         *uint32  `protobuf:"varint,4,req,name=memwrite_time,json=memwriteTime" json:"memwrite_time,omitempty"`
-	PagesScanned         *uint64  `protobuf:"varint,5,req,name=pages_scanned,json=pagesScanned" json:"pages_scanned,omitempty"`
-	PagesSkippedParent   *uint64  `protobuf:"varint,6,req,name=pages_skipped_parent,json=pagesSkippedParent" json:"pages_skipped_parent,omitempty"`
-	PagesWritten         *uint64  `protobuf:"varint,7,req,name=pages_written,json=pagesWritten" json:"pages_written,omitempty"`
-	IrmapResolve         *uint32  `protobuf:"varint,8,opt,name=irmap_resolve,json=irmapResolve" json:"irmap_resolve,omitempty"`
-	PagesLazy            *uint64  `protobuf:"varint,9,req,name=pages_lazy,json=pagesLazy" json:"pages_lazy,omitempty"`
-	PagePipes            *uint64  `protobuf:"varint,10,opt,name=page_pipes,json=pagePipes" json:"page_pipes,omitempty"`
-	PagePipeBufs         *uint64  `protobuf:"varint,11,opt,name=page_pipe_bufs,json=pagePipeBufs" json:"page_pipe_bufs,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *DumpStatsEntry) Reset()         { *m = DumpStatsEntry{} }
-func (m *DumpStatsEntry) String() string { return proto.CompactTextString(m) }
-func (*DumpStatsEntry) ProtoMessage()    {}
-func (*DumpStatsEntry) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{10}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	FreezingTime       *uint32 `protobuf:"varint,1,req,name=freezing_time,json=freezingTime" json:"freezing_time,omitempty"`
+	FrozenTime         *uint32 `protobuf:"varint,2,req,name=frozen_time,json=frozenTime" json:"frozen_time,omitempty"`
+	MemdumpTime        *uint32 `protobuf:"varint,3,req,name=memdump_time,json=memdumpTime" json:"memdump_time,omitempty"`
+	MemwriteTime       *uint32 `protobuf:"varint,4,req,name=memwrite_time,json=memwriteTime" json:"memwrite_time,omitempty"`
+	PagesScanned       *uint64 `protobuf:"varint,5,req,name=pages_scanned,json=pagesScanned" json:"pages_scanned,omitempty"`
+	PagesSkippedParent *uint64 `protobuf:"varint,6,req,name=pages_skipped_parent,json=pagesSkippedParent" json:"pages_skipped_parent,omitempty"`
+	PagesWritten       *uint64 `protobuf:"varint,7,req,name=pages_written,json=pagesWritten" json:"pages_written,omitempty"`
+	IrmapResolve       *uint32 `protobuf:"varint,8,opt,name=irmap_resolve,json=irmapResolve" json:"irmap_resolve,omitempty"`
+	PagesLazy          *uint64 `protobuf:"varint,9,req,name=pages_lazy,json=pagesLazy" json:"pages_lazy,omitempty"`
+	PagePipes          *uint64 `protobuf:"varint,10,opt,name=page_pipes,json=pagePipes" json:"page_pipes,omitempty"`
+	PagePipeBufs       *uint64 `protobuf:"varint,11,opt,name=page_pipe_bufs,json=pagePipeBufs" json:"page_pipe_bufs,omitempty"`
+}
+
+func (x *DumpStatsEntry) Reset() {
+	*x = DumpStatsEntry{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *DumpStatsEntry) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DumpStatsEntry.Unmarshal(m, b)
-}
-func (m *DumpStatsEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DumpStatsEntry.Marshal(b, m, deterministic)
-}
-func (m *DumpStatsEntry) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DumpStatsEntry.Merge(m, src)
+func (x *DumpStatsEntry) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *DumpStatsEntry) XXX_Size() int {
-	return xxx_messageInfo_DumpStatsEntry.Size(m)
-}
-func (m *DumpStatsEntry) XXX_DiscardUnknown() {
-	xxx_messageInfo_DumpStatsEntry.DiscardUnknown(m)
+
+func (*DumpStatsEntry) ProtoMessage() {}
+
+func (x *DumpStatsEntry) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_DumpStatsEntry proto.InternalMessageInfo
+// Deprecated: Use DumpStatsEntry.ProtoReflect.Descriptor instead.
+func (*DumpStatsEntry) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{10}
+}
 
-func (m *DumpStatsEntry) GetFreezingTime() uint32 {
-	if m != nil && m.FreezingTime != nil {
-		return *m.FreezingTime
+func (x *DumpStatsEntry) GetFreezingTime() uint32 {
+	if x != nil && x.FreezingTime != nil {
+		return *x.FreezingTime
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetFrozenTime() uint32 {
-	if m != nil && m.FrozenTime != nil {
-		return *m.FrozenTime
+func (x *DumpStatsEntry) GetFrozenTime() uint32 {
+	if x != nil && x.FrozenTime != nil {
+		return *x.FrozenTime
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetMemdumpTime() uint32 {
-	if m != nil && m.MemdumpTime != nil {
-		return *m.MemdumpTime
+func (x *DumpStatsEntry) GetMemdumpTime() uint32 {
+	if x != nil && x.MemdumpTime != nil {
+		return *x.MemdumpTime
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetMemwriteTime() uint32 {
-	if m != nil && m.MemwriteTime != nil {
-		return *m.MemwriteTime
+func (x *DumpStatsEntry) GetMemwriteTime() uint32 {
+	if x != nil && x.MemwriteTime != nil {
+		return *x.MemwriteTime
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetPagesScanned() uint64 {
-	if m != nil && m.PagesScanned != nil {
-		return *m.PagesScanned
+func (x *DumpStatsEntry) GetPagesScanned() uint64 {
+	if x != nil && x.PagesScanned != nil {
+		return *x.PagesScanned
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetPagesSkippedParent() uint64 {
-	if m != nil && m.PagesSkippedParent != nil {
-		return *m.PagesSkippedParent
+func (x *DumpStatsEntry) GetPagesSkippedParent() uint64 {
+	if x != nil && x.PagesSkippedParent != nil {
+		return *x.PagesSkippedParent
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetPagesWritten() uint64 {
-	if m != nil && m.PagesWritten != nil {
-		return *m.PagesWritten
+func (x *DumpStatsEntry) GetPagesWritten() uint64 {
+	if x != nil && x.PagesWritten != nil {
+		return *x.PagesWritten
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetIrmapResolve() uint32 {
-	if m != nil && m.IrmapResolve != nil {
-		return *m.IrmapResolve
+func (x *DumpStatsEntry) GetIrmapResolve() uint32 {
+	if x != nil && x.IrmapResolve != nil {
+		return *x.IrmapResolve
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetPagesLazy() uint64 {
-	if m != nil && m.PagesLazy != nil {
-		return *m.PagesLazy
+func (x *DumpStatsEntry) GetPagesLazy() uint64 {
+	if x != nil && x.PagesLazy != nil {
+		return *x.PagesLazy
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetPagePipes() uint64 {
-	if m != nil && m.PagePipes != nil {
-		return *m.PagePipes
+func (x *DumpStatsEntry) GetPagePipes() uint64 {
+	if x != nil && x.PagePipes != nil {
+		return *x.PagePipes
 	}
 	return 0
 }
 
-func (m *DumpStatsEntry) GetPagePipeBufs() uint64 {
-	if m != nil && m.PagePipeBufs != nil {
-		return *m.PagePipeBufs
+func (x *DumpStatsEntry) GetPagePipeBufs() uint64 {
+	if x != nil && x.PagePipeBufs != nil {
+		return *x.PagePipeBufs
 	}
 	return 0
 }
 
 type RestoreStatsEntry struct {
-	PagesCompared        *uint64  `protobuf:"varint,1,req,name=pages_compared,json=pagesCompared" json:"pages_compared,omitempty"`
-	PagesSkippedCow      *uint64  `protobuf:"varint,2,req,name=pages_skipped_cow,json=pagesSkippedCow" json:"pages_skipped_cow,omitempty"`
-	ForkingTime          *uint32  `protobuf:"varint,3,req,name=forking_time,json=forkingTime" json:"forking_time,omitempty"`
-	RestoreTime          *uint32  `protobuf:"varint,4,req,name=restore_time,json=restoreTime" json:"restore_time,omitempty"`
-	PagesRestored        *uint64  `protobuf:"varint,5,opt,name=pages_restored,json=pagesRestored" json:"pages_restored,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *RestoreStatsEntry) Reset()         { *m = RestoreStatsEntry{} }
-func (m *RestoreStatsEntry) String() string { return proto.CompactTextString(m) }
-func (*RestoreStatsEntry) ProtoMessage()    {}
-func (*RestoreStatsEntry) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{11}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	PagesCompared   *uint64 `protobuf:"varint,1,req,name=pages_compared,json=pagesCompared" json:"pages_compared,omitempty"`
+	PagesSkippedCow *uint64 `protobuf:"varint,2,req,name=pages_skipped_cow,json=pagesSkippedCow" json:"pages_skipped_cow,omitempty"`
+	ForkingTime     *uint32 `protobuf:"varint,3,req,name=forking_time,json=forkingTime" json:"forking_time,omitempty"`
+	RestoreTime     *uint32 `protobuf:"varint,4,req,name=restore_time,json=restoreTime" json:"restore_time,omitempty"`
+	PagesRestored   *uint64 `protobuf:"varint,5,opt,name=pages_restored,json=pagesRestored" json:"pages_restored,omitempty"`
+}
+
+func (x *RestoreStatsEntry) Reset() {
+	*x = RestoreStatsEntry{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *RestoreStatsEntry) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_RestoreStatsEntry.Unmarshal(m, b)
-}
-func (m *RestoreStatsEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_RestoreStatsEntry.Marshal(b, m, deterministic)
-}
-func (m *RestoreStatsEntry) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RestoreStatsEntry.Merge(m, src)
+func (x *RestoreStatsEntry) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *RestoreStatsEntry) XXX_Size() int {
-	return xxx_messageInfo_RestoreStatsEntry.Size(m)
-}
-func (m *RestoreStatsEntry) XXX_DiscardUnknown() {
-	xxx_messageInfo_RestoreStatsEntry.DiscardUnknown(m)
+
+func (*RestoreStatsEntry) ProtoMessage() {}
+
+func (x *RestoreStatsEntry) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_RestoreStatsEntry proto.InternalMessageInfo
+// Deprecated: Use RestoreStatsEntry.ProtoReflect.Descriptor instead.
+func (*RestoreStatsEntry) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{11}
+}
 
-func (m *RestoreStatsEntry) GetPagesCompared() uint64 {
-	if m != nil && m.PagesCompared != nil {
-		return *m.PagesCompared
+func (x *RestoreStatsEntry) GetPagesCompared() uint64 {
+	if x != nil && x.PagesCompared != nil {
+		return *x.PagesCompared
 	}
 	return 0
 }
 
-func (m *RestoreStatsEntry) GetPagesSkippedCow() uint64 {
-	if m != nil && m.PagesSkippedCow != nil {
-		return *m.PagesSkippedCow
+func (x *RestoreStatsEntry) GetPagesSkippedCow() uint64 {
+	if x != nil && x.PagesSkippedCow != nil {
+		return *x.PagesSkippedCow
 	}
 	return 0
 }
 
-func (m *RestoreStatsEntry) GetForkingTime() uint32 {
-	if m != nil && m.ForkingTime != nil {
-		return *m.ForkingTime
+func (x *RestoreStatsEntry) GetForkingTime() uint32 {
+	if x != nil && x.ForkingTime != nil {
+		return *x.ForkingTime
 	}
 	return 0
 }
 
-func (m *RestoreStatsEntry) GetRestoreTime() uint32 {
-	if m != nil && m.RestoreTime != nil {
-		return *m.RestoreTime
+func (x *RestoreStatsEntry) GetRestoreTime() uint32 {
+	if x != nil && x.RestoreTime != nil {
+		return *x.RestoreTime
 	}
 	return 0
 }
 
-func (m *RestoreStatsEntry) GetPagesRestored() uint64 {
-	if m != nil && m.PagesRestored != nil {
-		return *m.PagesRestored
+func (x *RestoreStatsEntry) GetPagesRestored() uint64 {
+	if x != nil && x.PagesRestored != nil {
+		return *x.PagesRestored
 	}
 	return 0
 }
 
 type StatsEntry struct {
-	Dump                 *DumpStatsEntry    `protobuf:"bytes,1,opt,name=dump" json:"dump,omitempty"`
-	Restore              *RestoreStatsEntry `protobuf:"bytes,2,opt,name=restore" json:"restore,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
-	XXX_unrecognized     []byte             `json:"-"`
-	XXX_sizecache        int32              `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *StatsEntry) Reset()         { *m = StatsEntry{} }
-func (m *StatsEntry) String() string { return proto.CompactTextString(m) }
-func (*StatsEntry) ProtoMessage()    {}
-func (*StatsEntry) Descriptor() ([]byte, []int) {
-	return fileDescriptor_fe8772548dc4b615, []int{12}
+	Dump    *DumpStatsEntry    `protobuf:"bytes,1,opt,name=dump" json:"dump,omitempty"`
+	Restore *RestoreStatsEntry `protobuf:"bytes,2,opt,name=restore" json:"restore,omitempty"`
 }
 
-func (m *StatsEntry) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_StatsEntry.Unmarshal(m, b)
-}
-func (m *StatsEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_StatsEntry.Marshal(b, m, deterministic)
-}
-func (m *StatsEntry) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_StatsEntry.Merge(m, src)
+func (x *StatsEntry) Reset() {
+	*x = StatsEntry{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_lxd_migration_migrate_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *StatsEntry) XXX_Size() int {
-	return xxx_messageInfo_StatsEntry.Size(m)
+
+func (x *StatsEntry) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *StatsEntry) XXX_DiscardUnknown() {
-	xxx_messageInfo_StatsEntry.DiscardUnknown(m)
+
+func (*StatsEntry) ProtoMessage() {}
+
+func (x *StatsEntry) ProtoReflect() protoreflect.Message {
+	mi := &file_lxd_migration_migrate_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_StatsEntry proto.InternalMessageInfo
+// Deprecated: Use StatsEntry.ProtoReflect.Descriptor instead.
+func (*StatsEntry) Descriptor() ([]byte, []int) {
+	return file_lxd_migration_migrate_proto_rawDescGZIP(), []int{12}
+}
 
-func (m *StatsEntry) GetDump() *DumpStatsEntry {
-	if m != nil {
-		return m.Dump
+func (x *StatsEntry) GetDump() *DumpStatsEntry {
+	if x != nil {
+		return x.Dump
 	}
 	return nil
 }
 
-func (m *StatsEntry) GetRestore() *RestoreStatsEntry {
-	if m != nil {
-		return m.Restore
+func (x *StatsEntry) GetRestore() *RestoreStatsEntry {
+	if x != nil {
+		return x.Restore
 	}
 	return nil
 }
 
-func init() {
-	proto.RegisterEnum("migration.MigrationFSType", MigrationFSType_name, MigrationFSType_value)
-	proto.RegisterEnum("migration.CRIUType", CRIUType_name, CRIUType_value)
-	proto.RegisterType((*IDMapType)(nil), "migration.IDMapType")
-	proto.RegisterType((*Config)(nil), "migration.Config")
-	proto.RegisterType((*Device)(nil), "migration.Device")
-	proto.RegisterType((*Snapshot)(nil), "migration.Snapshot")
-	proto.RegisterType((*RsyncFeatures)(nil), "migration.rsyncFeatures")
-	proto.RegisterType((*ZfsFeatures)(nil), "migration.zfsFeatures")
-	proto.RegisterType((*BtrfsFeatures)(nil), "migration.btrfsFeatures")
-	proto.RegisterType((*MigrationHeader)(nil), "migration.MigrationHeader")
-	proto.RegisterType((*MigrationControl)(nil), "migration.MigrationControl")
-	proto.RegisterType((*MigrationSync)(nil), "migration.MigrationSync")
-	proto.RegisterType((*DumpStatsEntry)(nil), "migration.dump_stats_entry")
-	proto.RegisterType((*RestoreStatsEntry)(nil), "migration.restore_stats_entry")
-	proto.RegisterType((*StatsEntry)(nil), "migration.stats_entry")
-}
-
-func init() { proto.RegisterFile("lxd/migration/migrate.proto", fileDescriptor_fe8772548dc4b615) }
-
-var fileDescriptor_fe8772548dc4b615 = []byte{
-	// 1128 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0xdd, 0x8e, 0xd3, 0x46,
-	0x14, 0x6e, 0x12, 0x67, 0x37, 0x3e, 0x49, 0x76, 0xc3, 0x80, 0x90, 0x05, 0x2d, 0x4d, 0x0d, 0x55,
-	0xc3, 0x56, 0x02, 0x1a, 0x54, 0x89, 0xab, 0x4a, 0x6c, 0xd2, 0x2d, 0xa8, 0x10, 0x56, 0x13, 0x50,
-	0xd5, 0xde, 0x58, 0xb3, 0xf6, 0x71, 0x32, 0xc2, 0x7f, 0x9a, 0xb1, 0x17, 0x92, 0x9b, 0xaa, 0x0f,
-	0xd3, 0xe7, 0xe9, 0x55, 0x1f, 0xa6, 0x77, 0xd5, 0xcc, 0xd8, 0xc6, 0xde, 0xad, 0xd4, 0xbb, 0x39,
-	0xdf, 0xf9, 0xfc, 0x9d, 0x33, 0xe7, 0x67, 0x0c, 0x77, 0xa3, 0x8f, 0xc1, 0xe3, 0x98, 0x6f, 0x04,
-	0xcb, 0x79, 0x9a, 0x94, 0x27, 0x7c, 0x94, 0x89, 0x34, 0x4f, 0x89, 0x5d, 0x3b, 0xdc, 0xdf, 0xc1,
-	0x7e, 0xb9, 0x7c, 0xcd, 0xb2, 0xb7, 0xbb, 0x0c, 0xc9, 0x2d, 0xe8, 0x73, 0x59, 0xf0, 0xc0, 0xe9,
-	0x4c, 0xbb, 0xb3, 0x01, 0x35, 0x86, 0x41, 0x37, 0x3c, 0x70, 0xba, 0x15, 0xba, 0xe1, 0x01, 0xb9,
-	0x0d, 0x07, 0xdb, 0x54, 0xe6, 0x3c, 0x70, 0x7a, 0xd3, 0xee, 0xac, 0x4f, 0x4b, 0x8b, 0x10, 0xb0,
-	0x12, 0xc9, 0x03, 0xc7, 0xd2, 0xa8, 0x3e, 0x93, 0x3b, 0x30, 0x88, 0x59, 0x26, 0x58, 0xb2, 0x41,
-	0xa7, 0xaf, 0xf1, 0xda, 0x76, 0x9f, 0xc0, 0xc1, 0x22, 0x4d, 0x42, 0xbe, 0x21, 0x13, 0xe8, 0xbd,
-	0xc7, 0x9d, 0x8e, 0x6d, 0x53, 0x75, 0x54, 0x91, 0x2f, 0x59, 0x54, 0xa0, 0x8e, 0x6c, 0x53, 0x63,
-	0xb8, 0x3f, 0xc1, 0xc1, 0x12, 0x2f, 0xb9, 0x8f, 0x3a, 0x16, 0x8b, 0xb1, 0xfc, 0x44, 0x9f, 0xc9,
-	0x43, 0x38, 0xf0, 0xb5, 0x9e, 0xd3, 0x9d, 0xf6, 0x66, 0xc3, 0xf9, 0x8d, 0x47, 0xf5, 0x65, 0x1f,
-	0x99, 0x40, 0xb4, 0x24, 0xb8, 0x7f, 0x75, 0x61, 0xb0, 0x4e, 0x58, 0x26, 0xb7, 0x69, 0xfe, 0x9f,
-	0x5a, 0x4f, 0x61, 0x18, 0xa5, 0x3e, 0x8b, 0x16, 0xff, 0x23, 0xd8, 0x64, 0xa9, 0xcb, 0x66, 0x22,
-	0x0d, 0x79, 0x84, 0xd2, 0xe9, 0x4d, 0x7b, 0x33, 0x9b, 0xd6, 0x36, 0xf9, 0x1c, 0x6c, 0xcc, 0xb6,
-	0x18, 0xa3, 0x60, 0x91, 0xae, 0xd0, 0x80, 0x7e, 0x02, 0xc8, 0xf7, 0x30, 0xd2, 0x42, 0xe6, 0x76,
-	0xd2, 0xe9, 0x5f, 0x8b, 0x67, 0x3c, 0xb4, 0x45, 0x23, 0x2e, 0x8c, 0x98, 0xf0, 0xb7, 0x3c, 0x47,
-	0x3f, 0x2f, 0x04, 0x3a, 0x07, 0xba, 0xc2, 0x2d, 0x4c, 0x25, 0x25, 0x73, 0x96, 0x63, 0x58, 0x44,
-	0xce, 0xa1, 0x8e, 0x5b, 0xdb, 0xe4, 0x3e, 0x8c, 0x7d, 0x81, 0x3a, 0x80, 0x17, 0xb0, 0x1c, 0x9d,
-	0xc1, 0xb4, 0x33, 0xeb, 0xd1, 0x51, 0x05, 0x2e, 0x59, 0x8e, 0xe4, 0x01, 0x1c, 0x45, 0x4c, 0xe6,
-	0x5e, 0x21, 0x31, 0x30, 0x2c, 0xdb, 0xb0, 0x14, 0xfa, 0x4e, 0x62, 0xa0, 0x58, 0xee, 0x1f, 0x1d,
-	0x18, 0x0b, 0xb9, 0x4b, 0xfc, 0x33, 0x64, 0x2a, 0xae, 0x54, 0x63, 0xf2, 0x91, 0xe5, 0xb9, 0x90,
-	0x4e, 0x67, 0xda, 0x99, 0x0d, 0x68, 0x69, 0x29, 0x3c, 0xc0, 0x08, 0x73, 0xd5, 0x5b, 0x8d, 0x1b,
-	0x4b, 0x25, 0xea, 0xa7, 0x71, 0x26, 0x50, 0xaa, 0xea, 0x29, 0x4f, 0x6d, 0x93, 0x07, 0x30, 0xbe,
-	0xe0, 0x01, 0x17, 0xe8, 0xab, 0xb4, 0x74, 0x05, 0x15, 0xa1, 0x0d, 0xba, 0x0f, 0x61, 0xb8, 0x0f,
-	0x65, 0x9d, 0x40, 0x53, 0xb0, 0xd3, 0x16, 0x74, 0x37, 0x30, 0xbe, 0xc8, 0x45, 0x83, 0xfc, 0x10,
-	0x26, 0x75, 0xb1, 0xbd, 0x2d, 0xb2, 0x00, 0x45, 0xf9, 0xd1, 0x71, 0x8d, 0xbf, 0xd0, 0x30, 0xf9,
-	0x16, 0x6e, 0x18, 0x82, 0x27, 0x8b, 0x8b, 0xcb, 0x34, 0x2a, 0x62, 0x94, 0xe5, 0x5d, 0x26, 0xc6,
-	0xb1, 0xae, 0x71, 0xf7, 0x9f, 0x1e, 0x1c, 0xbf, 0xbe, 0x22, 0x70, 0x02, 0xdd, 0x50, 0xea, 0x71,
-	0x3b, 0x9a, 0xdf, 0x69, 0xf4, 0xb8, 0xe6, 0x9d, 0xad, 0xd5, 0x52, 0xd2, 0x6e, 0x28, 0xc9, 0x37,
-	0x60, 0xf9, 0x82, 0x17, 0x5a, 0xff, 0x68, 0x7e, 0xb3, 0x39, 0x81, 0xf4, 0xe5, 0x3b, 0x4d, 0xd3,
-	0x04, 0x72, 0x02, 0x7d, 0x1e, 0xc4, 0x2c, 0xd3, 0x93, 0x37, 0x9c, 0xdf, 0x6a, 0x30, 0xeb, 0x35,
-	0xa7, 0x86, 0xa2, 0xca, 0x29, 0xcb, 0xe9, 0x5f, 0x31, 0x95, 0xbd, 0xa5, 0xa7, 0xb5, 0x0d, 0x92,
-	0xef, 0xc0, 0xae, 0x80, 0x6a, 0x22, 0x9b, 0xf1, 0xab, 0xfd, 0xa1, 0x9f, 0x58, 0xc4, 0x81, 0xc3,
-	0x4c, 0x60, 0x50, 0xc4, 0x99, 0x73, 0xa8, 0x0b, 0x52, 0x99, 0xe4, 0x87, 0x2b, 0xe3, 0xa1, 0x47,
-	0x6d, 0x38, 0x77, 0x1a, 0x82, 0x2d, 0x3f, 0xbd, 0x32, 0x4d, 0x0e, 0x1c, 0x0a, 0x0c, 0x05, 0xca,
-	0xad, 0x1e, 0xbf, 0x01, 0xad, 0x4c, 0xf2, 0xac, 0xd5, 0x75, 0x07, 0xb4, 0xee, 0xed, 0x86, 0x6e,
-	0xc3, 0x4b, 0x5b, 0x03, 0x72, 0x0f, 0xc0, 0xb4, 0x69, 0xcd, 0xf7, 0xe8, 0x0c, 0xf5, 0x54, 0x37,
-	0x10, 0x95, 0x73, 0x6b, 0x48, 0x9c, 0xd1, 0xb5, 0x9c, 0x5b, 0x7e, 0xda, 0xa6, 0xbb, 0x67, 0x30,
-	0xa9, 0x5b, 0xba, 0x48, 0x93, 0x5c, 0xa4, 0x91, 0xba, 0x87, 0x2c, 0x7c, 0xdf, 0xcc, 0xa4, 0xda,
-	0xc6, 0xca, 0x54, 0x9e, 0x18, 0xa5, 0x64, 0x1b, 0xb3, 0x18, 0x36, 0xad, 0x4c, 0xf7, 0x29, 0x8c,
-	0x6b, 0x9d, 0xf5, 0x2e, 0xf1, 0xd5, 0xde, 0x87, 0x3c, 0x61, 0xd1, 0xb9, 0xc0, 0xa5, 0xaa, 0xb5,
-	0x51, 0x6a, 0x61, 0xee, 0x9f, 0x3d, 0x98, 0xa8, 0xca, 0x7b, 0x6a, 0xdb, 0xa5, 0x87, 0x49, 0x2e,
-	0x76, 0x6a, 0xe1, 0x43, 0x81, 0xb8, 0xe7, 0xc9, 0xc6, 0xcb, 0x79, 0xf9, 0xe6, 0x8d, 0xe9, 0xa8,
-	0x02, 0xdf, 0xf2, 0x18, 0xc9, 0x97, 0x30, 0x0c, 0x45, 0xba, 0xc7, 0xc4, 0x50, 0xba, 0x9a, 0x02,
-	0x06, 0xd2, 0x84, 0xaf, 0x60, 0x14, 0x63, 0xac, 0xc5, 0x35, 0xa3, 0xa7, 0x19, 0xc3, 0x12, 0xd3,
-	0x94, 0xfb, 0x30, 0x8e, 0x31, 0xfe, 0x20, 0x78, 0x8e, 0x86, 0x63, 0x99, 0x40, 0x15, 0x58, 0x91,
-	0x32, 0xb6, 0x41, 0xe9, 0x49, 0x9f, 0x25, 0x09, 0x06, 0xfa, 0x0f, 0x61, 0xd1, 0x91, 0x06, 0xd7,
-	0x06, 0x23, 0x4f, 0xe0, 0x56, 0x49, 0x7a, 0xcf, 0xb3, 0x0c, 0x03, 0x2f, 0x63, 0x02, 0x93, 0x5c,
-	0xbf, 0x75, 0x16, 0x25, 0x86, 0x6b, 0x5c, 0xe7, 0xda, 0xf3, 0x49, 0x56, 0x45, 0xca, 0x31, 0xd1,
-	0xcf, 0x5e, 0x25, 0xfb, 0x8b, 0xc1, 0x14, 0x89, 0x8b, 0x98, 0x65, 0x9e, 0x40, 0x99, 0x46, 0x97,
-	0xe6, 0xe9, 0x1b, 0xd3, 0x91, 0x06, 0xa9, 0xc1, 0xc8, 0x17, 0x00, 0x46, 0x29, 0x62, 0xfb, 0x9d,
-	0x63, 0x6b, 0x19, 0x5b, 0x23, 0xaf, 0xd8, 0x7e, 0x57, 0xb9, 0xbd, 0x8c, 0x67, 0xe5, 0xe0, 0x95,
-	0xee, 0x73, 0x05, 0xa8, 0x87, 0xb3, 0x76, 0x7b, 0x17, 0x45, 0x28, 0xf5, 0x88, 0x95, 0x89, 0x28,
-	0xca, 0x69, 0x11, 0x4a, 0xf7, 0xef, 0x0e, 0xdc, 0x14, 0x28, 0xf3, 0x54, 0x60, 0xab, 0x55, 0x5f,
-	0x9b, 0xaf, 0xa5, 0xa7, 0xde, 0x2c, 0x26, 0xd0, 0xfc, 0x9a, 0x2d, 0x6a, 0xee, 0xb6, 0x28, 0x41,
-	0x72, 0x02, 0x37, 0xda, 0xe5, 0xf1, 0xd3, 0x0f, 0xba, 0x65, 0x16, 0x3d, 0x6e, 0xd6, 0x66, 0x91,
-	0x7e, 0x50, 0x7d, 0x0b, 0x53, 0xf1, 0xbe, 0x6e, 0x7e, 0xd9, 0xb7, 0x12, 0xab, 0x5a, 0x5b, 0x25,
-	0xd3, 0x68, 0xdb, 0xb0, 0xc4, 0x34, 0xa5, 0x4e, 0xac, 0x04, 0x55, 0xdb, 0x3a, 0x75, 0x62, 0xb4,
-	0x04, 0xdd, 0x8f, 0x30, 0x6c, 0x5e, 0xe7, 0x31, 0x58, 0x81, 0x19, 0x55, 0xb5, 0x42, 0x77, 0x1b,
-	0x2b, 0x74, 0x75, 0x48, 0xa9, 0x26, 0x92, 0x67, 0x6a, 0xe1, 0xb5, 0x96, 0x5e, 0x87, 0xe1, 0xfc,
-	0x5e, 0xf3, 0xa9, 0xb8, 0x5e, 0x30, 0x5a, 0xd1, 0x4f, 0x56, 0x8d, 0x17, 0xd7, 0xbc, 0xa4, 0xc4,
-	0x86, 0x3e, 0x5d, 0xff, 0xba, 0x5a, 0x4c, 0x3e, 0x53, 0xc7, 0xd3, 0xb7, 0xf4, 0x6c, 0x3d, 0xe9,
-	0x90, 0x43, 0xe8, 0xfd, 0x76, 0xb6, 0x9e, 0x74, 0xd5, 0x81, 0x9e, 0x2e, 0x27, 0x3d, 0x72, 0x13,
-	0x8e, 0x4f, 0x5f, 0xbd, 0x59, 0xfc, 0xec, 0x3d, 0x5f, 0x2d, 0x3d, 0xf3, 0x85, 0x75, 0xf2, 0x18,
-	0x06, 0xd5, 0x5b, 0x4b, 0x8e, 0x00, 0xd4, 0xd9, 0x6b, 0xa8, 0x9d, 0xbf, 0x78, 0xfe, 0xee, 0xd5,
-	0xa4, 0x43, 0x06, 0x60, 0xad, 0xde, 0xac, 0x7e, 0x9c, 0x74, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff,
-	0x51, 0xb3, 0x06, 0x24, 0x82, 0x09, 0x00, 0x00,
+var File_lxd_migration_migrate_proto protoreflect.FileDescriptor
+
+var file_lxd_migration_migrate_proto_rawDesc = []byte{
+	0x0a, 0x1b, 0x6c, 0x78, 0x64, 0x2f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f,
+	0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6d,
+	0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7f, 0x0a, 0x09, 0x49, 0x44, 0x4d, 0x61,
+	0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x75, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x02, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69,
+	0x73, 0x67, 0x69, 0x64, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x67, 0x69,
+	0x64, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x64, 0x18, 0x03, 0x20, 0x02, 0x28,
+	0x05, 0x52, 0x06, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x73, 0x69,
+	0x64, 0x18, 0x04, 0x20, 0x02, 0x28, 0x05, 0x52, 0x04, 0x6e, 0x73, 0x69, 0x64, 0x12, 0x1a, 0x0a,
+	0x08, 0x6d, 0x61, 0x70, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x02, 0x28, 0x05, 0x52,
+	0x08, 0x6d, 0x61, 0x70, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09,
+	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+	0x20, 0x02, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x47, 0x0a, 0x06, 0x44,
+	0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x67, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x22, 0xcf, 0x02, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x67,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x6c,
+	0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65,
+	0x72, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x02, 0x28, 0x08, 0x52, 0x09, 0x65, 0x70, 0x68, 0x65, 0x6d,
+	0x65, 0x72, 0x61, 0x6c, 0x12, 0x35, 0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x44, 0x65, 0x76,
+	0x69, 0x63, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x67,
+	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0c, 0x6c,
+	0x6f, 0x63, 0x61, 0x6c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61,
+	0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x02, 0x28,
+	0x05, 0x52, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12,
+	0x1a, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x18, 0x07, 0x20, 0x02, 0x28,
+	0x08, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x63,
+	0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65,
+	0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x64, 0x61,
+	0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x73,
+	0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0d, 0x72, 0x73, 0x79, 0x6e, 0x63,
+	0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x78, 0x61, 0x74, 0x74,
+	0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x78, 0x61, 0x74, 0x74, 0x72, 0x73,
+	0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70,
+	0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70,
+	0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x62, 0x69, 0x64,
+	0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x0b, 0x7a, 0x66,
+	0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x22, 0x67, 0x0a, 0x0d, 0x62, 0x74, 0x72, 0x66, 0x73, 0x46, 0x65,
+	0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
+	0x52, 0x0f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x76,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x68, 0x65,
+	0x61, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0xf9,
+	0x03, 0x0a, 0x0f, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x12, 0x2a, 0x0a, 0x02, 0x66, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1a,
+	0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x46, 0x53, 0x54, 0x79, 0x70, 0x65, 0x52, 0x02, 0x66, 0x73, 0x12, 0x27,
+	0x0a, 0x04, 0x63, 0x72, 0x69, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6d,
+	0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x52, 0x49, 0x55, 0x54, 0x79, 0x70,
+	0x65, 0x52, 0x04, 0x63, 0x72, 0x69, 0x75, 0x12, 0x2a, 0x0a, 0x05, 0x69, 0x64, 0x6d, 0x61, 0x70,
+	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x69, 0x64,
+	0x6d, 0x61, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e,
+	0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6e, 0x61, 0x70,
+	0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x73, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d,
+	0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x74, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07,
+	0x70, 0x72, 0x65, 0x64, 0x75, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70,
+	0x72, 0x65, 0x64, 0x75, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x0d, 0x72, 0x73, 0x79, 0x6e, 0x63, 0x46,
+	0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,
+	0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x73, 0x79, 0x6e, 0x63, 0x46,
+	0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0d, 0x72, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x65,
+	0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73,
+	0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68,
+	0x12, 0x38, 0x0a, 0x0b, 0x7a, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18,
+	0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x7a, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0b, 0x7a,
+	0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x6f,
+	0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
+	0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x62, 0x74,
+	0x72, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x74,
+	0x72, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0d, 0x62, 0x74, 0x72,
+	0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x4d, 0x69,
+	0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x18,
+	0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x08, 0x52,
+	0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
+	0x67, 0x65, 0x22, 0x33, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
+	0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x44,
+	0x75, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c,
+	0x50, 0x72, 0x65, 0x44, 0x75, 0x6d, 0x70, 0x22, 0xa5, 0x03, 0x0a, 0x10, 0x64, 0x75, 0x6d, 0x70,
+	0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d,
+	0x66, 0x72, 0x65, 0x65, 0x7a, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x02, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d,
+	0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65,
+	0x18, 0x02, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0a, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x54, 0x69,
+	0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x64, 0x75, 0x6d, 0x70, 0x5f, 0x74, 0x69,
+	0x6d, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x64, 0x75, 0x6d,
+	0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x77, 0x72, 0x69, 0x74,
+	0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x65,
+	0x6d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61,
+	0x67, 0x65, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x02, 0x28,
+	0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12,
+	0x30, 0x0a, 0x14, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64,
+	0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x02, 0x28, 0x04, 0x52, 0x12, 0x70,
+	0x61, 0x67, 0x65, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e,
+	0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74,
+	0x65, 0x6e, 0x18, 0x07, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x73, 0x57,
+	0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x5f,
+	0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x69,
+	0x72, 0x6d, 0x61, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70,
+	0x61, 0x67, 0x65, 0x73, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x09, 0x20, 0x02, 0x28, 0x04, 0x52,
+	0x09, 0x70, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61,
+	0x67, 0x65, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09,
+	0x70, 0x61, 0x67, 0x65, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x61, 0x67,
+	0x65, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x5f, 0x62, 0x75, 0x66, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28,
+	0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x50, 0x69, 0x70, 0x65, 0x42, 0x75, 0x66, 0x73, 0x22,
+	0xd5, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74,
+	0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x67, 0x65, 0x73,
+	0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x04, 0x52,
+	0x0d, 0x70, 0x61, 0x67, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x12, 0x2a,
+	0x0a, 0x11, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f,
+	0x63, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0f, 0x70, 0x61, 0x67, 0x65, 0x73,
+	0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f,
+	0x72, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d,
+	0x52, 0x0b, 0x66, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a,
+	0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20,
+	0x02, 0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65,
+	0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72,
+	0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x70, 0x61, 0x67, 0x65, 0x73, 0x52,
+	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x73,
+	0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x04, 0x64, 0x75, 0x6d, 0x70, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x2e, 0x64, 0x75, 0x6d, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72,
+	0x79, 0x52, 0x04, 0x64, 0x75, 0x6d, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61,
+	0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72,
+	0x65, 0x2a, 0x4e, 0x0a, 0x0f, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x53,
+	0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x00, 0x12,
+	0x09, 0x0a, 0x05, 0x42, 0x54, 0x52, 0x46, 0x53, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x46,
+	0x53, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x42, 0x44, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f,
+	0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x52, 0x53, 0x59, 0x4e, 0x43, 0x10,
+	0x04, 0x2a, 0x2f, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x55, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a,
+	0x0a, 0x43, 0x52, 0x49, 0x55, 0x5f, 0x52, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x00, 0x12, 0x09, 0x0a,
+	0x05, 0x50, 0x48, 0x41, 0x55, 0x4c, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45,
+	0x10, 0x02,
+}
+
+var (
+	file_lxd_migration_migrate_proto_rawDescOnce sync.Once
+	file_lxd_migration_migrate_proto_rawDescData = file_lxd_migration_migrate_proto_rawDesc
+)
+
+func file_lxd_migration_migrate_proto_rawDescGZIP() []byte {
+	file_lxd_migration_migrate_proto_rawDescOnce.Do(func() {
+		file_lxd_migration_migrate_proto_rawDescData = protoimpl.X.CompressGZIP(file_lxd_migration_migrate_proto_rawDescData)
+	})
+	return file_lxd_migration_migrate_proto_rawDescData
+}
+
+var file_lxd_migration_migrate_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
+var file_lxd_migration_migrate_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
+var file_lxd_migration_migrate_proto_goTypes = []interface{}{
+	(MigrationFSType)(0),      // 0: migration.MigrationFSType
+	(CRIUType)(0),             // 1: migration.CRIUType
+	(*IDMapType)(nil),         // 2: migration.IDMapType
+	(*Config)(nil),            // 3: migration.Config
+	(*Device)(nil),            // 4: migration.Device
+	(*Snapshot)(nil),          // 5: migration.Snapshot
+	(*RsyncFeatures)(nil),     // 6: migration.rsyncFeatures
+	(*ZfsFeatures)(nil),       // 7: migration.zfsFeatures
+	(*BtrfsFeatures)(nil),     // 8: migration.btrfsFeatures
+	(*MigrationHeader)(nil),   // 9: migration.MigrationHeader
+	(*MigrationControl)(nil),  // 10: migration.MigrationControl
+	(*MigrationSync)(nil),     // 11: migration.MigrationSync
+	(*DumpStatsEntry)(nil),    // 12: migration.dump_stats_entry
+	(*RestoreStatsEntry)(nil), // 13: migration.restore_stats_entry
+	(*StatsEntry)(nil),        // 14: migration.stats_entry
+}
+var file_lxd_migration_migrate_proto_depIdxs = []int32{
+	3,  // 0: migration.Device.config:type_name -> migration.Config
+	3,  // 1: migration.Snapshot.localConfig:type_name -> migration.Config
+	4,  // 2: migration.Snapshot.localDevices:type_name -> migration.Device
+	0,  // 3: migration.MigrationHeader.fs:type_name -> migration.MigrationFSType
+	1,  // 4: migration.MigrationHeader.criu:type_name -> migration.CRIUType
+	2,  // 5: migration.MigrationHeader.idmap:type_name -> migration.IDMapType
+	5,  // 6: migration.MigrationHeader.snapshots:type_name -> migration.Snapshot
+	6,  // 7: migration.MigrationHeader.rsyncFeatures:type_name -> migration.rsyncFeatures
+	7,  // 8: migration.MigrationHeader.zfsFeatures:type_name -> migration.zfsFeatures
+	8,  // 9: migration.MigrationHeader.btrfsFeatures:type_name -> migration.btrfsFeatures
+	12, // 10: migration.stats_entry.dump:type_name -> migration.dump_stats_entry
+	13, // 11: migration.stats_entry.restore:type_name -> migration.restore_stats_entry
+	12, // [12:12] is the sub-list for method output_type
+	12, // [12:12] is the sub-list for method input_type
+	12, // [12:12] is the sub-list for extension type_name
+	12, // [12:12] is the sub-list for extension extendee
+	0,  // [0:12] is the sub-list for field type_name
+}
+
+func init() { file_lxd_migration_migrate_proto_init() }
+func file_lxd_migration_migrate_proto_init() {
+	if File_lxd_migration_migrate_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_lxd_migration_migrate_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IDMapType); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Config); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Device); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Snapshot); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RsyncFeatures); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ZfsFeatures); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BtrfsFeatures); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MigrationHeader); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MigrationControl); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MigrationSync); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DumpStatsEntry); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*RestoreStatsEntry); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_lxd_migration_migrate_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StatsEntry); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_lxd_migration_migrate_proto_rawDesc,
+			NumEnums:      2,
+			NumMessages:   13,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_lxd_migration_migrate_proto_goTypes,
+		DependencyIndexes: file_lxd_migration_migrate_proto_depIdxs,
+		EnumInfos:         file_lxd_migration_migrate_proto_enumTypes,
+		MessageInfos:      file_lxd_migration_migrate_proto_msgTypes,
+	}.Build()
+	File_lxd_migration_migrate_proto = out.File
+	file_lxd_migration_migrate_proto_rawDesc = nil
+	file_lxd_migration_migrate_proto_goTypes = nil
+	file_lxd_migration_migrate_proto_depIdxs = nil
 }

From 2cd5b8f0f05754e22b139e6d233ccd7122b98cf0 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 16:33:42 +0000
Subject: [PATCH 3/9] lxd/migration: Adds expiry_date field to snapshots
 protobuf

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/migration/migrate.pb.go | 240 +++++++++++++++++++-----------------
 lxd/migration/migrate.proto |   1 +
 2 files changed, 126 insertions(+), 115 deletions(-)

diff --git a/lxd/migration/migrate.pb.go b/lxd/migration/migrate.pb.go
index 6aba7e59e2..0ad0958c69 100644
--- a/lxd/migration/migrate.pb.go
+++ b/lxd/migration/migrate.pb.go
@@ -349,6 +349,7 @@ type Snapshot struct {
 	Stateful     *bool     `protobuf:"varint,7,req,name=stateful" json:"stateful,omitempty"`
 	CreationDate *int64    `protobuf:"varint,8,opt,name=creation_date,json=creationDate" json:"creation_date,omitempty"`
 	LastUsedDate *int64    `protobuf:"varint,9,opt,name=last_used_date,json=lastUsedDate" json:"last_used_date,omitempty"`
+	ExpiryDate   *int64    `protobuf:"varint,10,opt,name=expiry_date,json=expiryDate" json:"expiry_date,omitempty"`
 }
 
 func (x *Snapshot) Reset() {
@@ -446,6 +447,13 @@ func (x *Snapshot) GetLastUsedDate() int64 {
 	return 0
 }
 
+func (x *Snapshot) GetExpiryDate() int64 {
+	if x != nil && x.ExpiryDate != nil {
+		return *x.ExpiryDate
+	}
+	return 0
+}
+
 type RsyncFeatures struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1132,7 +1140,7 @@ var file_lxd_migration_migrate_proto_rawDesc = []byte{
 	0x02, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x63, 0x6f, 0x6e,
 	0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x67, 0x72,
 	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f,
-	0x6e, 0x66, 0x69, 0x67, 0x22, 0xcf, 0x02, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x22, 0xf0, 0x02, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
 	0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52,
 	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f,
 	0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6d, 0x69, 0x67,
@@ -1153,120 +1161,122 @@ var file_lxd_migration_migrate_proto_rawDesc = []byte{
 	0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65,
 	0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x64, 0x61,
 	0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x73,
-	0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0d, 0x72, 0x73, 0x79, 0x6e, 0x63,
-	0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x78, 0x61, 0x74, 0x74,
-	0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x78, 0x61, 0x74, 0x74, 0x72, 0x73,
-	0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70,
-	0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70,
-	0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x62, 0x69, 0x64,
-	0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x0b, 0x7a, 0x66,
-	0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d,
-	0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d,
-	0x70, 0x72, 0x65, 0x73, 0x73, 0x22, 0x67, 0x0a, 0x0d, 0x62, 0x74, 0x72, 0x66, 0x73, 0x46, 0x65,
-	0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x0f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65,
-	0x72, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x76,
-	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x68, 0x65,
-	0x61, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0xf9,
-	0x03, 0x0a, 0x0f, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64,
-	0x65, 0x72, 0x12, 0x2a, 0x0a, 0x02, 0x66, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1a,
-	0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x46, 0x53, 0x54, 0x79, 0x70, 0x65, 0x52, 0x02, 0x66, 0x73, 0x12, 0x27,
-	0x0a, 0x04, 0x63, 0x72, 0x69, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6d,
-	0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x52, 0x49, 0x55, 0x54, 0x79, 0x70,
-	0x65, 0x52, 0x04, 0x63, 0x72, 0x69, 0x75, 0x12, 0x2a, 0x0a, 0x05, 0x69, 0x64, 0x6d, 0x61, 0x70,
-	0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x2e, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x69, 0x64,
-	0x6d, 0x61, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e,
-	0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6e, 0x61, 0x70,
-	0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x73, 0x6e, 0x61,
-	0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d,
-	0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f,
-	0x74, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07,
-	0x70, 0x72, 0x65, 0x64, 0x75, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70,
-	0x72, 0x65, 0x64, 0x75, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x0d, 0x72, 0x73, 0x79, 0x6e, 0x63, 0x46,
-	0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,
-	0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x73, 0x79, 0x6e, 0x63, 0x46,
-	0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0d, 0x72, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x65,
-	0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73,
-	0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68,
-	0x12, 0x38, 0x0a, 0x0b, 0x7a, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18,
-	0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f,
-	0x6e, 0x2e, 0x7a, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0b, 0x7a,
-	0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x6f,
-	0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
-	0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x62, 0x74,
-	0x72, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62, 0x74,
-	0x72, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0d, 0x62, 0x74, 0x72,
-	0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x4d, 0x69,
-	0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x18,
-	0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x08, 0x52,
-	0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73,
-	0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
-	0x67, 0x65, 0x22, 0x33, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
-	0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x65, 0x44,
-	0x75, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c,
-	0x50, 0x72, 0x65, 0x44, 0x75, 0x6d, 0x70, 0x22, 0xa5, 0x03, 0x0a, 0x10, 0x64, 0x75, 0x6d, 0x70,
-	0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a, 0x0d,
-	0x66, 0x72, 0x65, 0x65, 0x7a, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20,
-	0x02, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d,
-	0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65,
-	0x18, 0x02, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0a, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x54, 0x69,
-	0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x64, 0x75, 0x6d, 0x70, 0x5f, 0x74, 0x69,
-	0x6d, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x64, 0x75, 0x6d,
-	0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x77, 0x72, 0x69, 0x74,
-	0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x65,
-	0x6d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61,
-	0x67, 0x65, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x02, 0x28,
-	0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12,
-	0x30, 0x0a, 0x14, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64,
-	0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x02, 0x28, 0x04, 0x52, 0x12, 0x70,
-	0x61, 0x67, 0x65, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65, 0x6e,
-	0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74,
-	0x65, 0x6e, 0x18, 0x07, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x73, 0x57,
-	0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x72, 0x6d, 0x61, 0x70, 0x5f,
-	0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x69,
-	0x72, 0x6d, 0x61, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70,
-	0x61, 0x67, 0x65, 0x73, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x09, 0x20, 0x02, 0x28, 0x04, 0x52,
-	0x09, 0x70, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61,
-	0x67, 0x65, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09,
-	0x70, 0x61, 0x67, 0x65, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x61, 0x67,
-	0x65, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x5f, 0x62, 0x75, 0x66, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28,
-	0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x50, 0x69, 0x70, 0x65, 0x42, 0x75, 0x66, 0x73, 0x22,
-	0xd5, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74,
-	0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x67, 0x65, 0x73,
-	0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x04, 0x52,
-	0x0d, 0x70, 0x61, 0x67, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x12, 0x2a,
-	0x0a, 0x11, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f,
-	0x63, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0f, 0x70, 0x61, 0x67, 0x65, 0x73,
-	0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x6f,
-	0x72, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d,
-	0x52, 0x0b, 0x66, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a,
-	0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20,
-	0x02, 0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65,
-	0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72,
-	0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x70, 0x61, 0x67, 0x65, 0x73, 0x52,
-	0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x73,
-	0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x04, 0x64, 0x75, 0x6d, 0x70, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x2e, 0x64, 0x75, 0x6d, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72,
-	0x79, 0x52, 0x04, 0x64, 0x75, 0x6d, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f,
-	0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61,
-	0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61,
-	0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72,
-	0x65, 0x2a, 0x4e, 0x0a, 0x0f, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x53,
-	0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x00, 0x12,
-	0x09, 0x0a, 0x05, 0x42, 0x54, 0x52, 0x46, 0x53, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x46,
-	0x53, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x42, 0x44, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f,
-	0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x52, 0x53, 0x59, 0x4e, 0x43, 0x10,
-	0x04, 0x2a, 0x2f, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x55, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a,
-	0x0a, 0x43, 0x52, 0x49, 0x55, 0x5f, 0x52, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x00, 0x12, 0x09, 0x0a,
-	0x05, 0x50, 0x48, 0x41, 0x55, 0x4c, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45,
-	0x10, 0x02,
+	0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79,
+	0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, 0x70,
+	0x69, 0x72, 0x79, 0x44, 0x61, 0x74, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0d, 0x72, 0x73, 0x79, 0x6e,
+	0x63, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x78, 0x61, 0x74,
+	0x74, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x78, 0x61, 0x74, 0x74, 0x72,
+	0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d,
+	0x70, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x62, 0x69,
+	0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x0b, 0x7a,
+	0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f,
+	0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f,
+	0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x22, 0x67, 0x0a, 0x0d, 0x62, 0x74, 0x72, 0x66, 0x73, 0x46,
+	0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x69, 0x67, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x0f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62,
+	0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x68,
+	0x65, 0x61, 0x64, 0x65, 0x72, 0x53, 0x75, 0x62, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22,
+	0xf9, 0x03, 0x0a, 0x0f, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61,
+	0x64, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x02, 0x66, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32,
+	0x1a, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x67, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x53, 0x54, 0x79, 0x70, 0x65, 0x52, 0x02, 0x66, 0x73, 0x12,
+	0x27, 0x0a, 0x04, 0x63, 0x72, 0x69, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e,
+	0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x52, 0x49, 0x55, 0x54, 0x79,
+	0x70, 0x65, 0x52, 0x04, 0x63, 0x72, 0x69, 0x75, 0x12, 0x2a, 0x0a, 0x05, 0x69, 0x64, 0x6d, 0x61,
+	0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x2e, 0x49, 0x44, 0x4d, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x69,
+	0x64, 0x6d, 0x61, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74,
+	0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6e, 0x61,
+	0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x73, 0x6e,
+	0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e,
+	0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68,
+	0x6f, 0x74, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x18, 0x0a,
+	0x07, 0x70, 0x72, 0x65, 0x64, 0x75, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07,
+	0x70, 0x72, 0x65, 0x64, 0x75, 0x6d, 0x70, 0x12, 0x3e, 0x0a, 0x0d, 0x72, 0x73, 0x79, 0x6e, 0x63,
+	0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18,
+	0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x73, 0x79, 0x6e, 0x63,
+	0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0d, 0x72, 0x73, 0x79, 0x6e, 0x63, 0x46,
+	0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65,
+	0x73, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73,
+	0x68, 0x12, 0x38, 0x0a, 0x0b, 0x7a, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73,
+	0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x2e, 0x7a, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0b,
+	0x7a, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x76,
+	0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x62,
+	0x74, 0x72, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x62,
+	0x74, 0x72, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x0d, 0x62, 0x74,
+	0x72, 0x66, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x4d,
+	0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12,
+	0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x02, 0x28, 0x08,
+	0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x22, 0x33, 0x0a, 0x0d, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x53, 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x65,
+	0x44, 0x75, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x69, 0x6e, 0x61,
+	0x6c, 0x50, 0x72, 0x65, 0x44, 0x75, 0x6d, 0x70, 0x22, 0xa5, 0x03, 0x0a, 0x10, 0x64, 0x75, 0x6d,
+	0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x23, 0x0a,
+	0x0d, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x02, 0x28, 0x0d, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x69, 0x6e, 0x67, 0x54, 0x69,
+	0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x5f, 0x74, 0x69, 0x6d,
+	0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0a, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x54,
+	0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x64, 0x75, 0x6d, 0x70, 0x5f, 0x74,
+	0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x64, 0x75,
+	0x6d, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x77, 0x72, 0x69,
+	0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0c, 0x6d,
+	0x65, 0x6d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70,
+	0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x02,
+	0x28, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64,
+	0x12, 0x30, 0x0a, 0x14, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65,
+	0x64, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x02, 0x28, 0x04, 0x52, 0x12,
+	0x70, 0x61, 0x67, 0x65, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x50, 0x61, 0x72, 0x65,
+	0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74,
+	0x74, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x73,
+	0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x72, 0x6d, 0x61, 0x70,
+	0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c,
+	0x69, 0x72, 0x6d, 0x61, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a,
+	0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x09, 0x20, 0x02, 0x28, 0x04,
+	0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x70,
+	0x61, 0x67, 0x65, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x09, 0x70, 0x61, 0x67, 0x65, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x61,
+	0x67, 0x65, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x5f, 0x62, 0x75, 0x66, 0x73, 0x18, 0x0b, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x67, 0x65, 0x50, 0x69, 0x70, 0x65, 0x42, 0x75, 0x66, 0x73,
+	0x22, 0xd5, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61,
+	0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x67, 0x65,
+	0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x04,
+	0x52, 0x0d, 0x70, 0x61, 0x67, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x12,
+	0x2a, 0x0a, 0x11, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64,
+	0x5f, 0x63, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04, 0x52, 0x0f, 0x70, 0x61, 0x67, 0x65,
+	0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x77, 0x12, 0x21, 0x0a, 0x0c, 0x66,
+	0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x02, 0x28,
+	0x0d, 0x52, 0x0b, 0x66, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21,
+	0x0a, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04,
+	0x20, 0x02, 0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x54, 0x69, 0x6d,
+	0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x70, 0x61, 0x67, 0x65, 0x73,
+	0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x22, 0x78, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74,
+	0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x04, 0x64, 0x75, 0x6d, 0x70, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74,
+	0x72, 0x79, 0x52, 0x04, 0x64, 0x75, 0x6d, 0x70, 0x12, 0x38, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x74,
+	0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x69, 0x67, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74,
+	0x61, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x2a, 0x4e, 0x0a, 0x0f, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46,
+	0x53, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x00,
+	0x12, 0x09, 0x0a, 0x05, 0x42, 0x54, 0x52, 0x46, 0x53, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x5a,
+	0x46, 0x53, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x42, 0x44, 0x10, 0x03, 0x12, 0x13, 0x0a,
+	0x0f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x52, 0x53, 0x59, 0x4e, 0x43,
+	0x10, 0x04, 0x2a, 0x2f, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x55, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e,
+	0x0a, 0x0a, 0x43, 0x52, 0x49, 0x55, 0x5f, 0x52, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x00, 0x12, 0x09,
+	0x0a, 0x05, 0x50, 0x48, 0x41, 0x55, 0x4c, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e,
+	0x45, 0x10, 0x02,
 }
 
 var (
diff --git a/lxd/migration/migrate.proto b/lxd/migration/migrate.proto
index 257f038e21..dd423891d1 100644
--- a/lxd/migration/migrate.proto
+++ b/lxd/migration/migrate.proto
@@ -45,6 +45,7 @@ message Snapshot {
 	required bool			stateful		= 7;
 	optional int64			creation_date	= 8;
 	optional int64			last_used_date	= 9;
+	optional int64 			expiry_date = 10;
 }
 
 message rsyncFeatures {

From b7ab5d357a14b07340a12c4ea6e8d2d6d9b42287 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 16:50:24 +0000
Subject: [PATCH 4/9] lxd/migrate/instance: Populate expiry date in
 snapshotToProtobuf

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/migrate_instance.go | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/lxd/migrate_instance.go b/lxd/migrate_instance.go
index 1b922e9760..bca1120aa0 100644
--- a/lxd/migrate_instance.go
+++ b/lxd/migrate_instance.go
@@ -115,6 +115,7 @@ func snapshotToProtobuf(c instance.Instance) *migration.Snapshot {
 
 	creationDate := c.CreationDate().UTC().Unix()
 	lastUsedDate := c.LastUsedDate().UTC().Unix()
+	expiryDate := c.ExpiryDate().UTC().Unix()
 
 	return &migration.Snapshot{
 		Name:         &parts[len(parts)-1],
@@ -126,6 +127,7 @@ func snapshotToProtobuf(c instance.Instance) *migration.Snapshot {
 		Stateful:     &stateful,
 		CreationDate: &creationDate,
 		LastUsedDate: &lastUsedDate,
+		ExpiryDate:   &expiryDate,
 	}
 }
 

From 3a637df08d906ad95cb14b4b36dc1472783fbe52 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 16:50:43 +0000
Subject: [PATCH 5/9] lxd/migrate/storage/volumes: Populate zero expiry date in
 volumeSnapshotToProtobuf

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/migrate_storage_volumes.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lxd/migrate_storage_volumes.go b/lxd/migrate_storage_volumes.go
index cb28c506a6..a5d006b856 100644
--- a/lxd/migrate_storage_volumes.go
+++ b/lxd/migrate_storage_volumes.go
@@ -422,5 +422,6 @@ func volumeSnapshotToProtobuf(vol *api.StorageVolume) *migration.Snapshot {
 		Stateful:     proto.Bool(false),
 		CreationDate: proto.Int64(0),
 		LastUsedDate: proto.Int64(0),
+		ExpiryDate:   proto.Int64(0),
 	}
 }

From 99a3f54a08a5e74f4b43fc29d94f79ec9878753c Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 16:51:08 +0000
Subject: [PATCH 6/9] lxd/storage/migration: Populate expiry date in
 snapshotProtobufToInstanceArgs

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage_migration.go | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go
index 5ff3e38896..703768da96 100644
--- a/lxd/storage_migration.go
+++ b/lxd/storage_migration.go
@@ -48,5 +48,9 @@ func snapshotProtobufToInstanceArgs(inst instance.Instance, snap *migration.Snap
 		args.LastUsedDate = time.Unix(snap.GetLastUsedDate(), 0)
 	}
 
+	if snap.GetExpiryDate() != 0 {
+		args.ExpiryDate = time.Unix(snap.GetExpiryDate(), 0)
+	}
+
 	return args
 }

From 6a02e9a89f63fea275996edc1228200b5ed06be5 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 17:12:08 +0000
Subject: [PATCH 7/9] lxd/migration/migration/volumes: Updates TypesToHeader
 and MatchTypes to use a pointer to MigrationHeader

To avoid copying internal protobuf state lock.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/migration/migration_volumes.go | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lxd/migration/migration_volumes.go b/lxd/migration/migration_volumes.go
index 1aa186332f..015994ccfd 100644
--- a/lxd/migration/migration_volumes.go
+++ b/lxd/migration/migration_volumes.go
@@ -49,7 +49,7 @@ type VolumeTargetArgs struct {
 // If the fallback Rsync type is present in any of the types even if it is not preferred, then its
 // optional features are added to the header's RsyncFeatures, allowing for fallback negotiation to
 // take place on the farside.
-func TypesToHeader(types ...Type) MigrationHeader {
+func TypesToHeader(types ...Type) *MigrationHeader {
 	missingFeature := false
 	hasFeature := true
 	var preferredType Type
@@ -120,7 +120,7 @@ func TypesToHeader(types ...Type) MigrationHeader {
 		break // Only use the first rsync transport type found to generate rsync features list.
 	}
 
-	return header
+	return &header
 }
 
 // MatchTypes attempts to find matching migration transport types between an offered type sent from a remote
@@ -129,7 +129,7 @@ func TypesToHeader(types ...Type) MigrationHeader {
 // fallback type which is used as an additional offer type preference in case the preferred remote type is not
 // compatible with the local type available. It is expected that both sides of the migration will support the
 // fallback type for the volume's content type that is being migrated.
-func MatchTypes(offer MigrationHeader, fallbackType MigrationFSType, ourTypes []Type) ([]Type, error) {
+func MatchTypes(offer *MigrationHeader, fallbackType MigrationFSType, ourTypes []Type) ([]Type, error) {
 	// Generate an offer types slice from the preferred type supplied from remote and the
 	// fallback type supplied based on the content type of the transfer.
 	offeredFSTypes := []MigrationFSType{offer.GetFs(), fallbackType}

From b4224b71887e8bb7632a646f5caebc3d213c1559 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 17:10:54 +0000
Subject: [PATCH 8/9] lxd/migrate/instance: Avoid copying
 migration.MigrationHeader due to new internal state lock added by protobuf

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/migrate_instance.go | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/lxd/migrate_instance.go b/lxd/migrate_instance.go
index bca1120aa0..7086d0160f 100644
--- a/lxd/migrate_instance.go
+++ b/lxd/migrate_instance.go
@@ -338,7 +338,6 @@ func (s *migrationSourceWs) preDumpLoop(state *state.State, args *preDumpLoopArg
 func (s *migrationSourceWs) Do(state *state.State, migrateOp *operations.Operation) error {
 	<-s.allConnected
 
-	var offerHeader migration.MigrationHeader
 	var poolMigrationTypes []migration.Type
 
 	pool, err := storagePools.GetPoolByInstance(state, s.instance)
@@ -357,7 +356,7 @@ func (s *migrationSourceWs) Do(state *state.State, migrateOp *operations.Operati
 
 	// Convert the pool's migration type options to an offer header to target.
 	// Populate the Fs, ZfsFeatures and RsyncFeatures fields.
-	offerHeader = migration.TypesToHeader(poolMigrationTypes...)
+	offerHeader := migration.TypesToHeader(poolMigrationTypes...)
 
 	// Add CRIO info to source header.
 	criuType := migration.CRIUType_CRIU_RSYNC.Enum()
@@ -431,15 +430,15 @@ func (s *migrationSourceWs) Do(state *state.State, migrateOp *operations.Operati
 	offerHeader.Predump = proto.Bool(offerUsePreDumps)
 
 	// Send offer to target.
-	err = s.send(&offerHeader)
+	err = s.send(offerHeader)
 	if err != nil {
 		s.sendControl(err)
 		return err
 	}
 
 	// Receive response from target.
-	var respHeader migration.MigrationHeader
-	err = s.recv(&respHeader)
+	respHeader := &migration.MigrationHeader{}
+	err = s.recv(respHeader)
 	if err != nil {
 		s.sendControl(err)
 		return err
@@ -822,8 +821,9 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
 		controller = c.dest.sendControl
 	}
 
-	offerHeader := migration.MigrationHeader{}
-	if err := receiver(&offerHeader); err != nil {
+	offerHeader := &migration.MigrationHeader{}
+	err = receiver(offerHeader)
+	if err != nil {
 		controller(err)
 		return err
 	}
@@ -845,9 +845,6 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
 	// The function that will be executed to receive the sender's migration data.
 	var myTarget func(conn *websocket.Conn, op *operations.Operation, args MigrationSinkArgs) error
 
-	// The migration header to be sent back to source with our target options.
-	var respHeader migration.MigrationHeader
-
 	pool, err := storagePools.GetPoolByInstance(state, c.src.instance)
 	if err != nil {
 		return err
@@ -862,8 +859,9 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
 		return err
 	}
 
+	// The migration header to be sent back to source with our target options.
 	// Convert response type to response header and copy snapshot info into it.
-	respHeader = migration.TypesToHeader(respTypes...)
+	respHeader := migration.TypesToHeader(respTypes...)
 	respHeader.SnapshotNames = offerHeader.SnapshotNames
 	respHeader.Snapshots = offerHeader.Snapshots
 	respHeader.Refresh = &c.refresh
@@ -977,7 +975,7 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
 	// MigrationSinkArgs below.
 	rsyncFeatures := respHeader.GetRsyncFeaturesSlice()
 
-	err = sender(&respHeader)
+	err = sender(respHeader)
 	if err != nil {
 		controller(err)
 		return err
@@ -1190,7 +1188,7 @@ func (c *migrationSink) Do(state *state.State, migrateOp *operations.Operation)
 
 			// The source can only tell us it failed (e.g. if checkpointing failed).
 			// We have to tell the source whether or not the restore was successful.
-			logger.Debugf("Unknown message %v from source", msg)
+			logger.Debugf("Unknown message %q from source", *msg.Message)
 		}
 	}
 }

From b06e5b286a4e98db126a727e7cb2145044131504 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 4 Jan 2021 17:11:43 +0000
Subject: [PATCH 9/9] lxd/migrate/storage/volumes: Avoid copying
 migration.MigrationHeader due to new internal state lock added by protobuf

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/migrate_storage_volumes.go | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/lxd/migrate_storage_volumes.go b/lxd/migrate_storage_volumes.go
index a5d006b856..962febd8eb 100644
--- a/lxd/migrate_storage_volumes.go
+++ b/lxd/migrate_storage_volumes.go
@@ -40,7 +40,6 @@ func (s *migrationSourceWs) DoStorage(state *state.State, projectName string, po
 	<-s.allConnected
 	defer s.disconnect()
 
-	var offerHeader migration.MigrationHeader
 	var poolMigrationTypes []migration.Type
 
 	pool, err := storagePools.GetPoolByName(state, poolName)
@@ -73,7 +72,7 @@ func (s *migrationSourceWs) DoStorage(state *state.State, projectName string, po
 	}
 
 	// Convert the pool's migration type options to an offer header to target.
-	offerHeader = migration.TypesToHeader(poolMigrationTypes...)
+	offerHeader := migration.TypesToHeader(poolMigrationTypes...)
 
 	snapshots := []*migration.Snapshot{}
 	snapshotNames := []string{}
@@ -101,7 +100,7 @@ func (s *migrationSourceWs) DoStorage(state *state.State, projectName string, po
 	offerHeader.Snapshots = snapshots
 
 	// Send offer to target.
-	err = s.send(&offerHeader)
+	err = s.send(offerHeader)
 	if err != nil {
 		logger.Errorf("Failed to send storage volume migration header")
 		s.sendControl(err)
@@ -109,9 +108,8 @@ func (s *migrationSourceWs) DoStorage(state *state.State, projectName string, po
 	}
 
 	// Receive response from target.
-	var respHeader migration.MigrationHeader
-	err = s.recv(&respHeader)
-
+	respHeader := &migration.MigrationHeader{}
+	err = s.recv(respHeader)
 	if err != nil {
 		logger.Errorf("Failed to receive storage volume migration header")
 		s.sendControl(err)
@@ -244,8 +242,9 @@ func (c *migrationSink) DoStorage(state *state.State, projectName string, poolNa
 		controller = c.dest.sendControl
 	}
 
-	offerHeader := migration.MigrationHeader{}
-	if err := receiver(&offerHeader); err != nil {
+	offerHeader := &migration.MigrationHeader{}
+	err = receiver(offerHeader)
+	if err != nil {
 		logger.Errorf("Failed to receive storage volume migration header")
 		controller(err)
 		return err
@@ -254,9 +253,6 @@ func (c *migrationSink) DoStorage(state *state.State, projectName string, poolNa
 	// The function that will be executed to receive the sender's migration data.
 	var myTarget func(conn *websocket.Conn, op *operations.Operation, args MigrationSinkArgs) error
 
-	// The migration header to be sent back to source with our target options.
-	var respHeader migration.MigrationHeader
-
 	pool, err := storagePools.GetPoolByName(state, poolName)
 	if err != nil {
 		return err
@@ -280,8 +276,9 @@ func (c *migrationSink) DoStorage(state *state.State, projectName string, poolNa
 		return err
 	}
 
+	// The migration header to be sent back to source with our target options.
 	// Convert response type to response header and copy snapshot info into it.
-	respHeader = migration.TypesToHeader(respTypes...)
+	respHeader := migration.TypesToHeader(respTypes...)
 	respHeader.SnapshotNames = offerHeader.SnapshotNames
 	respHeader.Snapshots = offerHeader.Snapshots
 
@@ -309,7 +306,7 @@ func (c *migrationSink) DoStorage(state *state.State, projectName string, poolNa
 		return pool.CreateCustomVolumeFromMigration(projectName, &shared.WebsocketIO{Conn: conn}, volTargetArgs, op)
 	}
 
-	err = sender(&respHeader)
+	err = sender(respHeader)
 	if err != nil {
 		logger.Errorf("Failed to send storage volume migration header")
 		controller(err)
@@ -392,7 +389,7 @@ func (c *migrationSink) DoStorage(state *state.State, projectName string, poolNa
 			// The source can only tell us it failed (e.g. if
 			// checkpointing failed). We have to tell the source
 			// whether or not the restore was successful.
-			logger.Debugf("Unknown message %v from source", msg)
+			logger.Debugf("Unknown message %q from source", *msg.Message)
 		}
 	}
 }


More information about the lxc-devel mailing list