mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
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:
parent
e96130dcc8
commit
bb09798fbe
@ -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__ */
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -755,6 +755,7 @@ LIBVIRT_3.0.0 {
|
||||
|
||||
LIBVIRT_3.1.0 {
|
||||
global:
|
||||
virDomainSetBlockThreshold;
|
||||
virDomainSetVcpu;
|
||||
} LIBVIRT_3.0.0;
|
||||
|
||||
|
@ -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 = {
|
||||
|
@ -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
|
||||
|
||||
|
||||
};
|
||||
|
@ -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,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user