提交 bd3e16a3 编写于 作者: M Michal Privoznik

locking: Add io_timeout to sanlock

https://bugzilla.redhat.com/show_bug.cgi?id=1251190

So, if domain loses access to storage, sanlock tries to kill it
after some timeout. So far, the default is 80 seconds. But for
some scenarios this might not be enough. We should allow users to
adjust the timeout according to their needs.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
上级 4ad31f8f
......@@ -46,6 +46,13 @@ AC_DEFUN([LIBVIRT_CHECK_SANLOCK],[
[whether sanlock supports sanlock_inq_lockspace])
fi
AC_CHECK_LIB([sanlock_client], [sanlock_add_lockspace_timeout],
[sanlock_add_lockspace_timeout=yes], [sanlock_add_lockspace_timeout=no])
if test "x$sanlock_add_lockspace_timeout" = "xyes" ; then
AC_DEFINE_UNQUOTED([HAVE_SANLOCK_ADD_LOCKSPACE_TIMEOUT], 1,
[whether Sanlock supports sanlock_add_lockspace_timeout])
fi
CPPFLAGS="$old_cppflags"
LIBS="$old_libs"
fi
......
......@@ -22,6 +22,7 @@ module Libvirt_sanlock =
| int_entry "host_id"
| bool_entry "require_lease_for_disks"
| bool_entry "ignore_readonly_and_shared_disks"
| int_entry "io_timeout"
| str_entry "user"
| str_entry "group"
let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
......
......@@ -73,6 +73,7 @@ struct _virLockManagerSanlockDriver {
int hostID;
bool autoDiskLease;
char *autoDiskLeasePath;
unsigned int io_timeout;
/* under which permissions does sanlock run */
uid_t user;
......@@ -151,6 +152,10 @@ static int virLockManagerSanlockLoadConfig(const char *configFile)
else
driver->requireLeaseForDisks = !driver->autoDiskLease;
p = virConfGetValue(conf, "io_timeout");
CHECK_TYPE("io_timeout", VIR_CONF_ULONG);
if (p) driver->io_timeout = p->l;
p = virConfGetValue(conf, "user");
CHECK_TYPE("user", VIR_CONF_STRING);
if (p) {
......@@ -338,7 +343,17 @@ static int virLockManagerSanlockSetupLockspace(void)
* or we can fallback to polling.
*/
retry:
if ((rv = sanlock_add_lockspace(&ls, 0)) < 0) {
#ifdef HAVE_SANLOCK_ADD_LOCKSPACE_TIMEOUT
rv = sanlock_add_lockspace_timeout(&ls, 0, driver->io_timeout);
#else
if (driver->io_timeout) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("unable to use io_timeout with this version of sanlock"));
goto error;
}
rv = sanlock_add_lockspace(&ls, 0);
#endif
if (rv < 0) {
if (-rv == EINPROGRESS && --retries) {
#ifdef HAVE_SANLOCK_INQ_LOCKSPACE
/* we have this function which blocks until lockspace change the
......@@ -404,6 +419,7 @@ static int virLockManagerSanlockInit(unsigned int version,
driver->requireLeaseForDisks = true;
driver->hostID = 0;
driver->autoDiskLease = false;
driver->io_timeout = 0;
driver->user = (uid_t) -1;
driver->group = (gid_t) -1;
if (VIR_STRDUP(driver->autoDiskLeasePath, LOCALSTATEDIR "/lib/libvirt/sanlock") < 0) {
......
......@@ -53,6 +53,13 @@
#
#require_lease_for_disks = 1
#
# Sanlock is able to kill qemu processes on IO timeout. By its internal
# implementation, the current default is 80 seconds. If you need to adjust
# the value change the following variable. Value of zero means use the
# default sanlock timeout.
#io_timeout = 0
#
# The combination of user and group under which the sanlock
# daemon runs. Libvirt will chown created files (like
......
......@@ -6,5 +6,6 @@ module Test_libvirt_sanlock =
{ "disk_lease_dir" = "/var/lib/libvirt/sanlock" }
{ "host_id" = "1" }
{ "require_lease_for_disks" = "1" }
{ "io_timeout" = "0" }
{ "user" = "root" }
{ "group" = "root" }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册