[libvirt] [PATCH 0/2] qemu: Be able to auto dump core of a domain with long name

Yet another fix for https://bugzilla.redhat.com/show_bug.cgi?id=1289363 Martin Kletzander (2): Unify domain name shortening Shorten domain name for automatic coredump src/conf/domain_conf.c | 20 ++++++++++++++++++++ src/conf/domain_conf.h | 2 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_domain.c | 24 ++++++++---------------- src/qemu/qemu_driver.c | 4 +++- 5 files changed, 34 insertions(+), 17 deletions(-) -- 2.8.1

Add virDomainObjGetShortName() and use it. For now that's used in one place, but we should expose it so that future patches can use it. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/conf/domain_conf.c | 20 ++++++++++++++++++++ src/conf/domain_conf.h | 2 ++ src/libvirt_private.syms | 1 + src/qemu/qemu_domain.c | 24 ++++++++---------------- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 055791253c50..d39f666df17f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -24318,3 +24318,23 @@ virDomainDefHasMemballoon(const virDomainDef *def) return def->memballoon && def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_NONE; } + + +/** + * virDomainObjGetShortName: + * @vm: Machine for which to get a name + * @unique: Make sure the name is unique (use id as well) + * + * Shorten domain name to avoid possible path length limitations. + */ +char * +virDomainObjGetShortName(virDomainObjPtr vm) +{ + const int dommaxlen = 20; + char *ret = NULL; + + ignore_value(virAsprintf(&ret, "%d-%.*s", + vm->def->id, dommaxlen, vm->def->name)); + + return ret; +} diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index fd540ed80eb9..ee66e6d6aa45 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3162,4 +3162,6 @@ int virDomainDefGetVcpuPinInfoHelper(virDomainDefPtr def, bool virDomainDefHasMemballoon(const virDomainDef *def) ATTRIBUTE_NONNULL(1); +char *virDomainObjGetShortName(virDomainObjPtr vm); + #endif /* __DOMAIN_CONF_H */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ad5c3826095c..0de35efb2585 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -400,6 +400,7 @@ virDomainObjGetDefs; virDomainObjGetMetadata; virDomainObjGetOneDef; virDomainObjGetPersistentDef; +virDomainObjGetShortName; virDomainObjGetState; virDomainObjNew; virDomainObjParseNode; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 51d4830a77bb..3b152893a23a 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -787,39 +787,31 @@ qemuDomainSetPrivatePathsOld(virQEMUDriverPtr driver, } -/* - * The newer version uses a magic number for one reason. The thing is - * that we need a bit shorter name in order to be able to connect to - * it using UNIX sockets which have path length limitation. Since the - * length is not guaranteed to be constant and similarly the lib - * directory is configurable and so on, we need to rather choose an - * arbitrary maximum length of the domain name that will be used. - * Thanks to the fact that we are now saving it in the status XML, we - * can change it later on whenever we feel like so. - */ int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver, virDomainObjPtr vm) { virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); qemuDomainObjPrivatePtr priv = vm->privateData; - const int dommaxlen = 20; + char *domname = virDomainObjGetShortName(vm); int ret = -1; + if (!domname) + goto cleanup; + if (!priv->libDir && - virAsprintf(&priv->libDir, "%s/domain-%d-%.*s", - cfg->libDir, vm->def->id, dommaxlen, vm->def->name) < 0) + virAsprintf(&priv->libDir, "%s/domain-%s", cfg->libDir, domname) < 0) goto cleanup; if (!priv->channelTargetDir && - virAsprintf(&priv->channelTargetDir, "%s/domain-%d-%.*s", - cfg->channelTargetDir, vm->def->id, - dommaxlen, vm->def->name) < 0) + virAsprintf(&priv->channelTargetDir, "%s/domain-%s", + cfg->channelTargetDir, domname) < 0) goto cleanup; ret = 0; cleanup: virObjectUnref(cfg); + VIR_FREE(domname); return ret; } -- 2.8.1

On Tue, Apr 26, 2016 at 02:07:48PM +0200, Martin Kletzander wrote:
Add virDomainObjGetShortName() and use it. For now that's used in one place, but we should expose it so that future patches can use it.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> ---
ACK and safe for freeze

If the domain name is long enough, the timestamp can prolong the filename for automatic coredump to more than the filesystem's limit. Simply shorten it like we do in other places. The timestamp helps with the unification, but having the ID in the name won't hurt. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1289363 Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_driver.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 542d13c2ac70..2991bbc2ce4a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3965,13 +3965,14 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, char timestr[100]; struct tm time_info; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + char *domname = virDomainObjGetShortName(vm); localtime_r(&curtime, &time_info); strftime(timestr, sizeof(timestr), "%Y-%m-%d-%H:%M:%S", &time_info); if (virAsprintf(&dumpfile, "%s/%s-%s", cfg->autoDumpPath, - vm->def->name, + domname, timestr) < 0) goto cleanup; @@ -3984,6 +3985,7 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, "%s", _("Dump failed")); cleanup: VIR_FREE(dumpfile); + VIR_FREE(domname); virObjectUnref(cfg); return ret; } -- 2.8.1

On Tue, Apr 26, 2016 at 02:07:49PM +0200, Martin Kletzander wrote:
If the domain name is long enough, the timestamp can prolong the filename for automatic coredump to more than the filesystem's limit. Simply shorten it like we do in other places. The timestamp helps with the unification, but having the ID in the name won't hurt.
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1289363
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_driver.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 542d13c2ac70..2991bbc2ce4a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3965,13 +3965,14 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, char timestr[100]; struct tm time_info; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + char *domname = virDomainObjGetShortName(vm);
if (!domname) goto cleanup;
localtime_r(&curtime, &time_info); strftime(timestr, sizeof(timestr), "%Y-%m-%d-%H:%M:%S", &time_info);
if (virAsprintf(&dumpfile, "%s/%s-%s", cfg->autoDumpPath, - vm->def->name, + domname, timestr) < 0) goto cleanup;
@@ -3984,6 +3985,7 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, "%s", _("Dump failed")); cleanup: VIR_FREE(dumpfile); + VIR_FREE(domname); virObjectUnref(cfg); return ret; }
ACK with the check for domname, safe for freeze.
participants (2)
-
Martin Kletzander
-
Pavel Hrdina