Skip to content

Commit fbb0c92

Browse files
committed
Integer comparison on qube volume size
Disposable size is integer and disposable template size is string. For: QubesOS/qubes-issues#1512 For: QubesOS/qubes-issues#10525 Fixes: QubesOS/qubes-issues#10572 For: #771
1 parent 756ff94 commit fbb0c92

3 files changed

Lines changed: 51 additions & 26 deletions

File tree

qubes/tests/integ/dispvm.py

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -802,17 +802,23 @@ async def _test_018_preload_global(self):
802802
self.log_preload()
803803
logger.info("end")
804804

805-
def test_019_preload_refresh(self):
806-
"""Refresh preload on volume change."""
807-
self.loop.run_until_complete(self._test_019_preload_refresh())
805+
def test_019_preload_discard_outdated_volumes(self):
806+
"""Discard preload if volumes are outdated compared to its templates."""
807+
self.loop.run_until_complete(
808+
self._test_019_preload_discard_outdated_volumes()
809+
)
808810

809-
async def _test_019_preload_refresh(self):
811+
async def _test_019_preload_discard_outdated_volumes(self):
810812
logger.info("start")
811813
self.log_preload()
812814
preload_max = 1
813815

814816
self.disp_base.features["preload-dispvm-max"] = str(preload_max)
815817
for qube in [self.disp_base, self.disp_base.template]:
818+
logger.info(
819+
"discard because of outdated volume originating from %s",
820+
qube.name,
821+
)
816822
await self.wait_preload(preload_max)
817823
old_preload = self.disp_base.get_feat_preload()
818824
await qube.start()
@@ -832,25 +838,47 @@ async def _test_019_preload_refresh(self):
832838
self.log_preload()
833839
logger.info("end")
834840

835-
def test_020_preload_discard_outdated(self):
836-
"""Discard preload if properties differ from the disposable template."""
837-
self.loop.run_until_complete(self._test_020_preload_discard_outdated())
841+
def test_020_preload_discard_outdated_volume_size(self):
842+
"""Discard preload if private size differs with disposable template."""
843+
self.loop.run_until_complete(
844+
self._test_020_preload_discard_outdated_volume_size()
845+
)
838846

839-
async def _test_020_preload_discard_outdated(self):
847+
async def _test_020_preload_discard_outdated_volume_size(self):
848+
logger.info("start")
849+
self.log_preload()
850+
preload_max = 1
851+
self.disp_base.features["preload-dispvm-max"] = str(preload_max)
852+
await self.wait_preload(preload_max)
853+
preload_dispvm = self.disp_base.get_feat_preload()
854+
old_size = self.disp_base.volume_config["private"]["size"]
855+
size = int(old_size) + 512
856+
self.disp_base.storage.resize("private", size)
857+
self.app.save()
858+
dispvm = await asyncio.wait_for(
859+
qubes.vm.dispvm.DispVM.from_appvm(self.disp_base), 30
860+
)
861+
self.assertNotIn(dispvm.name, preload_dispvm)
862+
logger.info("end")
863+
864+
def test_021_preload_discard_outdated_setting(self):
865+
"""Discard preload if properties differ with the disposable template."""
866+
self.loop.run_until_complete(
867+
self._test_020_preload_discard_outdated_setting()
868+
)
869+
870+
async def _test_021_preload_discard_outdated_setting(self):
840871
logger.info("start")
841872
self.log_preload()
842873
preload_max = 1
843874
self.disp_base.features["preload-dispvm-max"] = str(preload_max)
844875
await self.wait_preload(preload_max)
845876
preload_dispvm = self.disp_base.get_feat_preload()
846877
self.disp_base.netvm = None
847-
try:
848-
dispvm = await asyncio.wait_for(
849-
qubes.vm.dispvm.DispVM.from_appvm(self.disp_base), 30
850-
)
851-
self.assertNotIn(dispvm.name, preload_dispvm)
852-
finally:
853-
await dispvm.cleanup()
878+
dispvm = await asyncio.wait_for(
879+
qubes.vm.dispvm.DispVM.from_appvm(self.disp_base), 30
880+
)
881+
self.assertNotIn(dispvm.name, preload_dispvm)
854882
logger.info("end")
855883

856884
@unittest.skipUnless(which("xdotool"), "xdotool not installed")

qubes/vm/dispvm.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -457,9 +457,8 @@ def is_preload_outdated(self) -> dict:
457457
return differed
458458

459459
appvm = self.template
460-
if (
461-
self.volume_config["private"]["size"]
462-
!= appvm.volume_config["private"]["size"]
460+
if int(self.volume_config["private"]["size"]) != int(
461+
appvm.volume_config["private"]["size"]
463462
):
464463
differed["volumes"] = ["private"]
465464
return differed

qubes/vm/mix/dvmtemplate.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -702,19 +702,17 @@ def request_preload(self) -> Optional["qubes.vm.dispvm.DispVM"]:
702702
for item in preload_dispvm:
703703
qube = self.app.domains[item]
704704
if outdated_reason := qube.is_preload_outdated():
705-
if "properties" in outdated_reason:
706-
discard_reason = "property(ies): " + ", ".join(
707-
map(str, outdated_reason["properties"])
708-
)
709-
else:
710-
discard_reason = "volume(s)"
705+
discard_reason = []
706+
for k, v in outdated_reason.items():
707+
discard_reason.append(k + ": " + ", ".join(map(str, v)))
708+
discard_reason_str = "; ".join(discard_reason)
711709
qube.log.warning(
712710
"Discarding preloaded disposable as it has has outdated %s",
713-
discard_reason,
711+
discard_reason_str,
714712
)
715713
# Not refilling now to deliver a disposable faster.
716714
self.remove_preload_from_list(
717-
[qube.name], reason="of outdated " + discard_reason
715+
[qube.name], reason="of outdated " + discard_reason_str
718716
)
719717
# Delay to not affect this run.
720718
asyncio.ensure_future(

0 commit comments

Comments
 (0)