[libvirt] [PATCH 3/5] vz: implement managed migration
Nikolay Shirokovskiy
nshirokovskiy at virtuozzo.com
Thu May 19 11:12:06 UTC 2016
On 19.05.2016 13:38, Maxim Nestratov wrote:
> 18.05.2016 11:11, Nikolay Shirokovskiy пишет:
>
>> The newest version of migration protocol - version 3 with parameters is implemented.
>> Supported flags is VIR_MIGRATE_PAUSED only. Supported parameters are
>> VIR_MIGRATE_PARAM_URI and VIR_MIGRATE_PARAM_DEST_NAME. VIR_MIGRATE_PARAM_DEST_XML
>> is in VZ_MIGRATION_PARAMETERS for technical onyl reasons.
>>
>> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
>> ---
>> src/vz/vz_driver.c | 443 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>> src/vz/vz_sdk.c | 42 +++++
>> src/vz/vz_sdk.h | 6 +
>> 3 files changed, 491 insertions(+)
>>
...
>> +static int
>> +vzDomainMigratePrepare3Params(virConnectPtr conn,
>> + virTypedParameterPtr params,
>> + int nparams,
>> + const char *cookiein,
>> + int cookieinlen,
>> + char **cookieout,
>> + int *cookieoutlen,
>> + char **uri_out,
>> + unsigned int flags)
>> +{
>> + vzConnPtr privconn = conn->privateData;
>> + const char *miguri = NULL;
>> + const char *dname = NULL;
>> + virDomainObjPtr dom = NULL;
>> + vzMigrationCookiePtr mig = NULL;
>> + int ret = -1;
>> +
>> + virCheckFlags(VZ_MIGRATION_FLAGS, -1);
>> +
>> + if (virTypedParamsValidate(params, nparams, VZ_MIGRATION_PARAMETERS) < 0)
>> + goto cleanup;
>> +
>> + if (virTypedParamsGetString(params, nparams,
>> + VIR_MIGRATE_PARAM_URI, &miguri) < 0 ||
>> + virTypedParamsGetString(params, nparams,
>> + VIR_MIGRATE_PARAM_DEST_NAME, &dname) < 0)
>> + goto cleanup;
>> +
>> + /* We must set uri_out if miguri is not set. This is direct
>> + * managed migration requirement */
>> + if (!miguri && !(*uri_out = vzMigrationCreateURI()))
>> + goto cleanup;
>> +
>> + if (!(mig = vzEatCookie(cookiein, cookieinlen)))
>> + goto cleanup;
>> +
>> + memcpy(mig->session_uuid, privconn->driver->session_uuid, VIR_UUID_BUFLEN);
>> +
>> + if (vzBakeCookie(mig, cookieout, cookieoutlen) < 0)
>> + goto cleanup;
>> +
>> + if (!(dom = vzNewDomain(privconn->driver,
>> + dname ? dname : mig->name, mig->uuid)))
>> + goto cleanup;
>
> Just realized that since virDomainObjListAdd returns a valid and existing domain if its name and uuid is the same this call can cause some problems.
> For instance, if a user specified the same source and destination uri, the migration will fail and Finish code will remove the domain from list.
> Thus what about the following chunk instead existing?:
>
> virObjectLock(privconn->driver);
> dom = virDomainObjListFindByUUID(privconn->driver->domains, mig->uuid);
> if (dom) {
> char uuidstr[VIR_UUID_STRING_BUFLEN];
> virUUIDFormat(mig->uuid, uuidstr);
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("A domain with uuid '%s' already exists"),
> uuidstr);
> goto unlock;
> }
>
> if (!(dom = vzNewDomain(privconn->driver,
> dname ? dname : mig->name, mig->uuid)))
> goto unlock;
>
> ret = 0;
>
> unlock:
> virObjectUnlock(privconn->driver);
>
Looks reasonable.
>> +
>> + ret = 0;
>> +
>> + cleanup:
>> + vzMigrationCookieFree(mig);
>> + if (dom)
>> + virObjectUnlock(dom);
>> + return ret;
>> +}
>> +
More information about the libvir-list
mailing list