On 25.08.2015 18:54, Dmitry Guryanov wrote: > On 08/25/2015 12:04 PM, nshirokovs...@virtuozzo.com wrote: >> From: Nikolay Shirokovskiy <nshirokovs...@virtuozzo.com> >> >> Migration API has a lot of options. This patch intention is to provide >> support for those options that can be trivially supported and give >> estimation for other options support in this commit message. >> >> I. Supported. >> >> 1. VIR_MIGRATE_COMPRESSED. Means 'use compression when migration domain >> memory'. It is supported but quite uncommon way: vz migration demands that >> this >> option should be set. This is due to vz is hardcoded to moving VMs memory >> using >> compression. So anyone who wants to migrate vz domain should set this option >> thus declaring it knows it uses compression. >> >> Why bother? May be just support this option and ignore if it is not set or >> don't support at all as we can't change behaviour in this aspect. Well I >> believe that this option is, first, inherent to hypervisor implementation as >> we have a task of moving domain memory to different place and, second, we >> have >> a tradeoff here between cpu and network resources and some managment should >> choose the stratery via this option. If we choose ignoring or unsupporting >> implementation than this option has a too vague meaning. Let's go into more >> detail. >> >> First if we ignore situation where option is not set than we put user into >> fallacy that vz hypervisor don't use compression and thus have lower cpu >> usage. Second approach is to not support the option. The main reason not to >> follow this way is that 'not supported and not set' is indistinguishable from >> 'supported and not set' and thus again fool the user. >> >> 2. VIR_MIGRATE_LIVE. Means 'reduce domain downtime by suspending it as lately >> as possible' which technically means 'migrate as much domain memory as >> possible >> before suspending'. Supported in same manner as VIR_MIGRATE_COMPRESSED as >> both >> vz VMs and CTs are always migrated via live scheme. >> >> One may be fooled by vz sdk flags of migration api: PVMT_HOT_MIGRATION(aka >> live) and PVMT_WARM_MIGRATION(aka normal). Current implementation ignore >> these >> flags and always use live migration. >> >> 3. VIR_MIGRATE_PERSIST_DEST, VIR_MIGRATE_UNDEFINE_SOURCE. This two comes >> together. Vz domain are alwasy persistent so we have to support demand option >> VIR_MIGRATE_PERSIST_DEST is set and VIR_MIGRATE_UNDEFINE_SOURCE is not (and >> this is done just by unsupporting it). >> >> 4. VIR_MIGRATE_PAUSED. Means 'don't resume domain on destination'. This is >> trivially supported as we have a corresponding option in vz migration. >> >> 5. VIR_MIGRATE_OFFLINE. Means 'migrate only XML definition of a domain'. It >> is >> a forcing option that is it is ignored if domain is running and must be set >> to migrate stopped domain. Vz implemenation follows this unformal definition >> with one exception: non-shared disks will be migrated too. This desicion is >> on >> par with VIR_MIGRATE_NON_SHARED_DISK condideration(see last part of this >> notes). >> >> All that said the minimal command to migrate vz domain looks next: >> >> migrate --direct $DOMAIN $STUB --migrateuri $DESTINATION --live --persistent >> --compressed. >> >> Not good. Say if you want to just migrate a domain without further >> details you will get error messages until you add these options to >> command line. I think there is a lack of notion 'default' behaviour >> in all these aspects. If we have it we could just issue: >> >> migrate $DOMAIN $DESTINATION >> >> For vz this would give default compression for example, for qemu - default >> no-compression. Then we could have flags --compressed and -no-compressed >> and for vz the latter would give unsupported error. >> >> II. Unsupported. >> >> 1. VIR_MIGRATE_UNSAFE. Vz disks are always have 'cache=none' set (this >> is not reflected in current version of vz driver and will be fixed >> soon). So we need not to support this option. >> >> 2. VIR_MIGRATE_CHANGE_PROTECTION. Unsupported as we have no appopriate >> support from vz sdk. Although we have locks they are advisory and >> cant help us. >> >> 3. VIR_MIGRATE_TUNNELLED. Means 'use libvirtd to libvirtd connection >> to pass hypervisor migration traffic'. Unsupported as not among >> vz hypervisor usecases. >> >> 4. p2p migration which is exposed via *toURI* interface with >> VIR_MIGRATE_PEER2PEER flag set. It doesn't make sense >> for vz migration as it is a variant of managed migration which >> is qemu specific. >> >> 5. VIR_MIGRATE_ABORT_ON_ERROR, VIR_MIGRATE_AUTO_CONVERGE, >> VIR_MIGRATE_RDMA_PIN_ALL, VIR_MIGRATE_NON_SHARED_INC, >> VIR_MIGRATE_PARAM_DEST_XML, VIR_MIGRATE_PARAM_BANDWIDTH, >> VIR_MIGRATE_PARAM_GRAPHICS_URI, VIR_MIGRATE_PARAM_LISTEN_ADDRESS, >> VIR_MIGRATE_PARAM_MIGRATE_DISKS. >> Without further discussion. They are just not usecases of vz hypevisor. >> >> III. Undecided and thus unsupported. >> >> 6. VIR_MIGRATE_NON_SHARED_DISK. The meaning of this option is not clear to >> me. >> Look, if qemu domain has a non-shared disk than it will refuse to migrate. >> But >> after you specify this option it will refuse too. You need to create image >> file >> for the disk on the destination side. Only after that you can migrate. >> Unexpectedly existence of this file is enough to migrate without option too. >> In >> this case you will get a domain on the destination with disk image unrelated >> to >> source one and this is in case of live migration! Looks like a bug. Ok, >> imagine >> this is fixed so that migration of non-shared disk is only possible with >> actual coping disk to destination. What we get from this option? We get >> that you have to specify this option if you want to migrate a domain with >> non-shared disk like some forcing option. May be it is a good approach >> but it is incompatible with vz. Vz don't demand any user awareness of >> migration of non-shared disks. And this case incompatibility can not >> be easily resolved as for 'compressed' option as this option depends on >> classifying of shared/non-shared for disks which is done inside vz. >> vz: implement misc migration options >> >> Signed-off-by: Nikolay Shirokovskiy <nshirokovs...@virtuozzo.com> >> --- >> src/vz/vz_driver.c | 128 >> +++++++++++++++++++++++++++++++++++++++++++++++++++- >> src/vz/vz_sdk.c | 8 +++- >> src/vz/vz_sdk.h | 3 +- >> 3 files changed, 134 insertions(+), 5 deletions(-) >> >> diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c >> index dc26b09..b12592b 100644 >> --- a/src/vz/vz_driver.c >> +++ b/src/vz/vz_driver.c >> @@ -1465,7 +1465,120 @@ vzMakeVzUri(const char *connuri_str) >> return vzuri; >> } >> -#define VZ_MIGRATION_FLAGS (0) >> +virURIPtr >> +vzParseVzURI(const char *uri_str) >> +{ >> + virURIPtr uri = NULL; >> + int ret = -1; >> + >> + if (!(uri = virURIParse(uri_str))) >> + goto cleanup; >> + >> + if (uri->scheme == NULL || uri->server == NULL) { >> + virReportError(VIR_ERR_INVALID_ARG, >> + _("scheme and host are mandatory vz migration URI: >> %s"), >> + uri_str); >> + goto cleanup; >> + } >> + >> + if (uri->user != NULL || uri->path != NULL || >> + uri->query != NULL || uri->fragment != NULL) { >> + virReportError(VIR_ERR_INVALID_ARG, >> + _("only scheme, host and port are supported in " >> + "vz migration URI: %s"), uri_str); >> + goto cleanup; >> + } >> + >> + if (STRNEQ(uri->scheme, "tcp")) { >> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, >> + _("unsupported scheme %s in migration URI %s"), >> + uri->scheme, uri_str); >> + goto cleanup; >> + } >> + > > Try URI vz+ssh://hotname:22/system, there is some bug, prlsdk returns error > after migration: It is ok. Uri you pass with --migrateuri is hypervisor connection uri and port should be appropriate, not ssh one. > > 2015-08-25 15:36:18.923+0000: 92650: error : virDomainGetJobInfo:8889 : this > function is not supported by the connection driver: virDomainGetJobInfo > 2015-08-25 15:36:19.169+0000: 92649: error : prlsdkMigrate:4089 : internal > error: Unable to connect to the server "10.27.255.18". An invalid response > has been received from the server. Make sure that Parallels Server is running > on the server "10.27.255.18" and is up to date and try again. > >> + ret = 0; >> + >> + cleanup: >> + if (ret < 0) { >> + virURIFree(uri); >> + uri = NULL; >> + } >> + >> + return uri; >> +} >> + >> +#define VZ_MIGRATION_FLAGS \ >> + (VIR_MIGRATE_OFFLINE | \ >> + VIR_MIGRATE_LIVE | \ >> + VIR_MIGRATE_COMPRESSED | \ >> + VIR_MIGRATE_PERSIST_DEST | \ >> + VIR_MIGRATE_PAUSED) >> + >> +/* TODO this code should be in common place as these >> + rules follows from options (informal) definitions. >> + Qemu makes some of these checks on begin phase but not all. */ >> +int vzCheckOfflineFlags(int flags) >> +{ >> + if (!(flags & VIR_MIGRATE_OFFLINE)) { >> + virReportError(VIR_ERR_OPERATION_INVALID, >> + "%s", _("domain is not running")); >> + return -1; >> + } >> + >> + if (flags & VIR_MIGRATE_LIVE) { >> + virReportError(VIR_ERR_OPERATION_INVALID, "%s", >> + _("live offline migration does not " >> + "make sense")); >> + return -1; >> + } >> + >> + if (flags & VIR_MIGRATE_COMPRESSED) { >> + virReportError(VIR_ERR_OPERATION_INVALID, "%s", >> + _("compressed offline migration does not " >> + "make sense")); >> + return -1; >> + } >> + >> + if (flags & VIR_MIGRATE_PAUSED) { >> + virReportError(VIR_ERR_OPERATION_INVALID, "%s", >> + _("paused offline migration does not " >> + "make sense")); >> + return -1; >> + } >> + >> + return 0; >> +} >> + >> +int vzCheckCommonFlags(int flags) >> +{ >> + if (!(flags & VIR_MIGRATE_PERSIST_DEST)) { >> + virReportError(VIR_ERR_INVALID_ARG, "%s", >> + _("flags VIR_MIGRATE_PERSIST_DEST must be set" >> + " for vz migration")); >> + return -1; >> + } >> + >> + return 0; >> +} >> + >> +int vzCheckOnlineFlags(int flags) >> +{ >> + if (!(flags & VIR_MIGRATE_LIVE)) { >> + virReportError(VIR_ERR_INVALID_ARG, "%s", >> + _("flags VIR_MIGRATE_LIVE must be set" >> + " for online vz migration")); >> + return -1; >> + } >> + >> + if (!(flags & VIR_MIGRATE_COMPRESSED)) { >> + virReportError(VIR_ERR_INVALID_ARG, "%s", >> + _("flags VIR_MIGRATE_COMPRESSED must be set" >> + " for online vz migration")); >> + return -1; >> + } >> + >> + return 0; >> +} >> static int >> vzDomainMigratePerform3(virDomainPtr domain, >> @@ -1491,12 +1604,23 @@ vzDomainMigratePerform3(virDomainPtr domain, >> virCheckFlags(VZ_MIGRATION_FLAGS, -1); >> + if (vzCheckCommonFlags(flags)) >> + goto cleanup; >> + >> if (!(vzuri = vzMakeVzUri(uri))) >> goto cleanup; >> if (!(dom = vzDomObjFromDomain(domain))) >> goto cleanup; >> + if (virDomainObjIsActive(dom)) >> + ret = vzCheckOnlineFlags(flags); >> + else >> + ret = vzCheckOfflineFlags(flags); >> + >> + if (ret < 0) >> + goto cleanup; >> + >> dconn = virConnectOpen(uri); >> if (dconn == NULL) { >> virReportError(VIR_ERR_OPERATION_FAILED, >> @@ -1513,7 +1637,7 @@ vzDomainMigratePerform3(virDomainPtr domain, >> if (vzParseCookie(cookie, session_uuid) < 0) >> goto cleanup; >> - if (prlsdkMigrate(dom, vzuri, session_uuid, dname) < 0) >> + if (prlsdkMigrate(dom, vzuri, session_uuid, dname, flags) < 0) >> goto cleanup; >> virDomainObjListRemove(privconn->domains, dom); >> diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c >> index 89a2429..9a2b5df 100644 >> --- a/src/vz/vz_sdk.c >> +++ b/src/vz/vz_sdk.c >> @@ -4065,18 +4065,22 @@ prlsdkGetMemoryStats(virDomainObjPtr dom, >> int prlsdkMigrate(virDomainObjPtr dom, virURIPtr uri, >> const unsigned char *session_uuid, >> - const char *dname) >> + const char *dname, unsigned int flags) >> { >> int ret = -1; >> vzDomObjPtr privdom = dom->privateData; >> PRL_HANDLE job = PRL_INVALID_HANDLE; >> char uuidstr[VIR_UUID_STRING_BUFLEN + 2]; >> + PRL_UINT32 vzflags = PRLSDK_MIGRATION_FLAGS; >> + >> + if (flags & VIR_MIGRATE_PAUSED) >> + vzflags |= PVMT_DONT_RESUME_VM; >> prlsdkUUIDFormat(session_uuid, uuidstr); >> job = PrlVm_MigrateWithRenameEx(privdom->sdkdom, uri->server, >> uri->port, uuidstr, >> dname == NULL ? "" : dname, >> "", /* use default dir for migrated >> instance bundle */ >> - PRLSDK_MIGRATION_FLAGS, >> + vzflags, >> 0, /* reserved flags */ >> PRL_TRUE /* don't ask for >> confirmations */ >> ); >> diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h >> index 0aa70b3..5b26b70 100644 >> --- a/src/vz/vz_sdk.h >> +++ b/src/vz/vz_sdk.h >> @@ -80,4 +80,5 @@ int >> prlsdkMigrate(virDomainObjPtr dom, >> virURIPtr uri, >> const char unsigned *session_uuid, >> - const char *dname); >> + const char *dname, >> + unsigned int flags); >
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list