mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-08 07:15:46 +00:00
locking: Add support for lock failure action
This commit is contained in:
parent
d236f3fc38
commit
297c704a1c
@ -1502,7 +1502,7 @@ lockdriverdir = $(libdir)/libvirt/lock-driver
|
|||||||
lockdriver_LTLIBRARIES = sanlock.la
|
lockdriver_LTLIBRARIES = sanlock.la
|
||||||
|
|
||||||
sanlock_la_SOURCES = $(LOCK_DRIVER_SANLOCK_SOURCES)
|
sanlock_la_SOURCES = $(LOCK_DRIVER_SANLOCK_SOURCES)
|
||||||
sanlock_la_CFLAGS = $(AM_CFLAGS)
|
sanlock_la_CFLAGS = -I$(top_srcdir)/src/conf $(AM_CFLAGS)
|
||||||
sanlock_la_LDFLAGS = -module -avoid-version
|
sanlock_la_LDFLAGS = -module -avoid-version
|
||||||
sanlock_la_LIBADD = -lsanlock_client \
|
sanlock_la_LIBADD = -lsanlock_client \
|
||||||
../gnulib/lib/libgnu.la
|
../gnulib/lib/libgnu.la
|
||||||
|
@ -175,7 +175,8 @@ int virDomainLockProcessStart(virLockManagerPluginPtr plugin,
|
|||||||
if (paused)
|
if (paused)
|
||||||
flags |= VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY;
|
flags |= VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY;
|
||||||
|
|
||||||
ret = virLockManagerAcquire(lock, NULL, flags, fd);
|
ret = virLockManagerAcquire(lock, NULL, flags,
|
||||||
|
dom->def->onLockFailure, fd);
|
||||||
|
|
||||||
virLockManagerFree(lock);
|
virLockManagerFree(lock);
|
||||||
|
|
||||||
@ -215,7 +216,7 @@ int virDomainLockProcessResume(virLockManagerPluginPtr plugin,
|
|||||||
if (!(lock = virDomainLockManagerNew(plugin, uri, dom, true)))
|
if (!(lock = virDomainLockManagerNew(plugin, uri, dom, true)))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
ret = virLockManagerAcquire(lock, state, 0, NULL);
|
ret = virLockManagerAcquire(lock, state, 0, dom->def->onLockFailure, NULL);
|
||||||
virLockManagerFree(lock);
|
virLockManagerFree(lock);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -258,7 +259,8 @@ int virDomainLockDiskAttach(virLockManagerPluginPtr plugin,
|
|||||||
if (virDomainLockManagerAddDisk(lock, disk) < 0)
|
if (virDomainLockManagerAddDisk(lock, disk) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virLockManagerAcquire(lock, NULL, 0, NULL) < 0)
|
if (virLockManagerAcquire(lock, NULL, 0,
|
||||||
|
dom->def->onLockFailure, NULL) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -314,7 +316,8 @@ int virDomainLockLeaseAttach(virLockManagerPluginPtr plugin,
|
|||||||
if (virDomainLockManagerAddLease(lock, lease) < 0)
|
if (virDomainLockManagerAddLease(lock, lease) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virLockManagerAcquire(lock, NULL, 0, NULL) < 0)
|
if (virLockManagerAcquire(lock, NULL, 0,
|
||||||
|
dom->def->onLockFailure, NULL) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
# define __VIR_PLUGINS_LOCK_DRIVER_H__
|
# define __VIR_PLUGINS_LOCK_DRIVER_H__
|
||||||
|
|
||||||
# include "internal.h"
|
# include "internal.h"
|
||||||
|
# include "domain_conf.h"
|
||||||
|
|
||||||
typedef struct _virLockManager virLockManager;
|
typedef struct _virLockManager virLockManager;
|
||||||
typedef virLockManager *virLockManagerPtr;
|
typedef virLockManager *virLockManagerPtr;
|
||||||
@ -218,12 +219,13 @@ typedef int (*virLockDriverAddResource)(virLockManagerPtr man,
|
|||||||
* @manager: the lock manager context
|
* @manager: the lock manager context
|
||||||
* @state: the current lock state
|
* @state: the current lock state
|
||||||
* @flags: optional flags, currently unused
|
* @flags: optional flags, currently unused
|
||||||
|
* @action: action to take when lock is lost
|
||||||
* @fd: optional return the leaked FD
|
* @fd: optional return the leaked FD
|
||||||
*
|
*
|
||||||
* Start managing resources for the object. This
|
* Start managing resources for the object. This
|
||||||
* must be called from the PID that represents the
|
* must be called from the PID that represents the
|
||||||
* object to be managed. If the lock is lost at any
|
* object to be managed. If the lock is lost at any
|
||||||
* time, the PID will be killed off by the lock manager.
|
* time, the specified action will be taken.
|
||||||
* The optional state contains information about the
|
* The optional state contains information about the
|
||||||
* locks previously held for the object.
|
* locks previously held for the object.
|
||||||
*
|
*
|
||||||
@ -237,6 +239,7 @@ typedef int (*virLockDriverAddResource)(virLockManagerPtr man,
|
|||||||
typedef int (*virLockDriverAcquire)(virLockManagerPtr man,
|
typedef int (*virLockDriverAcquire)(virLockManagerPtr man,
|
||||||
const char *state,
|
const char *state,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
|
virDomainLockFailureAction action,
|
||||||
int *fd);
|
int *fd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -69,6 +69,7 @@ static int virLockManagerNopAddResource(virLockManagerPtr lock ATTRIBUTE_UNUSED,
|
|||||||
static int virLockManagerNopAcquire(virLockManagerPtr lock ATTRIBUTE_UNUSED,
|
static int virLockManagerNopAcquire(virLockManagerPtr lock ATTRIBUTE_UNUSED,
|
||||||
const char *state ATTRIBUTE_UNUSED,
|
const char *state ATTRIBUTE_UNUSED,
|
||||||
unsigned int flags_unused ATTRIBUTE_UNUSED,
|
unsigned int flags_unused ATTRIBUTE_UNUSED,
|
||||||
|
virDomainLockFailureAction action ATTRIBUTE_UNUSED,
|
||||||
int *fd ATTRIBUTE_UNUSED)
|
int *fd ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -686,6 +686,7 @@ static int virLockManagerSanlockAddResource(virLockManagerPtr lock,
|
|||||||
static int virLockManagerSanlockAcquire(virLockManagerPtr lock,
|
static int virLockManagerSanlockAcquire(virLockManagerPtr lock,
|
||||||
const char *state,
|
const char *state,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
|
virDomainLockFailureAction action ATTRIBUTE_UNUSED,
|
||||||
int *fd)
|
int *fd)
|
||||||
{
|
{
|
||||||
virLockManagerSanlockPrivatePtr priv = lock->privateData;
|
virLockManagerSanlockPrivatePtr priv = lock->privateData;
|
||||||
|
@ -347,17 +347,18 @@ int virLockManagerAddResource(virLockManagerPtr lock,
|
|||||||
int virLockManagerAcquire(virLockManagerPtr lock,
|
int virLockManagerAcquire(virLockManagerPtr lock,
|
||||||
const char *state,
|
const char *state,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
|
virDomainLockFailureAction action,
|
||||||
int *fd)
|
int *fd)
|
||||||
{
|
{
|
||||||
VIR_DEBUG("lock=%p state='%s' flags=%x fd=%p",
|
VIR_DEBUG("lock=%p state='%s' flags=%x action=%d fd=%p",
|
||||||
lock, NULLSTR(state), flags, fd);
|
lock, NULLSTR(state), flags, action, fd);
|
||||||
|
|
||||||
CHECK_MANAGER(drvAcquire, -1);
|
CHECK_MANAGER(drvAcquire, -1);
|
||||||
|
|
||||||
if (fd)
|
if (fd)
|
||||||
*fd = -1;
|
*fd = -1;
|
||||||
|
|
||||||
return lock->driver->drvAcquire(lock, state, flags, fd);
|
return lock->driver->drvAcquire(lock, state, flags, action, fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@ int virLockManagerAddResource(virLockManagerPtr manager,
|
|||||||
int virLockManagerAcquire(virLockManagerPtr manager,
|
int virLockManagerAcquire(virLockManagerPtr manager,
|
||||||
const char *state,
|
const char *state,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
|
virDomainLockFailureAction action,
|
||||||
int *fd);
|
int *fd);
|
||||||
int virLockManagerRelease(virLockManagerPtr manager,
|
int virLockManagerRelease(virLockManagerPtr manager,
|
||||||
char **state,
|
char **state,
|
||||||
|
Loading…
Reference in New Issue
Block a user