lib: Add API for setting the threshold size for VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD

The new API can be used to configure the threshold when
VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD should be fired.
This commit is contained in:
Peter Krempa 2017-02-23 13:09:12 +01:00
parent e96130dcc8
commit bb09798fbe
7 changed files with 94 additions and 1 deletions

View File

@ -4664,4 +4664,9 @@ int virDomainSetVcpu(virDomainPtr domain,
int state,
unsigned int flags);
int virDomainSetBlockThreshold(virDomainPtr domain,
const char *dev,
unsigned long long threshold,
unsigned int flags);
#endif /* __VIR_LIBVIRT_DOMAIN_H__ */

View File

@ -1257,6 +1257,13 @@ typedef int
int state,
unsigned int flags);
typedef int
(*virDrvDomainSetBlockThreshold)(virDomainPtr domain,
const char *dev,
unsigned long long threshold,
unsigned int flags);
typedef struct _virHypervisorDriver virHypervisorDriver;
typedef virHypervisorDriver *virHypervisorDriverPtr;
@ -1496,6 +1503,7 @@ struct _virHypervisorDriver {
virDrvDomainGetGuestVcpus domainGetGuestVcpus;
virDrvDomainSetGuestVcpus domainSetGuestVcpus;
virDrvDomainSetVcpu domainSetVcpu;
virDrvDomainSetBlockThreshold domainSetBlockThreshold;
};

View File

@ -11822,3 +11822,59 @@ virDomainSetVcpu(virDomainPtr domain,
virDispatchError(domain->conn);
return -1;
}
/**
* virDomainSetBlockThreshold:
* @domain: pointer to domain object
* @dev: string specifying the block device or backing chain element
* @threshold: threshold in bytes when to fire the event
* @flags: currently unused, callers should pass 0
*
* Set the threshold level for delivering the
* VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD if the device or backing chain element
* described by @dev is written beyond the set threshold level. The threshold
* level is unset once the event fires. The event might not be delivered at all
* if libvirtd was not running at the moment when the threshold was reached.
*
* Hypervisors report the last written sector of an image in the bulk stats API
* (virConnectGetAllDomainStats/virDomainListGetStats) as
* "block.<num>.allocation" in the VIR_DOMAIN_STATS_BLOCK group. The current
* threshold value is reported as "block.<num>.threshold".
*
* This event allows to use thin-provisioned storage which needs management
* tools to grow it without the need for polling of the data.
*
* Returns 0 if the operation has started, -1 on failure.
*/
int
virDomainSetBlockThreshold(virDomainPtr domain,
const char *dev,
unsigned long long threshold,
unsigned int flags)
{
VIR_DOMAIN_DEBUG(domain, "dev='%s' threshold=%llu flags=%x",
NULLSTR(dev), threshold, flags);
virResetLastError();
virCheckDomainReturn(domain, -1);
virCheckReadOnlyGoto(domain->conn->flags, error);
virCheckNonNullArgGoto(dev, error);
if (domain->conn->driver->domainSetBlockThreshold) {
int ret;
ret = domain->conn->driver->domainSetBlockThreshold(domain, dev,
threshold, flags);
if (ret < 0)
goto error;
return ret;
}
virReportUnsupportedError();
error:
virDispatchError(domain->conn);
return -1;
}

View File

@ -755,6 +755,7 @@ LIBVIRT_3.0.0 {
LIBVIRT_3.1.0 {
global:
virDomainSetBlockThreshold;
virDomainSetVcpu;
} LIBVIRT_3.0.0;

View File

@ -8436,6 +8436,7 @@ static virHypervisorDriver hypervisor_driver = {
.domainGetGuestVcpus = remoteDomainGetGuestVcpus, /* 2.0.0 */
.domainSetGuestVcpus = remoteDomainSetGuestVcpus, /* 2.0.0 */
.domainSetVcpu = remoteDomainSetVcpu, /* 3.1.0 */
.domainSetBlockThreshold = remoteDomainSetBlockThreshold, /* 3.2.0 */
};
static virNetworkDriver network_driver = {

View File

@ -3402,6 +3402,14 @@ struct remote_secret_event_value_changed_msg {
remote_nonnull_secret secret;
};
struct remote_domain_set_block_threshold_args {
remote_nonnull_domain dom;
remote_nonnull_string dev;
unsigned hyper threshold;
unsigned int flags;
};
/*----- Protocol. -----*/
/* Define the program number, protocol version and procedure numbers here. */
@ -6048,6 +6056,13 @@ enum remote_procedure {
* @generate: both
* @acl: none
*/
REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD = 385
REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD = 385,
/**
* @generate: both
* @acl: domain:write
*/
REMOTE_PROC_DOMAIN_SET_BLOCK_THRESHOLD = 386
};

View File

@ -2840,6 +2840,12 @@ struct remote_secret_event_value_changed_msg {
int callbackID;
remote_nonnull_secret secret;
};
struct remote_domain_set_block_threshold_args {
remote_nonnull_domain dom;
remote_nonnull_string dev;
uint64_t threshold;
u_int flags;
};
enum remote_procedure {
REMOTE_PROC_CONNECT_OPEN = 1,
REMOTE_PROC_CONNECT_CLOSE = 2,
@ -3226,4 +3232,5 @@ enum remote_procedure {
REMOTE_PROC_SECRET_EVENT_VALUE_CHANGED = 383,
REMOTE_PROC_DOMAIN_SET_VCPU = 384,
REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD = 385,
REMOTE_PROC_DOMAIN_SET_BLOCK_THRESHOLD = 386,
};