pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pkg/53095: xentools must remove xenstored/tdb on reboot



>Number:         53095
>Category:       pkg
>Synopsis:       xentools must remove xenstored/tdb on reboot
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Mar 12 21:20:00 +0000 2018
>Originator:     "Greg A. Woods" <woods%planix.ca@localhost>
>Release:        NetBSD 7.1
>Organization:
Planix, Inc.; Kelowna, BC; Canada
>Environment:
System: NetBSD xentral 7.1 NetBSD 7.1 (XEN3_DOM0.201703111743Z) amd64
Architecture: x86_64
Machine: amd64
$ /usr/sbin/pkg_info -I xentools\*
xentools48-4.8.0    Userland Tools for Xen 4.8.x
>Description:

The xenstored database file, currently /var/lib/xenstored/tdb, contains
runtime information stored in Domain-0 on behalf of the Xen management
commands (e.g. "xl") and the various DomUs.

It contains nothing persistent.

However it has a very fragile format ("Trivial DataBase") and it is
apparently easily corrupted during a crash.

It must be re-initialized from scratch after every reboot.

Note that there is no way to verify the integrity of a stale left-over
TDB file however it can always be re-created fully at boot time.

The "libxl_json" files now in /var/lib/xen are ephemeral too, as they
are just runtime copies of configuration data saved at domain creation
time and are only used to restore configuration during the "restart",
"restart-rename", and "soft-reset" actions that are executed for various
"on_*" events (e.g. at domain death).


>How-To-Repeat:

Crash a Xen server at any inopportune time and end up in a situation
where Xen domains cannot be started, with varying results from simple
hangs in "xl", possibly deadlocks in the kernel, as well as more obvious
errors such as:

04:56 [1.401] # xl create -c /usr/pkg/etc/xen/central.conf
Parsing config from /usr/pkg/etc/xen/central.conf
libxl: error: libxl_xshelp.c:175:libxl__xs_mknod: xenstore write failed: `/libxl/7/device' = '': No space left on device
libxl: error: libxl.c:456:libxl__domain_rename: failed to write new name `central' for domain 7 previously named `(null)'
libxl: error: libxl_create.c:928:initiate_domain_create: cannot make domain: -3
libxl: error: libxl.c:1575:libxl__destroy_domid: non-existant domain 7
libxl: error: libxl.c:1534:domain_destroy_callback: unable to destroy guest with domid 7
libxl: error: libxl.c:1463:domain_destroy_cb: destruction of domain 7 failed


>Fix:

Previously it has been proposed that XEN_LIB_STORED be changed to
/var/run/xenstored.

	https://mail-index.netbsd.org/port-xen/2016/03/24/msg008876.html

See below for a more complete proposal.

In the mean time this simple fix suffices (and keeps the old tdb file
for post-crash analysis):

--- xencommons.sh.~1.1.~	2017-03-30 02:15:09.000000000 -0700
+++ xencommons.sh	2018-03-12 11:22:36.269083716 -0700
@@ -17,6 +17,8 @@
 XENSTORED_PIDFILE="/var/run/xenstored.pid"
 XENCONSOLED_PIDFILE="/var/run/xenconsoled.pid"
 
+XEN_LIB_STORED="/var/lib/xenstored"
+
 BINDIR=@PREFIX@/bin
 SBINDIR=@PREFIX@/sbin
 LIBEXEC_BIN=@PREFIX@/libexec/xen/bin
@@ -25,6 +27,8 @@
 {
 	mkdir -p /var/run/xen || exit 1
 	mkdir -p /var/run/xenstored || exit 1
+
+	mv -f ${XEN_LIB_STORED}/tdb ${XEN_LIB_STORED}/tdb-previous
 }
 
 xen_startcmd()



The following patches (these from xen HEAD at commit-id a823a5280f) are
perhaps more appropriate for upstream (and would probably be preferred
over the patch suggested in the email linked above):

5 files changed, 7 insertions(+), 6 deletions(-)
m4/paths.m4                     | 5 +++--
tools/libxl/libxl_dom.c         | 2 +-
tools/xenstore/xs_lib.c         | 2 +-

modified   m4/paths.m4
@@ -135,8 +135,9 @@ XEN_SCRIPT_DIR=$XEN_CONFIG_DIR/scripts
 AC_SUBST(XEN_SCRIPT_DIR)
 
 case "$host_os" in
-*freebsd*) XEN_LOCK_DIR=$localstatedir/lib ;;
-*netbsd*) XEN_LOCK_DIR=$localstatedir/lib ;;
+*freebsd*) XEN_LOCK_DIR=$rundir_path ;;
+*netbsd*) XEN_LOCK_DIR=$rundir_path ;;
+*openbsd*) XEN_LOCK_DIR=$rundir_path ;;
 *) XEN_LOCK_DIR=$localstatedir/lock ;;
 esac
 AC_SUBST(XEN_LOCK_DIR)
modified   tools/libxl/libxl_dom.c
@@ -1361,7 +1361,7 @@ const char *libxl__userdata_path(libxl__gc *gc, uint32_t domid,
         goto out;
     }
     uuid_string = GCSPRINTF(LIBXL_UUID_FMT, LIBXL_UUID_BYTES(info.uuid));
-    path = GCSPRINTF(XEN_LIB_DIR "/userdata-%s.%u.%s.%s",
+    path = GCSPRINTF(XEN_RUN_DIR "/userdata-%s.%u.%s.%s",
                      wh, domid, uuid_string, userdata_userid);
 
  out:
modified   tools/xenstore/xs_lib.c
@@ -52,7 +52,7 @@ static const char *xs_daemon_path(void)
 const char *xs_daemon_tdb(void)
 {
 	static char buf[PATH_MAX];
-	snprintf(buf, sizeof(buf), "%s/tdb", xs_daemon_rootdir());
+	snprintf(buf, sizeof(buf), "%s/tdb", xs_daemon_rundir());
 	return buf;
 }
 



Home | Main Index | Thread Index | Old Index