Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
35461438
L
libvirt
项目概览
openeuler
/
libvirt
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
libvirt
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
35461438
编写于
6月 25, 2013
作者:
J
Jiri Denemark
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement extensible migration APIs in qemu driver
上级
1004d632
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
417 addition
and
56 deletion
+417
-56
src/qemu/qemu_driver.c
src/qemu/qemu_driver.c
+289
-13
src/qemu/qemu_migration.c
src/qemu/qemu_migration.c
+119
-43
src/qemu/qemu_migration.h
src/qemu/qemu_migration.h
+9
-0
未找到文件。
src/qemu/qemu_driver.c
浏览文件 @
35461438
...
@@ -1095,6 +1095,7 @@ qemuConnectSupportsFeature(virConnectPtr conn, int feature)
...
@@ -1095,6 +1095,7 @@ qemuConnectSupportsFeature(virConnectPtr conn, int feature)
case
VIR_DRV_FEATURE_TYPED_PARAM_STRING
:
case
VIR_DRV_FEATURE_TYPED_PARAM_STRING
:
case
VIR_DRV_FEATURE_XML_MIGRATABLE
:
case
VIR_DRV_FEATURE_XML_MIGRATABLE
:
case
VIR_DRV_FEATURE_MIGRATION_OFFLINE
:
case
VIR_DRV_FEATURE_MIGRATION_OFFLINE
:
case
VIR_DRV_FEATURE_MIGRATION_PARAMS
:
return
1
;
return
1
;
default:
default:
return
0
;
return
0
;
...
@@ -10173,6 +10174,43 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
...
@@ -10173,6 +10174,43 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
cookieout
,
cookieoutlen
,
flags
);
cookieout
,
cookieoutlen
,
flags
);
}
}
static
char
*
qemuDomainMigrateBegin3Params
(
virDomainPtr
domain
,
virTypedParameterPtr
params
,
int
nparams
,
char
**
cookieout
,
int
*
cookieoutlen
,
unsigned
int
flags
)
{
const
char
*
xmlin
=
NULL
;
const
char
*
dname
=
NULL
;
virDomainObjPtr
vm
;
virCheckFlags
(
QEMU_MIGRATION_FLAGS
,
NULL
);
if
(
virTypedParamsValidate
(
params
,
nparams
,
QEMU_MIGRATION_PARAMETERS
)
<
0
)
return
NULL
;
if
(
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_XML
,
&
xmlin
)
<
0
||
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_NAME
,
&
dname
)
<
0
)
return
NULL
;
if
(
!
(
vm
=
qemuDomObjFromDomain
(
domain
)))
return
NULL
;
if
(
virDomainMigrateBegin3ParamsEnsureACL
(
domain
->
conn
,
vm
->
def
)
<
0
)
{
virObjectUnlock
(
vm
);
return
NULL
;
}
return
qemuMigrationBegin
(
domain
->
conn
,
vm
,
xmlin
,
dname
,
cookieout
,
cookieoutlen
,
flags
);
}
static
int
static
int
qemuDomainMigratePrepare3
(
virConnectPtr
dconn
,
qemuDomainMigratePrepare3
(
virConnectPtr
dconn
,
const
char
*
cookiein
,
const
char
*
cookiein
,
...
@@ -10219,6 +10257,66 @@ cleanup:
...
@@ -10219,6 +10257,66 @@ cleanup:
return
ret
;
return
ret
;
}
}
static
int
qemuDomainMigratePrepare3Params
(
virConnectPtr
dconn
,
virTypedParameterPtr
params
,
int
nparams
,
const
char
*
cookiein
,
int
cookieinlen
,
char
**
cookieout
,
int
*
cookieoutlen
,
char
**
uri_out
,
unsigned
int
flags
)
{
virQEMUDriverPtr
driver
=
dconn
->
privateData
;
virDomainDefPtr
def
=
NULL
;
const
char
*
dom_xml
=
NULL
;
const
char
*
dname
=
NULL
;
const
char
*
uri_in
=
NULL
;
int
ret
=
-
1
;
virCheckFlags
(
QEMU_MIGRATION_FLAGS
,
-
1
);
if
(
virTypedParamsValidate
(
params
,
nparams
,
QEMU_MIGRATION_PARAMETERS
)
<
0
)
return
-
1
;
if
(
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_XML
,
&
dom_xml
)
<
0
||
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_NAME
,
&
dname
)
<
0
||
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_URI
,
&
uri_in
)
<
0
)
return
-
1
;
if
(
flags
&
VIR_MIGRATE_TUNNELLED
)
{
/* this is a logical error; we never should have gotten here with
* VIR_MIGRATE_TUNNELLED set
*/
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
_
(
"Tunnelled migration requested but invalid "
"RPC method called"
));
goto
cleanup
;
}
if
(
!
(
def
=
qemuMigrationPrepareDef
(
driver
,
dom_xml
,
dname
)))
goto
cleanup
;
if
(
virDomainMigratePrepare3ParamsEnsureACL
(
dconn
,
def
)
<
0
)
goto
cleanup
;
ret
=
qemuMigrationPrepareDirect
(
driver
,
dconn
,
cookiein
,
cookieinlen
,
cookieout
,
cookieoutlen
,
uri_in
,
uri_out
,
&
def
,
flags
);
cleanup:
virDomainDefFree
(
def
);
return
ret
;
}
static
int
static
int
qemuDomainMigratePrepareTunnel3
(
virConnectPtr
dconn
,
qemuDomainMigratePrepareTunnel3
(
virConnectPtr
dconn
,
...
@@ -10260,6 +10358,57 @@ cleanup:
...
@@ -10260,6 +10358,57 @@ cleanup:
return
ret
;
return
ret
;
}
}
static
int
qemuDomainMigratePrepareTunnel3Params
(
virConnectPtr
dconn
,
virStreamPtr
st
,
virTypedParameterPtr
params
,
int
nparams
,
const
char
*
cookiein
,
int
cookieinlen
,
char
**
cookieout
,
int
*
cookieoutlen
,
unsigned
int
flags
)
{
virQEMUDriverPtr
driver
=
dconn
->
privateData
;
virDomainDefPtr
def
=
NULL
;
const
char
*
dom_xml
=
NULL
;
const
char
*
dname
=
NULL
;
int
ret
=
-
1
;
virCheckFlags
(
QEMU_MIGRATION_FLAGS
,
-
1
);
if
(
virTypedParamsValidate
(
params
,
nparams
,
QEMU_MIGRATION_PARAMETERS
)
<
0
)
return
-
1
;
if
(
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_XML
,
&
dom_xml
)
<
0
||
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_NAME
,
&
dname
)
<
0
)
return
-
1
;
if
(
!
(
flags
&
VIR_MIGRATE_TUNNELLED
))
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
_
(
"PrepareTunnel called but no TUNNELLED flag set"
));
goto
cleanup
;
}
if
(
!
(
def
=
qemuMigrationPrepareDef
(
driver
,
dom_xml
,
dname
)))
goto
cleanup
;
if
(
virDomainMigratePrepareTunnel3ParamsEnsureACL
(
dconn
,
def
)
<
0
)
goto
cleanup
;
ret
=
qemuMigrationPrepareTunnel
(
driver
,
dconn
,
cookiein
,
cookieinlen
,
cookieout
,
cookieoutlen
,
st
,
&
def
,
flags
);
cleanup:
virDomainDefFree
(
def
);
return
ret
;
}
static
int
static
int
qemuDomainMigratePerform3
(
virDomainPtr
dom
,
qemuDomainMigratePerform3
(
virDomainPtr
dom
,
...
@@ -10293,6 +10442,56 @@ qemuDomainMigratePerform3(virDomainPtr dom,
...
@@ -10293,6 +10442,56 @@ qemuDomainMigratePerform3(virDomainPtr dom,
flags
,
dname
,
resource
,
true
);
flags
,
dname
,
resource
,
true
);
}
}
static
int
qemuDomainMigratePerform3Params
(
virDomainPtr
dom
,
const
char
*
dconnuri
,
virTypedParameterPtr
params
,
int
nparams
,
const
char
*
cookiein
,
int
cookieinlen
,
char
**
cookieout
,
int
*
cookieoutlen
,
unsigned
int
flags
)
{
virQEMUDriverPtr
driver
=
dom
->
conn
->
privateData
;
virDomainObjPtr
vm
;
const
char
*
dom_xml
=
NULL
;
const
char
*
dname
=
NULL
;
const
char
*
uri
=
NULL
;
unsigned
long
long
bandwidth
=
0
;
virCheckFlags
(
QEMU_MIGRATION_FLAGS
,
-
1
);
if
(
virTypedParamsValidate
(
params
,
nparams
,
QEMU_MIGRATION_PARAMETERS
)
<
0
)
return
-
1
;
if
(
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_XML
,
&
dom_xml
)
<
0
||
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_NAME
,
&
dname
)
<
0
||
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_URI
,
&
uri
)
<
0
||
virTypedParamsGetULLong
(
params
,
nparams
,
VIR_MIGRATE_PARAM_BANDWIDTH
,
&
bandwidth
)
<
0
)
return
-
1
;
if
(
!
(
vm
=
qemuDomObjFromDomain
(
dom
)))
return
-
1
;
if
(
virDomainMigratePerform3ParamsEnsureACL
(
dom
->
conn
,
vm
->
def
)
<
0
)
{
virObjectUnlock
(
vm
);
return
-
1
;
}
return
qemuMigrationPerform
(
driver
,
dom
->
conn
,
vm
,
dom_xml
,
dconnuri
,
uri
,
cookiein
,
cookieinlen
,
cookieout
,
cookieoutlen
,
flags
,
dname
,
bandwidth
,
true
);
}
static
virDomainPtr
static
virDomainPtr
qemuDomainMigrateFinish3
(
virConnectPtr
dconn
,
qemuDomainMigrateFinish3
(
virConnectPtr
dconn
,
...
@@ -10308,29 +10507,72 @@ qemuDomainMigrateFinish3(virConnectPtr dconn,
...
@@ -10308,29 +10507,72 @@ qemuDomainMigrateFinish3(virConnectPtr dconn,
{
{
virQEMUDriverPtr
driver
=
dconn
->
privateData
;
virQEMUDriverPtr
driver
=
dconn
->
privateData
;
virDomainObjPtr
vm
;
virDomainObjPtr
vm
;
virDomainPtr
dom
=
NULL
;
virCheckFlags
(
QEMU_MIGRATION_FLAGS
,
NULL
);
virCheckFlags
(
QEMU_MIGRATION_FLAGS
,
NULL
);
vm
=
virDomainObjListFindByName
(
driver
->
domains
,
dname
);
if
(
!
dname
||
if
(
!
vm
)
{
!
(
vm
=
virDomainObjListFindByName
(
driver
->
domains
,
dname
))
)
{
virReportError
(
VIR_ERR_NO_DOMAIN
,
virReportError
(
VIR_ERR_NO_DOMAIN
,
_
(
"no domain with matching name '%s'"
),
dname
);
_
(
"no domain with matching name '%s'"
),
goto
cleanup
;
NULLSTR
(
dname
));
return
NULL
;
}
}
if
(
virDomainMigrateFinish3EnsureACL
(
dconn
,
vm
->
def
)
<
0
)
if
(
virDomainMigrateFinish3EnsureACL
(
dconn
,
vm
->
def
)
<
0
)
{
goto
cleanup
;
virObjectUnlock
(
vm
);
return
NULL
;
}
dom
=
qemuMigrationFinish
(
driver
,
dconn
,
vm
,
return
qemuMigrationFinish
(
driver
,
dconn
,
vm
,
cookiein
,
cookieinlen
,
cookiein
,
cookieinlen
,
cookieout
,
cookieoutlen
,
cookieout
,
cookieoutlen
,
flags
,
cancelled
,
true
);
flags
,
cancelled
,
true
);
}
cleanup:
static
virDomainPtr
return
dom
;
qemuDomainMigrateFinish3Params
(
virConnectPtr
dconn
,
virTypedParameterPtr
params
,
int
nparams
,
const
char
*
cookiein
,
int
cookieinlen
,
char
**
cookieout
,
int
*
cookieoutlen
,
unsigned
int
flags
,
int
cancelled
)
{
virQEMUDriverPtr
driver
=
dconn
->
privateData
;
virDomainObjPtr
vm
;
const
char
*
dname
=
NULL
;
virCheckFlags
(
QEMU_MIGRATION_FLAGS
,
NULL
);
if
(
virTypedParamsValidate
(
params
,
nparams
,
QEMU_MIGRATION_PARAMETERS
)
<
0
)
return
NULL
;
if
(
virTypedParamsGetString
(
params
,
nparams
,
VIR_MIGRATE_PARAM_DEST_NAME
,
&
dname
)
<
0
)
return
NULL
;
if
(
!
dname
||
!
(
vm
=
virDomainObjListFindByName
(
driver
->
domains
,
dname
)))
{
virReportError
(
VIR_ERR_NO_DOMAIN
,
_
(
"no domain with matching name '%s'"
),
NULLSTR
(
dname
));
return
NULL
;
}
if
(
virDomainMigrateFinish3ParamsEnsureACL
(
dconn
,
vm
->
def
)
<
0
)
{
virObjectUnlock
(
vm
);
return
NULL
;
}
return
qemuMigrationFinish
(
driver
,
dconn
,
vm
,
cookiein
,
cookieinlen
,
cookieout
,
cookieoutlen
,
flags
,
cancelled
,
true
);
}
}
static
int
static
int
qemuDomainMigrateConfirm3
(
virDomainPtr
domain
,
qemuDomainMigrateConfirm3
(
virDomainPtr
domain
,
const
char
*
cookiein
,
const
char
*
cookiein
,
...
@@ -10354,6 +10596,34 @@ qemuDomainMigrateConfirm3(virDomainPtr domain,
...
@@ -10354,6 +10596,34 @@ qemuDomainMigrateConfirm3(virDomainPtr domain,
flags
,
cancelled
);
flags
,
cancelled
);
}
}
static
int
qemuDomainMigrateConfirm3Params
(
virDomainPtr
domain
,
virTypedParameterPtr
params
,
int
nparams
,
const
char
*
cookiein
,
int
cookieinlen
,
unsigned
int
flags
,
int
cancelled
)
{
virDomainObjPtr
vm
;
virCheckFlags
(
QEMU_MIGRATION_FLAGS
,
-
1
);
if
(
virTypedParamsValidate
(
params
,
nparams
,
QEMU_MIGRATION_PARAMETERS
)
<
0
)
return
-
1
;
if
(
!
(
vm
=
qemuDomObjFromDomain
(
domain
)))
return
-
1
;
if
(
virDomainMigrateConfirm3ParamsEnsureACL
(
domain
->
conn
,
vm
->
def
)
<
0
)
{
virObjectUnlock
(
vm
);
return
-
1
;
}
return
qemuMigrationConfirm
(
domain
->
conn
,
vm
,
cookiein
,
cookieinlen
,
flags
,
cancelled
);
}
static
int
static
int
qemuNodeDeviceGetPciInfo
(
virNodeDeviceDefPtr
def
,
qemuNodeDeviceGetPciInfo
(
virNodeDeviceDefPtr
def
,
...
@@ -15776,6 +16046,12 @@ static virDriver qemuDriver = {
...
@@ -15776,6 +16046,12 @@ static virDriver qemuDriver = {
.
nodeGetCPUMap
=
qemuNodeGetCPUMap
,
/* 1.0.0 */
.
nodeGetCPUMap
=
qemuNodeGetCPUMap
,
/* 1.0.0 */
.
domainFSTrim
=
qemuDomainFSTrim
,
/* 1.0.1 */
.
domainFSTrim
=
qemuDomainFSTrim
,
/* 1.0.1 */
.
domainOpenChannel
=
qemuDomainOpenChannel
,
/* 1.0.2 */
.
domainOpenChannel
=
qemuDomainOpenChannel
,
/* 1.0.2 */
.
domainMigrateBegin3Params
=
qemuDomainMigrateBegin3Params
,
/* 1.1.0 */
.
domainMigratePrepare3Params
=
qemuDomainMigratePrepare3Params
,
/* 1.1.0 */
.
domainMigratePrepareTunnel3Params
=
qemuDomainMigratePrepareTunnel3Params
,
/* 1.1.0 */
.
domainMigratePerform3Params
=
qemuDomainMigratePerform3Params
,
/* 1.1.0 */
.
domainMigrateFinish3Params
=
qemuDomainMigrateFinish3Params
,
/* 1.1.0 */
.
domainMigrateConfirm3Params
=
qemuDomainMigrateConfirm3Params
,
/* 1.1.0 */
};
};
...
...
src/qemu/qemu_migration.c
浏览文件 @
35461438
...
@@ -56,6 +56,7 @@
...
@@ -56,6 +56,7 @@
#include "viruri.h"
#include "viruri.h"
#include "virhook.h"
#include "virhook.h"
#include "virstring.h"
#include "virstring.h"
#include "virtypedparam.h"
#define VIR_FROM_THIS VIR_FROM_QEMU
#define VIR_FROM_THIS VIR_FROM_QEMU
...
@@ -3564,16 +3565,18 @@ cleanup:
...
@@ -3564,16 +3565,18 @@ cleanup:
* from libvirt.c, but running in source libvirtd context,
* from libvirt.c, but running in source libvirtd context,
* instead of client app context & also adding in tunnel
* instead of client app context & also adding in tunnel
* handling */
* handling */
static
int
doPeer2PeerMigrate3
(
virQEMUDriverPtr
driver
,
static
int
virConnectPtr
sconn
,
doPeer2PeerMigrate3
(
virQEMUDriverPtr
driver
,
virConnectPtr
dconn
,
virConnectPtr
sconn
,
virDomainObjPtr
vm
,
virConnectPtr
dconn
,
const
char
*
xmlin
,
const
char
*
dconnuri
,
const
char
*
dconnuri
,
virDomainObjPtr
vm
,
const
char
*
uri
,
const
char
*
xmlin
,
unsigned
long
flags
,
const
char
*
dname
,
const
char
*
dname
,
const
char
*
uri
,
unsigned
long
resource
)
unsigned
long
long
bandwidth
,
bool
useParams
,
unsigned
long
flags
)
{
{
virDomainPtr
ddomain
=
NULL
;
virDomainPtr
ddomain
=
NULL
;
char
*
uri_out
=
NULL
;
char
*
uri_out
=
NULL
;
...
@@ -3584,15 +3587,18 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
...
@@ -3584,15 +3587,18 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
int
cookieoutlen
=
0
;
int
cookieoutlen
=
0
;
int
ret
=
-
1
;
int
ret
=
-
1
;
virErrorPtr
orig_err
=
NULL
;
virErrorPtr
orig_err
=
NULL
;
bool
cancelled
;
bool
cancelled
=
true
;
virStreamPtr
st
=
NULL
;
virStreamPtr
st
=
NULL
;
unsigned
int
destflags
=
flags
&
~
VIR_MIGRATE_ABORT_ON_ERROR
;
unsigned
int
destflags
=
flags
&
~
VIR_MIGRATE_ABORT_ON_ERROR
;
VIR_DEBUG
(
"driver=%p, sconn=%p, dconn=%p, vm=%p, xmlin=%s, "
virTypedParameterPtr
params
=
NULL
;
"dconnuri=%s, uri=%s, flags=%lx, dname=%s, resource=%lu"
,
int
nparams
=
0
;
driver
,
sconn
,
dconn
,
vm
,
NULLSTR
(
xmlin
),
int
maxparams
=
0
;
NULLSTR
(
dconnuri
),
NULLSTR
(
uri
),
flags
,
NULLSTR
(
dname
),
resource
);
VIR_DEBUG
(
"driver=%p, sconn=%p, dconn=%p, dconnuri=%s, vm=%p, xmlin=%s, "
"dname=%s, uri=%s, bandwidth=%llu, useParams=%d, flags=%lx"
,
driver
,
sconn
,
dconn
,
NULLSTR
(
dconnuri
),
vm
,
NULLSTR
(
xmlin
),
NULLSTR
(
dname
),
NULLSTR
(
uri
),
bandwidth
,
useParams
,
flags
);
/* Unlike the virDomainMigrateVersion3 counterpart, we don't need
/* Unlike the virDomainMigrateVersion3 counterpart, we don't need
* to worry about auto-setting the VIR_MIGRATE_CHANGE_PROTECTION
* to worry about auto-setting the VIR_MIGRATE_CHANGE_PROTECTION
...
@@ -3604,6 +3610,28 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
...
@@ -3604,6 +3610,28 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
if
(
!
dom_xml
)
if
(
!
dom_xml
)
goto
cleanup
;
goto
cleanup
;
if
(
useParams
)
{
if
(
virTypedParamsAddString
(
&
params
,
&
nparams
,
&
maxparams
,
VIR_MIGRATE_PARAM_DEST_XML
,
dom_xml
)
<
0
)
goto
cleanup
;
if
(
dname
&&
virTypedParamsAddString
(
&
params
,
&
nparams
,
&
maxparams
,
VIR_MIGRATE_PARAM_DEST_NAME
,
dname
)
<
0
)
goto
cleanup
;
if
(
uri
&&
virTypedParamsAddString
(
&
params
,
&
nparams
,
&
maxparams
,
VIR_MIGRATE_PARAM_URI
,
uri
)
<
0
)
goto
cleanup
;
if
(
bandwidth
&&
virTypedParamsAddULLong
(
&
params
,
&
nparams
,
&
maxparams
,
VIR_MIGRATE_PARAM_BANDWIDTH
,
bandwidth
)
<
0
)
goto
cleanup
;
}
if
(
virDomainObjGetState
(
vm
,
NULL
)
==
VIR_DOMAIN_PAUSED
)
if
(
virDomainObjGetState
(
vm
,
NULL
)
==
VIR_DOMAIN_PAUSED
)
flags
|=
VIR_MIGRATE_PAUSED
;
flags
|=
VIR_MIGRATE_PAUSED
;
...
@@ -3617,16 +3645,27 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
...
@@ -3617,16 +3645,27 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
goto
cleanup
;
goto
cleanup
;
qemuDomainObjEnterRemote
(
vm
);
qemuDomainObjEnterRemote
(
vm
);
ret
=
dconn
->
driver
->
domainMigratePrepareTunnel3
if
(
useParams
)
{
(
dconn
,
st
,
cookiein
,
cookieinlen
,
ret
=
dconn
->
driver
->
domainMigratePrepareTunnel3Params
&
cookieout
,
&
cookieoutlen
,
(
dconn
,
st
,
params
,
nparams
,
cookiein
,
cookieinlen
,
destflags
,
dname
,
resource
,
dom_xml
);
&
cookieout
,
&
cookieoutlen
,
destflags
);
}
else
{
ret
=
dconn
->
driver
->
domainMigratePrepareTunnel3
(
dconn
,
st
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
destflags
,
dname
,
bandwidth
,
dom_xml
);
}
qemuDomainObjExitRemote
(
vm
);
qemuDomainObjExitRemote
(
vm
);
}
else
{
}
else
{
qemuDomainObjEnterRemote
(
vm
);
qemuDomainObjEnterRemote
(
vm
);
ret
=
dconn
->
driver
->
domainMigratePrepare3
if
(
useParams
)
{
(
dconn
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
ret
=
dconn
->
driver
->
domainMigratePrepare3Params
uri
,
&
uri_out
,
destflags
,
dname
,
resource
,
dom_xml
);
(
dconn
,
params
,
nparams
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
&
uri_out
,
destflags
);
}
else
{
ret
=
dconn
->
driver
->
domainMigratePrepare3
(
dconn
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
uri
,
&
uri_out
,
destflags
,
dname
,
bandwidth
,
dom_xml
);
}
qemuDomainObjExitRemote
(
vm
);
qemuDomainObjExitRemote
(
vm
);
}
}
VIR_FREE
(
dom_xml
);
VIR_FREE
(
dom_xml
);
...
@@ -3641,11 +3680,15 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
...
@@ -3641,11 +3680,15 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
goto
finish
;
goto
finish
;
}
}
if
(
!
(
flags
&
VIR_MIGRATE_TUNNELLED
)
&&
if
(
uri_out
)
{
(
uri_out
==
NULL
))
{
uri
=
uri_out
;
if
(
useParams
&&
virTypedParamsReplaceString
(
&
params
,
&
nparams
,
VIR_MIGRATE_PARAM_URI
,
uri_out
)
<
0
)
goto
finish
;
}
else
if
(
!
uri
&&
!
(
flags
&
VIR_MIGRATE_TUNNELLED
))
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
_
(
"domainMigratePrepare3 did not set uri"
));
_
(
"domainMigratePrepare3 did not set uri"
));
cancelled
=
true
;
goto
finish
;
goto
finish
;
}
}
...
@@ -3654,23 +3697,24 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
...
@@ -3654,23 +3697,24 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
* running, but in paused state until the destination can
* running, but in paused state until the destination can
* confirm migration completion.
* confirm migration completion.
*/
*/
VIR_DEBUG
(
"Perform3 %p uri=%s
uri_out=%s"
,
sconn
,
uri
,
uri_out
);
VIR_DEBUG
(
"Perform3 %p uri=%s
"
,
sconn
,
NULLSTR
(
uri
)
);
qemuMigrationJobSetPhase
(
driver
,
vm
,
QEMU_MIGRATION_PHASE_PERFORM3
);
qemuMigrationJobSetPhase
(
driver
,
vm
,
QEMU_MIGRATION_PHASE_PERFORM3
);
VIR_FREE
(
cookiein
);
VIR_FREE
(
cookiein
);
cookiein
=
cookieout
;
cookiein
=
cookieout
;
cookieinlen
=
cookieoutlen
;
cookieinlen
=
cookieoutlen
;
cookieout
=
NULL
;
cookieout
=
NULL
;
cookieoutlen
=
0
;
cookieoutlen
=
0
;
if
(
flags
&
VIR_MIGRATE_TUNNELLED
)
if
(
flags
&
VIR_MIGRATE_TUNNELLED
)
{
ret
=
doTunnelMigrate
(
driver
,
vm
,
st
,
ret
=
doTunnelMigrate
(
driver
,
vm
,
st
,
cookiein
,
cookieinlen
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
&
cookieout
,
&
cookieoutlen
,
flags
,
resource
,
dconn
);
flags
,
bandwidth
,
dconn
);
else
}
else
{
ret
=
doNativeMigrate
(
driver
,
vm
,
uri
_out
,
ret
=
doNativeMigrate
(
driver
,
vm
,
uri
,
cookiein
,
cookieinlen
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
&
cookieout
,
&
cookieoutlen
,
flags
,
resource
,
dconn
);
flags
,
bandwidth
,
dconn
);
}
/* Perform failed. Make sure Finish doesn't overwrite the error */
/* Perform failed. Make sure Finish doesn't overwrite the error */
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
...
@@ -3698,12 +3742,29 @@ finish:
...
@@ -3698,12 +3742,29 @@ finish:
cookieinlen
=
cookieoutlen
;
cookieinlen
=
cookieoutlen
;
cookieout
=
NULL
;
cookieout
=
NULL
;
cookieoutlen
=
0
;
cookieoutlen
=
0
;
dname
=
dname
?
dname
:
vm
->
def
->
name
;
qemuDomainObjEnterRemote
(
vm
);
if
(
useParams
)
{
ddomain
=
dconn
->
driver
->
domainMigrateFinish3
if
(
virTypedParamsGetString
(
params
,
nparams
,
(
dconn
,
dname
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
VIR_MIGRATE_PARAM_DEST_NAME
,
NULL
)
<=
0
&&
dconnuri
,
uri_out
?
uri_out
:
uri
,
destflags
,
cancelled
);
virTypedParamsReplaceString
(
&
params
,
&
nparams
,
qemuDomainObjExitRemote
(
vm
);
VIR_MIGRATE_PARAM_DEST_NAME
,
vm
->
def
->
name
)
<
0
)
{
ddomain
=
NULL
;
}
else
{
qemuDomainObjEnterRemote
(
vm
);
ddomain
=
dconn
->
driver
->
domainMigrateFinish3Params
(
dconn
,
params
,
nparams
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
destflags
,
cancelled
);
qemuDomainObjExitRemote
(
vm
);
}
}
else
{
dname
=
dname
?
dname
:
vm
->
def
->
name
;
qemuDomainObjEnterRemote
(
vm
);
ddomain
=
dconn
->
driver
->
domainMigrateFinish3
(
dconn
,
dname
,
cookiein
,
cookieinlen
,
&
cookieout
,
&
cookieoutlen
,
dconnuri
,
uri
,
destflags
,
cancelled
);
qemuDomainObjExitRemote
(
vm
);
}
/* If ddomain is NULL, then we were unable to start
/* If ddomain is NULL, then we were unable to start
* the guest on the target, and must restart on the
* the guest on the target, and must restart on the
...
@@ -3759,7 +3820,7 @@ finish:
...
@@ -3759,7 +3820,7 @@ finish:
VIR_FREE
(
uri_out
);
VIR_FREE
(
uri_out
);
VIR_FREE
(
cookiein
);
VIR_FREE
(
cookiein
);
VIR_FREE
(
cookieout
);
VIR_FREE
(
cookieout
);
virTypedParamsFree
(
params
,
nparams
);
return
ret
;
return
ret
;
}
}
...
@@ -3781,6 +3842,7 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
...
@@ -3781,6 +3842,7 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
virErrorPtr
orig_err
=
NULL
;
virErrorPtr
orig_err
=
NULL
;
bool
offline
=
false
;
bool
offline
=
false
;
virQEMUDriverConfigPtr
cfg
=
virQEMUDriverGetConfig
(
driver
);
virQEMUDriverConfigPtr
cfg
=
virQEMUDriverGetConfig
(
driver
);
bool
useParams
;
VIR_DEBUG
(
"driver=%p, sconn=%p, vm=%p, xmlin=%s, dconnuri=%s, "
VIR_DEBUG
(
"driver=%p, sconn=%p, vm=%p, xmlin=%s, dconnuri=%s, "
"uri=%s, flags=%lx, dname=%s, resource=%lu"
,
"uri=%s, flags=%lx, dname=%s, resource=%lu"
,
...
@@ -3815,6 +3877,8 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
...
@@ -3815,6 +3877,8 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
*/
*/
*
v3proto
=
VIR_DRV_SUPPORTS_FEATURE
(
dconn
->
driver
,
dconn
,
*
v3proto
=
VIR_DRV_SUPPORTS_FEATURE
(
dconn
->
driver
,
dconn
,
VIR_DRV_FEATURE_MIGRATION_V3
);
VIR_DRV_FEATURE_MIGRATION_V3
);
useParams
=
VIR_DRV_SUPPORTS_FEATURE
(
dconn
->
driver
,
dconn
,
VIR_DRV_FEATURE_MIGRATION_PARAMS
);
if
(
flags
&
VIR_MIGRATE_OFFLINE
)
if
(
flags
&
VIR_MIGRATE_OFFLINE
)
offline
=
VIR_DRV_SUPPORTS_FEATURE
(
dconn
->
driver
,
dconn
,
offline
=
VIR_DRV_SUPPORTS_FEATURE
(
dconn
->
driver
,
dconn
,
VIR_DRV_FEATURE_MIGRATION_OFFLINE
);
VIR_DRV_FEATURE_MIGRATION_OFFLINE
);
...
@@ -3826,6 +3890,17 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
...
@@ -3826,6 +3890,17 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
goto
cleanup
;
goto
cleanup
;
}
}
/* Only xmlin, dname, uri, and bandwidth parameters can be used with
* old-style APIs. */
#if 0
if (!useParams && /* any new parameter */) {
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
_("Migration APIs with extensible parameters are not "
"supported but extended parameters were passed"));
goto cleanup;
}
#endif
if
(
flags
&
VIR_MIGRATE_OFFLINE
&&
!
offline
)
{
if
(
flags
&
VIR_MIGRATE_OFFLINE
&&
!
offline
)
{
virReportError
(
VIR_ERR_ARGUMENT_UNSUPPORTED
,
"%s"
,
virReportError
(
VIR_ERR_ARGUMENT_UNSUPPORTED
,
"%s"
,
_
(
"offline migration is not supported by "
_
(
"offline migration is not supported by "
...
@@ -3847,12 +3922,13 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
...
@@ -3847,12 +3922,13 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
* Therefore it is safe to clear the bit here. */
* Therefore it is safe to clear the bit here. */
flags
&=
~
VIR_MIGRATE_CHANGE_PROTECTION
;
flags
&=
~
VIR_MIGRATE_CHANGE_PROTECTION
;
if
(
*
v3proto
)
if
(
*
v3proto
)
{
ret
=
doPeer2PeerMigrate3
(
driver
,
sconn
,
dconn
,
vm
,
xmlin
,
ret
=
doPeer2PeerMigrate3
(
driver
,
sconn
,
dconn
,
dconnuri
,
vm
,
xmlin
,
d
connuri
,
uri
,
flags
,
dname
,
resource
);
d
name
,
uri
,
resource
,
useParams
,
flags
);
else
}
else
{
ret
=
doPeer2PeerMigrate2
(
driver
,
sconn
,
dconn
,
vm
,
ret
=
doPeer2PeerMigrate2
(
driver
,
sconn
,
dconn
,
vm
,
dconnuri
,
flags
,
dname
,
resource
);
dconnuri
,
flags
,
dname
,
resource
);
}
cleanup:
cleanup:
orig_err
=
virSaveLastError
();
orig_err
=
virSaveLastError
();
...
...
src/qemu/qemu_migration.h
浏览文件 @
35461438
...
@@ -41,6 +41,15 @@
...
@@ -41,6 +41,15 @@
VIR_MIGRATE_COMPRESSED | \
VIR_MIGRATE_COMPRESSED | \
VIR_MIGRATE_ABORT_ON_ERROR)
VIR_MIGRATE_ABORT_ON_ERROR)
/* All supported migration parameters and their types. */
# define QEMU_MIGRATION_PARAMETERS \
VIR_MIGRATE_PARAM_URI, VIR_TYPED_PARAM_STRING, \
VIR_MIGRATE_PARAM_DEST_NAME, VIR_TYPED_PARAM_STRING, \
VIR_MIGRATE_PARAM_DEST_XML, VIR_TYPED_PARAM_STRING, \
VIR_MIGRATE_PARAM_BANDWIDTH, VIR_TYPED_PARAM_ULLONG, \
NULL
enum
qemuMigrationJobPhase
{
enum
qemuMigrationJobPhase
{
QEMU_MIGRATION_PHASE_NONE
=
0
,
QEMU_MIGRATION_PHASE_NONE
=
0
,
QEMU_MIGRATION_PHASE_PERFORM2
,
QEMU_MIGRATION_PHASE_PERFORM2
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录