if ( sts != 0 )
goto out;
+ /*
+ * Note: this is the *current* number of pages and may change under
+ * a live dump-core. We'll just take this value, and if more pages
+ * exist, we'll skip them. If there's less, then we'll just not use
+ * all the array...
+ *
+ * We don't want to use the total potential size of the memory map
+ * since that is usually much higher than info.nr_pages.
+ */
nr_pages = info.nr_pages;
+
if ( !auto_translated_physmap )
{
/* obtain p2m table */
paused:1, blocked:1, running:1,
hvm:1, debugged:1;
unsigned int shutdown_reason; /* only meaningful if shutdown==1 */
- unsigned long nr_pages;
+ unsigned long nr_pages; /* current number, not maximum */
unsigned long shared_info_frame;
uint64_t cpu_time;
unsigned long max_memkb;
POWER_STATE_NAMES[DOM_STATE_PAUSED],
POWER_STATE_NAMES[dominfo._stateGet()])
+ dopause = (not live and dominfo._stateGet() == DOM_STATE_RUNNING)
+ if dopause:
+ dominfo.pause()
+
try:
- log.info("Domain core dump requested for domain %s (%d) "
- "live=%d crash=%d.",
- dominfo.getName(), dominfo.getDomid(), live, crash)
- return dominfo.dumpCore(filename)
- except Exception, ex:
- raise XendError(str(ex))
+ try:
+ log.info("Domain core dump requested for domain %s (%d) "
+ "live=%d crash=%d.",
+ dominfo.getName(), dominfo.getDomid(), live, crash)
+ dominfo.dumpCore(filename)
+ if crash:
+ self.domain_destroy(domid)
+ except Exception, ex:
+ raise XendError(str(ex))
+ finally:
+ if dopause and not crash:
+ dominfo.unpause()
def domain_destroy(self, domid):
"""Terminate domain immediately.
@raise: XendError if core dumping failed.
"""
- try:
- if not corefile:
- this_time = time.strftime("%Y-%m%d-%H%M.%S", time.localtime())
- corefile = "/var/xen/dump/%s-%s.%s.core" % (this_time,
- self.info['name_label'], self.domid)
+ if not corefile:
+ this_time = time.strftime("%Y-%m%d-%H%M.%S", time.localtime())
+ corefile = "/var/xen/dump/%s-%s.%s.core" % (this_time,
+ self.info['name_label'], self.domid)
- if os.path.isdir(corefile):
- raise XendError("Cannot dump core in a directory: %s" %
- corefile)
-
- self._writeVm(DUMPCORE_IN_PROGRESS, 'True')
- xc.domain_dumpcore(self.domid, corefile)
- self._removeVm(DUMPCORE_IN_PROGRESS)
- except RuntimeError, ex:
- corefile_incomp = corefile+'-incomplete'
- os.rename(corefile, corefile_incomp)
+ if os.path.isdir(corefile):
+ raise XendError("Cannot dump core in a directory: %s" %
+ corefile)
+
+ try:
+ try:
+ self._writeVm(DUMPCORE_IN_PROGRESS, 'True')
+ xc.domain_dumpcore(self.domid, corefile)
+ except RuntimeError, ex:
+ corefile_incomp = corefile+'-incomplete'
+ try:
+ os.rename(corefile, corefile_incomp)
+ except:
+ pass
+
+ log.error("core dump failed: id = %s name = %s: %s",
+ self.domid, self.info['name_label'], str(ex))
+ raise XendError("Failed to dump core: %s" % str(ex))
+ finally:
self._removeVm(DUMPCORE_IN_PROGRESS)
- log.exception("XendDomainInfo.dumpCore failed: id = %s name = %s",
- self.domid, self.info['name_label'])
- raise XendError("Failed to dump core: %s" % str(ex))
#
# Device creation/deletion functions
else:
filename = None
- if not live:
- ds = server.xend.domain.pause(dom, True)
-
- try:
- print "Dumping core of domain: %s ..." % str(dom)
- server.xend.domain.dump(dom, filename, live, crash)
-
- if crash:
- print "Destroying domain: %s ..." % str(dom)
- server.xend.domain.destroy(dom)
- elif reset:
- print "Resetting domain: %s ..." % str(dom)
- server.xend.domain.reset(dom)
- finally:
- if not live and not crash and not reset and ds == DOM_STATE_RUNNING:
- server.xend.domain.unpause(dom)
+ print "Dumping core of domain: %s ..." % str(dom)
+ server.xend.domain.dump(dom, filename, live, crash)
+ if reset:
+ server.xend.domain.reset(dom)
def xm_rename(args):
arg_check(args, "rename", 2)