mirror of
https://github.com/qemu/qemu.git
synced 2025-08-08 16:36:26 +00:00
migration: Add more error handling to analyze-migration.py
The analyze-migration script was seen failing in s390x in misterious ways. It seems we're reaching the VMSDFieldStruct constructor without any fields, which would indicate an empty .subsection entry, a VMSTATE_STRUCT with no fields or a vmsd with no fields. We don't have any of those, at least not without the unmigratable flag set, so this should never happen. Add some debug statements so that we can see what's going on the next time the issue happens. Reviewed-by: Peter Xu <peterx@redhat.com> Message-Id: <20250109185249.23952-2-farosas@suse.de> Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
parent
8597af7615
commit
86bee9e0c7
@ -429,6 +429,9 @@ def __init__(self, desc, file):
|
|||||||
super(VMSDFieldStruct, self).__init__(desc, file)
|
super(VMSDFieldStruct, self).__init__(desc, file)
|
||||||
self.data = collections.OrderedDict()
|
self.data = collections.OrderedDict()
|
||||||
|
|
||||||
|
if 'fields' not in self.desc['struct']:
|
||||||
|
raise Exception("No fields in struct. VMSD:\n%s" % self.desc)
|
||||||
|
|
||||||
# When we see compressed array elements, unfold them here
|
# When we see compressed array elements, unfold them here
|
||||||
new_fields = []
|
new_fields = []
|
||||||
for field in self.desc['struct']['fields']:
|
for field in self.desc['struct']['fields']:
|
||||||
@ -477,6 +480,10 @@ def read(self):
|
|||||||
raise Exception("Subsection %s not found at offset %x" % ( subsection['vmsd_name'], self.file.tell()))
|
raise Exception("Subsection %s not found at offset %x" % ( subsection['vmsd_name'], self.file.tell()))
|
||||||
name = self.file.readstr()
|
name = self.file.readstr()
|
||||||
version_id = self.file.read32()
|
version_id = self.file.read32()
|
||||||
|
|
||||||
|
if not subsection:
|
||||||
|
raise Exception("Empty description for subsection: %s" % name)
|
||||||
|
|
||||||
self.data[name] = VMSDSection(self.file, version_id, subsection, (name, 0))
|
self.data[name] = VMSDSection(self.file, version_id, subsection, (name, 0))
|
||||||
self.data[name].read()
|
self.data[name].read()
|
||||||
|
|
||||||
@ -574,10 +581,13 @@ def __init__(self, filename):
|
|||||||
}
|
}
|
||||||
self.filename = filename
|
self.filename = filename
|
||||||
self.vmsd_desc = None
|
self.vmsd_desc = None
|
||||||
|
self.vmsd_json = ""
|
||||||
|
|
||||||
def read(self, desc_only = False, dump_memory = False, write_memory = False):
|
def read(self, desc_only = False, dump_memory = False,
|
||||||
|
write_memory = False):
|
||||||
# Read in the whole file
|
# Read in the whole file
|
||||||
file = MigrationFile(self.filename)
|
file = MigrationFile(self.filename)
|
||||||
|
self.vmsd_json = file.read_migration_debug_json()
|
||||||
|
|
||||||
# File magic
|
# File magic
|
||||||
data = file.read32()
|
data = file.read32()
|
||||||
@ -635,9 +645,11 @@ def read(self, desc_only = False, dump_memory = False, write_memory = False):
|
|||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
def load_vmsd_json(self, file):
|
def load_vmsd_json(self, file):
|
||||||
vmsd_json = file.read_migration_debug_json()
|
self.vmsd_desc = json.loads(self.vmsd_json,
|
||||||
self.vmsd_desc = json.loads(vmsd_json, object_pairs_hook=collections.OrderedDict)
|
object_pairs_hook=collections.OrderedDict)
|
||||||
for device in self.vmsd_desc['devices']:
|
for device in self.vmsd_desc['devices']:
|
||||||
|
if 'fields' not in device:
|
||||||
|
raise Exception("vmstate for device %s has no fields" % device['name'])
|
||||||
key = (device['name'], device['instance_id'])
|
key = (device['name'], device['instance_id'])
|
||||||
value = ( VMSDSection, device )
|
value = ( VMSDSection, device )
|
||||||
self.section_classes[key] = value
|
self.section_classes[key] = value
|
||||||
@ -666,31 +678,34 @@ def default(self, o):
|
|||||||
|
|
||||||
jsonenc = JSONEncoder(indent=4, separators=(',', ': '))
|
jsonenc = JSONEncoder(indent=4, separators=(',', ': '))
|
||||||
|
|
||||||
if args.extract:
|
if not any([args.extract, args.dump == "state", args.dump == "desc"]):
|
||||||
dump = MigrationDump(args.file)
|
|
||||||
|
|
||||||
dump.read(desc_only = True)
|
|
||||||
print("desc.json")
|
|
||||||
f = open("desc.json", "w")
|
|
||||||
f.truncate()
|
|
||||||
f.write(jsonenc.encode(dump.vmsd_desc))
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
dump.read(write_memory = True)
|
|
||||||
dict = dump.getDict()
|
|
||||||
print("state.json")
|
|
||||||
f = open("state.json", "w")
|
|
||||||
f.truncate()
|
|
||||||
f.write(jsonenc.encode(dict))
|
|
||||||
f.close()
|
|
||||||
elif args.dump == "state":
|
|
||||||
dump = MigrationDump(args.file)
|
|
||||||
dump.read(dump_memory = args.memory)
|
|
||||||
dict = dump.getDict()
|
|
||||||
print(jsonenc.encode(dict))
|
|
||||||
elif args.dump == "desc":
|
|
||||||
dump = MigrationDump(args.file)
|
|
||||||
dump.read(desc_only = True)
|
|
||||||
print(jsonenc.encode(dump.vmsd_desc))
|
|
||||||
else:
|
|
||||||
raise Exception("Please specify either -x, -d state or -d desc")
|
raise Exception("Please specify either -x, -d state or -d desc")
|
||||||
|
|
||||||
|
try:
|
||||||
|
dump = MigrationDump(args.file)
|
||||||
|
|
||||||
|
if args.extract:
|
||||||
|
dump.read(desc_only = True)
|
||||||
|
|
||||||
|
print("desc.json")
|
||||||
|
f = open("desc.json", "w")
|
||||||
|
f.truncate()
|
||||||
|
f.write(jsonenc.encode(dump.vmsd_desc))
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
dump.read(write_memory = True)
|
||||||
|
dict = dump.getDict()
|
||||||
|
print("state.json")
|
||||||
|
f = open("state.json", "w")
|
||||||
|
f.truncate()
|
||||||
|
f.write(jsonenc.encode(dict))
|
||||||
|
f.close()
|
||||||
|
elif args.dump == "state":
|
||||||
|
dump.read(dump_memory = args.memory)
|
||||||
|
dict = dump.getDict()
|
||||||
|
print(jsonenc.encode(dict))
|
||||||
|
elif args.dump == "desc":
|
||||||
|
dump.read(desc_only = True)
|
||||||
|
print(jsonenc.encode(dump.vmsd_desc))
|
||||||
|
except Exception:
|
||||||
|
raise Exception("Full JSON dump:\n%s", dump.vmsd_json)
|
||||||
|
Loading…
Reference in New Issue
Block a user