mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-06 11:49:29 +00:00
virDomainGetMessages: Introduce VIR_DOMAIN_MESSAGE_IOERRORS
Report any stored I/O error messages reported by the hypervisor when reporting messages of a domain. As the I/O error may be already stale we report also the timestamp when it was recorded. Example message: I/O error: disk='vda', index='1', path='/dev/mapper/errdev0', timestamp='2025-01-28 15:47:52.776+0000', message='Input/output error' Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
1a02760cc6
commit
666219f5f1
@ -6520,6 +6520,9 @@ int virDomainAuthorizedSSHKeysSet(virDomainPtr domain,
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
VIR_DOMAIN_MESSAGE_DEPRECATION = (1 << 0), /* (Since: 7.1.0) */
|
VIR_DOMAIN_MESSAGE_DEPRECATION = (1 << 0), /* (Since: 7.1.0) */
|
||||||
VIR_DOMAIN_MESSAGE_TAINTING = (1 << 1), /* (Since: 7.1.0) */
|
VIR_DOMAIN_MESSAGE_TAINTING = (1 << 1), /* (Since: 7.1.0) */
|
||||||
|
VIR_DOMAIN_MESSAGE_IOERRORS = (1 << 2), /* Report available stored I/O
|
||||||
|
errors messages for disk images
|
||||||
|
(Since: 11.1.0) */
|
||||||
} virDomainMessageType;
|
} virDomainMessageType;
|
||||||
|
|
||||||
int virDomainGetMessages(virDomainPtr domain,
|
int virDomainGetMessages(virDomainPtr domain,
|
||||||
|
@ -31682,6 +31682,47 @@ virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
virDomainObjGetMessagesIOErrorsSrc(virStorageSource *src,
|
||||||
|
const char *diskdst,
|
||||||
|
GPtrArray *m)
|
||||||
|
{
|
||||||
|
if (!src ||
|
||||||
|
!src->ioerror_message)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_ptr_array_add(m, g_strdup_printf(_("I/O error: disk='%1$s', index='%2$d', path='%3$s', timestamp='%4$s', message='%5$s'"),
|
||||||
|
NULLSTR_MINUS(diskdst),
|
||||||
|
src->id,
|
||||||
|
NULLSTR_MINUS(src->path),
|
||||||
|
src->ioerror_timestamp,
|
||||||
|
src->ioerror_message));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
virDomainObjGetMessagesIOErrorsChain(virStorageSource *src,
|
||||||
|
const char *diskdst,
|
||||||
|
GPtrArray *m)
|
||||||
|
{
|
||||||
|
virStorageSource *n;
|
||||||
|
|
||||||
|
for (n = src; n; n = n->backingStore) {
|
||||||
|
virDomainObjGetMessagesIOErrorsSrc(n, diskdst, m);
|
||||||
|
virDomainObjGetMessagesIOErrorsSrc(n->dataFileStore, diskdst, m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
virDomainObjGetMessagesIOErrorsDisk(virDomainDiskDef *disk,
|
||||||
|
GPtrArray *m)
|
||||||
|
{
|
||||||
|
virDomainObjGetMessagesIOErrorsChain(disk->src, disk->dst, m);
|
||||||
|
virDomainObjGetMessagesIOErrorsChain(disk->mirror, disk->dst, m);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virDomainObjGetMessages:
|
* virDomainObjGetMessages:
|
||||||
* @vm: domain object
|
* @vm: domain object
|
||||||
@ -31710,6 +31751,15 @@ virDomainObjGetMessages(virDomainObj *vm,
|
|||||||
vm->deprecations[i]));
|
vm->deprecations[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!flags || (flags & VIR_DOMAIN_MESSAGE_IOERRORS)) {
|
||||||
|
if (vm->def->os.loader)
|
||||||
|
virDomainObjGetMessagesIOErrorsChain(vm->def->os.loader->nvram, NULL, m);
|
||||||
|
|
||||||
|
for (i = 0; i < vm->def->ndisks; i++)
|
||||||
|
virDomainObjGetMessagesIOErrorsDisk(vm->def->disks[i], m);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -4588,6 +4588,11 @@ bool
|
|||||||
virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev)
|
virHostdevIsPCIDevice(const virDomainHostdevDef *hostdev)
|
||||||
ATTRIBUTE_NONNULL(1);
|
ATTRIBUTE_NONNULL(1);
|
||||||
|
|
||||||
|
void
|
||||||
|
virDomainObjGetMessagesIOErrorsChain(virStorageSource *src,
|
||||||
|
const char *diskdst,
|
||||||
|
GPtrArray *m);
|
||||||
|
|
||||||
void
|
void
|
||||||
virDomainObjGetMessages(virDomainObj *vm,
|
virDomainObjGetMessages(virDomainObj *vm,
|
||||||
GPtrArray *m,
|
GPtrArray *m,
|
||||||
|
@ -592,6 +592,7 @@ virDomainObjEndAPI;
|
|||||||
virDomainObjFormat;
|
virDomainObjFormat;
|
||||||
virDomainObjGetDefs;
|
virDomainObjGetDefs;
|
||||||
virDomainObjGetMessages;
|
virDomainObjGetMessages;
|
||||||
|
virDomainObjGetMessagesIOErrorsChain;
|
||||||
virDomainObjGetMetadata;
|
virDomainObjGetMetadata;
|
||||||
virDomainObjGetOneDef;
|
virDomainObjGetOneDef;
|
||||||
virDomainObjGetOneDefState;
|
virDomainObjGetOneDefState;
|
||||||
|
@ -6580,7 +6580,8 @@ libxlDomainGetMessages(virDomainPtr dom,
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
virCheckFlags(VIR_DOMAIN_MESSAGE_DEPRECATION |
|
virCheckFlags(VIR_DOMAIN_MESSAGE_DEPRECATION |
|
||||||
VIR_DOMAIN_MESSAGE_TAINTING, -1);
|
VIR_DOMAIN_MESSAGE_TAINTING |
|
||||||
|
VIR_DOMAIN_MESSAGE_IOERRORS, -1);
|
||||||
|
|
||||||
if (!(vm = libxlDomObjFromDomain(dom)))
|
if (!(vm = libxlDomObjFromDomain(dom)))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -19837,9 +19837,11 @@ qemuDomainGetMessages(virDomainPtr dom,
|
|||||||
g_autoptr(GPtrArray) m = g_ptr_array_new_with_free_func(g_free);
|
g_autoptr(GPtrArray) m = g_ptr_array_new_with_free_func(g_free);
|
||||||
virDomainObj *vm = NULL;
|
virDomainObj *vm = NULL;
|
||||||
int rv = -1;
|
int rv = -1;
|
||||||
|
qemuDomainObjPrivate *priv;
|
||||||
|
|
||||||
virCheckFlags(VIR_DOMAIN_MESSAGE_DEPRECATION |
|
virCheckFlags(VIR_DOMAIN_MESSAGE_DEPRECATION |
|
||||||
VIR_DOMAIN_MESSAGE_TAINTING, -1);
|
VIR_DOMAIN_MESSAGE_TAINTING |
|
||||||
|
VIR_DOMAIN_MESSAGE_IOERRORS, -1);
|
||||||
|
|
||||||
if (!(vm = qemuDomainObjFromDomain(dom)))
|
if (!(vm = qemuDomainObjFromDomain(dom)))
|
||||||
return -1;
|
return -1;
|
||||||
@ -19847,8 +19849,20 @@ qemuDomainGetMessages(virDomainPtr dom,
|
|||||||
if (virDomainGetMessagesEnsureACL(dom->conn, vm->def) < 0)
|
if (virDomainGetMessagesEnsureACL(dom->conn, vm->def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
priv = vm->privateData;
|
||||||
|
|
||||||
virDomainObjGetMessages(vm, m, flags);
|
virDomainObjGetMessages(vm, m, flags);
|
||||||
|
|
||||||
|
if (priv->backup &&
|
||||||
|
(!flags || (flags & VIR_DOMAIN_MESSAGE_IOERRORS))) {
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < priv->backup->ndisks; i++)
|
||||||
|
virDomainObjGetMessagesIOErrorsChain(priv->backup->disks[i].store,
|
||||||
|
priv->backup->disks[i].name,
|
||||||
|
m);
|
||||||
|
}
|
||||||
|
|
||||||
rv = m->len;
|
rv = m->len;
|
||||||
if (m->len > 0) {
|
if (m->len > 0) {
|
||||||
g_ptr_array_add(m, NULL);
|
g_ptr_array_add(m, NULL);
|
||||||
|
@ -9527,7 +9527,8 @@ testDomainGetMessages(virDomainPtr dom,
|
|||||||
int rv = -1;
|
int rv = -1;
|
||||||
|
|
||||||
virCheckFlags(VIR_DOMAIN_MESSAGE_DEPRECATION |
|
virCheckFlags(VIR_DOMAIN_MESSAGE_DEPRECATION |
|
||||||
VIR_DOMAIN_MESSAGE_TAINTING, -1);
|
VIR_DOMAIN_MESSAGE_TAINTING |
|
||||||
|
VIR_DOMAIN_MESSAGE_IOERRORS, -1);
|
||||||
|
|
||||||
if (!(vm = testDomObjFromDomain(dom)))
|
if (!(vm = testDomObjFromDomain(dom)))
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user