Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
2fb13628
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看板
提交
2fb13628
编写于
9月 22, 2011
作者:
J
Jiri Denemark
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement keepalive protocol in remote driver
上级
673adba5
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
141 addition
and
4 deletion
+141
-4
src/remote/remote_driver.c
src/remote/remote_driver.c
+52
-0
src/rpc/virnetclient.c
src/rpc/virnetclient.c
+84
-4
src/rpc/virnetclient.h
src/rpc/virnetclient.h
+5
-0
未找到文件。
src/remote/remote_driver.c
浏览文件 @
2fb13628
...
...
@@ -68,6 +68,7 @@
#endif
static
int
inside_daemon
=
0
;
static
virDriverPtr
remoteDriver
=
NULL
;
struct
private_data
{
virMutex
lock
;
...
...
@@ -84,6 +85,7 @@ struct private_data {
char
*
type
;
/* Cached return from remoteType. */
int
localUses
;
/* Ref count for private data */
char
*
hostname
;
/* Original hostname */
bool
serverKeepAlive
;
/* Does server support keepalive protocol? */
virDomainEventStatePtr
domainEventState
;
};
...
...
@@ -667,6 +669,26 @@ doRemoteOpen (virConnectPtr conn,
if
(
remoteAuthenticate
(
conn
,
priv
,
auth
,
authtype
)
==
-
1
)
goto
failed
;
if
(
virNetClientKeepAliveIsSupported
(
priv
->
client
))
{
remote_supports_feature_args
args
=
{
VIR_DRV_FEATURE_PROGRAM_KEEPALIVE
};
remote_supports_feature_ret
ret
=
{
0
};
int
rc
;
rc
=
call
(
conn
,
priv
,
0
,
REMOTE_PROC_SUPPORTS_FEATURE
,
(
xdrproc_t
)
xdr_remote_supports_feature_args
,
(
char
*
)
&
args
,
(
xdrproc_t
)
xdr_remote_supports_feature_ret
,
(
char
*
)
&
ret
);
if
(
rc
==
-
1
)
goto
failed
;
if
(
ret
.
supported
)
{
priv
->
serverKeepAlive
=
true
;
}
else
{
VIR_INFO
(
"Disabling keepalive protocol since it is not supported"
" by the server"
);
}
}
/* Finally we can call the remote side's open function. */
{
remote_open_args
args
=
{
&
name
,
flags
};
...
...
@@ -4180,6 +4202,33 @@ done:
}
static
int
remoteSetKeepAlive
(
virConnectPtr
conn
,
int
interval
,
unsigned
int
count
)
{
struct
private_data
*
priv
=
conn
->
privateData
;
int
ret
=
-
1
;
remoteDriverLock
(
priv
);
if
(
!
virNetClientKeepAliveIsSupported
(
priv
->
client
))
{
remoteError
(
VIR_ERR_INTERNAL_ERROR
,
"%s"
,
_
(
"the caller doesn't support keepalive protocol;"
" perhaps it's missing event loop implementation"
));
goto
cleanup
;
}
if
(
!
priv
->
serverKeepAlive
)
{
ret
=
1
;
goto
cleanup
;
}
ret
=
virNetClientKeepAliveStart
(
priv
->
client
,
interval
,
count
);
cleanup:
remoteDriverUnlock
(
priv
);
return
ret
;
}
#include "remote_client_bodies.h"
#include "qemu_client_bodies.h"
...
...
@@ -4550,6 +4599,7 @@ static virDriver remote_driver = {
.
domainGetBlockJobInfo
=
remoteDomainGetBlockJobInfo
,
/* 0.9.4 */
.
domainBlockJobSetSpeed
=
remoteDomainBlockJobSetSpeed
,
/* 0.9.4 */
.
domainBlockPull
=
remoteDomainBlockPull
,
/* 0.9.4 */
.
setKeepAlive
=
remoteSetKeepAlive
,
/* 0.9.7 */
};
static
virNetworkDriver
network_driver
=
{
...
...
@@ -4700,6 +4750,8 @@ static virStateDriver state_driver = {
int
remoteRegister
(
void
)
{
remoteDriver
=
&
remote_driver
;
if
(
virRegisterDriver
(
&
remote_driver
)
==
-
1
)
return
-
1
;
if
(
virRegisterNetworkDriver
(
&
network_driver
)
==
-
1
)
return
-
1
;
if
(
virRegisterInterfaceDriver
(
&
interface_driver
)
==
-
1
)
return
-
1
;
...
...
src/rpc/virnetclient.c
浏览文件 @
2fb13628
...
...
@@ -29,6 +29,7 @@
#include "virnetclient.h"
#include "virnetsocket.h"
#include "virkeepalive.h"
#include "memory.h"
#include "threads.h"
#include "virfile.h"
...
...
@@ -102,11 +103,12 @@ struct _virNetClient {
size_t
nstreams
;
virNetClientStreamPtr
*
streams
;
virKeepAlivePtr
keepalive
;
bool
wantClose
;
};
void
virNetClientRequestClose
(
virNetClientPtr
client
);
static
void
virNetClientRequestClose
(
virNetClientPtr
client
);
static
void
virNetClientLock
(
virNetClientPtr
client
)
{
...
...
@@ -222,11 +224,56 @@ static void virNetClientEventFree(void *opaque)
virNetClientFree
(
client
);
}
bool
virNetClientKeepAliveIsSupported
(
virNetClientPtr
client
)
{
bool
supported
;
virNetClientLock
(
client
);
supported
=
!!
client
->
keepalive
;
virNetClientUnlock
(
client
);
return
supported
;
}
int
virNetClientKeepAliveStart
(
virNetClientPtr
client
,
int
interval
,
unsigned
int
count
)
{
int
ret
;
virNetClientLock
(
client
);
ret
=
virKeepAliveStart
(
client
->
keepalive
,
interval
,
count
);
virNetClientUnlock
(
client
);
return
ret
;
}
static
void
virNetClientKeepAliveDeadCB
(
void
*
opaque
)
{
virNetClientRequestClose
(
opaque
);
}
static
int
virNetClientKeepAliveSendCB
(
void
*
opaque
,
virNetMessagePtr
msg
)
{
int
ret
;
ret
=
virNetClientSendNonBlock
(
opaque
,
msg
);
if
(
ret
!=
-
1
&&
ret
!=
1
)
virNetMessageFree
(
msg
);
return
ret
;
}
static
virNetClientPtr
virNetClientNew
(
virNetSocketPtr
sock
,
const
char
*
hostname
)
{
virNetClientPtr
client
=
NULL
;
int
wakeupFD
[
2
]
=
{
-
1
,
-
1
};
virKeepAlivePtr
ka
=
NULL
;
if
(
pipe2
(
wakeupFD
,
O_CLOEXEC
)
<
0
)
{
virReportSystemError
(
errno
,
"%s"
,
...
...
@@ -259,13 +306,24 @@ static virNetClientPtr virNetClientNew(virNetSocketPtr sock,
client
,
virNetClientEventFree
)
<
0
)
{
client
->
refs
--
;
VIR_DEBUG
(
"Failed to add event watch, disabling events"
);
VIR_DEBUG
(
"Failed to add event watch, disabling events and support for"
" keepalive messages"
);
}
else
{
/* Keepalive protocol consists of async messages so it can only be used
* if the client supports them */
if
(
!
(
ka
=
virKeepAliveNew
(
-
1
,
0
,
client
,
virNetClientKeepAliveSendCB
,
virNetClientKeepAliveDeadCB
,
virNetClientEventFree
)))
goto
error
;
/* keepalive object has a reference to client */
client
->
refs
++
;
}
client
->
keepalive
=
ka
;
PROBE
(
RPC_CLIENT_NEW
,
"client=%p refs=%d sock=%p"
,
client
,
client
->
refs
,
client
->
sock
);
return
client
;
no_memory:
...
...
@@ -273,6 +331,10 @@ no_memory:
error:
VIR_FORCE_CLOSE
(
wakeupFD
[
0
]);
VIR_FORCE_CLOSE
(
wakeupFD
[
1
]);
if
(
ka
)
{
virKeepAliveStop
(
ka
);
virKeepAliveFree
(
ka
);
}
virNetClientFree
(
client
);
return
NULL
;
}
...
...
@@ -416,6 +478,8 @@ void virNetClientFree(virNetClientPtr client)
static
void
virNetClientCloseLocked
(
virNetClientPtr
client
)
{
virKeepAlivePtr
ka
;
VIR_DEBUG
(
"client=%p, sock=%p"
,
client
,
client
->
sock
);
if
(
!
client
->
sock
)
...
...
@@ -430,7 +494,20 @@ virNetClientCloseLocked(virNetClientPtr client)
virNetSASLSessionFree
(
client
->
sasl
);
client
->
sasl
=
NULL
;
#endif
ka
=
client
->
keepalive
;
client
->
keepalive
=
NULL
;
client
->
wantClose
=
false
;
if
(
ka
)
{
client
->
refs
++
;
virNetClientUnlock
(
client
);
virKeepAliveStop
(
ka
);
virKeepAliveFree
(
ka
);
virNetClientLock
(
client
);
client
->
refs
--
;
}
}
void
virNetClientClose
(
virNetClientPtr
client
)
...
...
@@ -443,7 +520,7 @@ void virNetClientClose(virNetClientPtr client)
virNetClientUnlock
(
client
);
}
void
static
void
virNetClientRequestClose
(
virNetClientPtr
client
)
{
VIR_DEBUG
(
"client=%p"
,
client
);
...
...
@@ -844,6 +921,9 @@ virNetClientCallDispatch(virNetClientPtr client)
client
->
msg
.
header
.
prog
,
client
->
msg
.
header
.
vers
,
client
->
msg
.
header
.
proc
,
client
->
msg
.
header
.
type
,
client
->
msg
.
header
.
status
,
client
->
msg
.
header
.
serial
);
if
(
virKeepAliveCheckMessage
(
client
->
keepalive
,
&
client
->
msg
))
return
0
;
switch
(
client
->
msg
.
header
.
type
)
{
case
VIR_NET_REPLY
:
/* Normal RPC replies */
case
VIR_NET_REPLY_WITH_FDS
:
/* Normal RPC replies with FDs */
...
...
src/rpc/virnetclient.h
浏览文件 @
2fb13628
...
...
@@ -95,4 +95,9 @@ int virNetClientGetTLSKeySize(virNetClientPtr client);
void
virNetClientFree
(
virNetClientPtr
client
);
void
virNetClientClose
(
virNetClientPtr
client
);
bool
virNetClientKeepAliveIsSupported
(
virNetClientPtr
client
);
int
virNetClientKeepAliveStart
(
virNetClientPtr
client
,
int
interval
,
unsigned
int
count
);
#endif
/* __VIR_NET_CLIENT_H__ */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录