Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
395793a8
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
395793a8
编写于
11月 22, 2010
作者:
D
Daniel P. Berrange
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add initial docs about the lock managers
上级
ad73a937
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
261 addition
and
0 deletion
+261
-0
docs/internals/locking.html.in
docs/internals/locking.html.in
+257
-0
docs/sitemap.html.in
docs/sitemap.html.in
+4
-0
未找到文件。
docs/internals/locking.html.in
0 → 100644
浏览文件 @
395793a8
<html>
<body>
<h1>
Resource Lock Manager
</h1>
<ul
id=
"toc"
></ul>
<p>
This page describes the design of the resource lock manager
that is used for locking disk images, to ensure exclusive
access to content.
</p>
<h2><a
name=
"goals"
>
Goals
</a></h2>
<p>
The high level goal is to prevent the same disk image being
used by more than one QEMU instance at a time (unless the
disk is marked as sharable, or readonly). The scenarios
to be prevented are thus:
</p>
<ol>
<li>
Two different guests running configured to point at the
same disk image.
</li>
<li>
One guest being started more than once on two different
machines due to admin mistake
</li>
<li>
One guest being started more than once on a single machine
due to libvirt driver bug on a single machine.
</li>
</ol>
<h2><a
name=
"requirement"
>
Requirements
</a></h2>
<p>
The high level goal leads to a set of requirements
for the lock manager design
</p>
<ol>
<li>
A lock must be held on a disk whenever a QEMU process
has the disk open
</li>
<li>
The lock scheme must allow QEMU to be configured with
readonly, shared write, or exclusive writable disks
</li>
<li>
A lock handover must be performed during the migration
process where 2 QEMU processes will have the same disk
open concurrently.
</li>
<li>
The lock manager must be able to identify and kill the
process accessing the resource if the lock is revoked.
</li>
<li>
Locks can be acquired for arbitrary VM related resources,
as determined by the management application.
</li>
</ol>
<h2><a
name=
"design"
>
Design
</a></h2>
<p>
Within a lock manager the following series of operations
will need to be supported.
</p>
<ul>
<li>
<strong>
Register object
</strong>
Register the identity of an object against which
locks will be acquired
</li>
<li>
<strong>
Add resource
</strong>
Associate a resource with an object for future
lock acquisition / release
</li>
<li>
<strong>
Acquire locks
</strong>
Acquire the locks for all resources associated
with the object
</li>
<li>
<strong>
Release locks
</strong>
Release the locks for all resources associated
with the object
</li>
<li>
<strong>
Inquire locks
</strong>
Get a representation of the state of the locks
for all resources associated with the object
</li>
</ul>
<h2><a
name=
"impl"
>
Plugin Implementations
</a></h2>
<p>
Lock manager implementations are provided as LGPLv2+
licensed, dlopen()able library modules. The plugins
will be loadable from the following location:
</p>
<pre>
/usr/{lib,lib64}/libvirt/lock_manager/$NAME.so
</pre>
<p>
The lock manager plugin must export a single ELF
symbol named
<code>
virLockDriverImpl
</code>
, which is
a static instance of the
<code>
virLockDriver
</code>
struct. The struct is defined in the header file
</p>
<pre>
#include
<
libvirt/plugins/lock_manager.h
>
</pre>
<p>
All callbacks in the struct must be initialized
to non-NULL pointers. The semantics of each
callback are defined in the API docs embedded
in the previously mentioned header file
</p>
<h2><a
name=
"qemuIntegrate"
>
QEMU Driver integration
</a></h2>
<p>
With the QEMU driver, the lock plugin will be set
in the
<code>
/etc/libvirt/qemu.conf
</code>
configuration
file by specifying the lock manager name.
</p>
<pre>
lockManager="sanlock"
</pre>
<p>
By default the lock manager will be a 'no op' implementation
for backwards compatibility
</p>
<h2><a
name=
"usagePatterns"
>
Lock usage patterns
</a></h2>
<p>
The following psuedo code illustrates the common
patterns of operations invoked on the lock
manager plugin callbacks.
</p>
<h3><a
name=
"usageLockAcquire"
>
Lock acquisition
</a></h3>
<p>
Initial lock acquisition will be performed from the
process that is to own the lock. This is typically
the QEMU child process, in between the fork+exec
pairing. When adding further resources on the fly,
to an existing object holding locks, this will be
done from the libvirtd process.
</p>
<pre>
virLockManagerParam params[] = {
{ .type = VIR_LOCK_MANAGER_PARAM_TYPE_UUID,
.key = "uuid",
},
{ .type = VIR_LOCK_MANAGER_PARAM_TYPE_STRING,
.key = "name",
.value = { .str = dom->def->name },
},
{ .type = VIR_LOCK_MANAGER_PARAM_TYPE_UINT,
.key = "id",
.value = { .i = dom->def->id },
},
{ .type = VIR_LOCK_MANAGER_PARAM_TYPE_UINT,
.key = "pid",
.value = { .i = dom->pid },
},
};
mgr = virLockManagerNew(lockPlugin,
VIR_LOCK_MANAGER_TYPE_DOMAIN,
ARRAY_CARDINALITY(params),
params,
0)));
foreach (initial disks)
virLockManagerAddResource(mgr,
VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK,
$path, 0, NULL, $flags);
if (virLockManagerAcquire(lock, NULL, 0)
<
0);
...abort...
</pre>
<h3><a
name=
"usageLockAttach"
>
Lock release
</a></h3>
<p>
The locks are all implicitly released when the process
that acquired them exits, however, a process may
voluntarily give up the lock by running
</p>
<pre>
char *state = NULL;
virLockManagerParam params[] = {
{ .type = VIR_LOCK_MANAGER_PARAM_TYPE_UUID,
.key = "uuid",
},
{ .type = VIR_LOCK_MANAGER_PARAM_TYPE_STRING,
.key = "name",
.value = { .str = dom->def->name },
},
{ .type = VIR_LOCK_MANAGER_PARAM_TYPE_UINT,
.key = "id",
.value = { .i = dom->def->id },
},
{ .type = VIR_LOCK_MANAGER_PARAM_TYPE_UINT,
.key = "pid",
.value = { .i = dom->pid },
},
};
mgr = virLockManagerNew(lockPlugin,
VIR_LOCK_MANAGER_TYPE_DOMAIN,
ARRAY_CARDINALITY(params),
params,
0)));
foreach (initial disks)
virLockManagerAddResource(mgr,
VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK,
$path, 0, NULL, $flags);
virLockManagerRelease(mgr,
&
state, 0);
</pre>
<p>
The returned state string can be passed to the
<code>
virLockManagerAcquire
</code>
method to
later re-acquire the exact same locks. This
state transfer is commonly used when performing
live migration of virtual machines. By validating
the state the lock manager can ensure no other
VM has re-acquire the same locks on a different
host. The state can also be obtained without
releasing the locks, by calling the
<code>
virLockManagerInquire
</code>
method.
</p>
</body>
</html>
docs/sitemap.html.in
浏览文件 @
395793a8
...
...
@@ -284,6 +284,10 @@
<a
href=
"internals/command.html"
>
Spawning commands
</a>
<span>
Spawning commands from libvirt driver code
</span>
</li>
<li>
<a
href=
"internals/locking.html"
>
Lock managers
</a>
<span>
Use lock managers to protect disk content
</span>
</li>
</ul>
</li>
<li>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录