Merge ~alexsander-souza/maas:lp2063835_to_3_5 into maas:3.5

Proposed by Alexsander de Souza
Status: Merged
Approved by: Alexsander de Souza
Approved revision: f404a65479d80959847e1131d467a7af15561b0b
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~alexsander-souza/maas:lp2063835_to_3_5
Merge into: maas:3.5
Diff against target: 74 lines (+34/-8)
2 files modified
src/maasserver/bootresources.py (+6/-8)
src/tests/maasserver/test_bootresources.py (+28/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Alexsander de Souza Approve
Review via email: mp+465095@code.launchpad.net

Commit message

fix(bootresources): handle incomplete files

if a resource was partially downloaded at the time of the migration,
discard the large object and schedule it for downloading again.

(cherry picked from commit 811612c009dc8c095c3b99062563801e3a991967)

To post a comment you must log in.
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

self-approve back-port

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp2063835_to_3_5 lp:~alexsander-souza/maas/+git/maas into -b 3.5 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: f404a65479d80959847e1131d467a7af15561b0b

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/bootresources.py b/src/maasserver/bootresources.py
2index 1f3562f..2e9678e 100644
3--- a/src/maasserver/bootresources.py
4+++ b/src/maasserver/bootresources.py
5@@ -1272,13 +1272,12 @@ def export_images_from_db(region: RegionController, target_dir: Path):
6 )
7
8 total_size = file.largefile.total_size
9- if file.largefile.size != total_size:
10- msg(f"skipping, size is {file.largefile.size} of {total_size}")
11- oids_to_delete.add(file.largefile.content.oid)
12- continue
13-
14 if lfile.valid:
15 msg("skipping, file already present")
16+ set_sync_status()
17+ elif file.largefile.size != total_size:
18+ # we need to download this again
19+ msg(f"ignoring, size is {file.largefile.size} of {total_size}")
20 else:
21 lfile.unlink()
22 msg("writing")
23@@ -1287,10 +1286,9 @@ def export_images_from_db(region: RegionController, target_dir: Path):
24 lfile.store() as dfd,
25 ):
26 shutil.copyfileobj(sfd, dfd)
27- oids_to_delete.add(file.largefile.content.oid)
28-
29- set_sync_status()
30+ set_sync_status()
31
32+ oids_to_delete.add(file.largefile.content.oid)
33 largefile_ids_to_delete.add(file.largefile_id)
34 # need to unset it because the post-delete signal will otherwise
35 # try to delete the largefile object, which is already handled
36diff --git a/src/tests/maasserver/test_bootresources.py b/src/tests/maasserver/test_bootresources.py
37index 2daeb48..5b14735 100644
38--- a/src/tests/maasserver/test_bootresources.py
39+++ b/src/tests/maasserver/test_bootresources.py
40@@ -196,6 +196,34 @@ class TestExportImagesFromDB:
41 cursor.execute("SELECT loid FROM pg_largeobject")
42 assert cursor.fetchall() == []
43
44+ def test_partial_largfile(self, controller, image_store_dir, factory):
45+ resource = factory.make_BootResource(
46+ name="ubuntu/jammy",
47+ architecture="s390x/generic",
48+ )
49+ resource_set = factory.make_BootResourceSet(
50+ resource=resource,
51+ version="20230901",
52+ label="stable",
53+ )
54+ resource_file = make_boot_resource_file_with_content_largefile(
55+ factory,
56+ resource_set=resource_set,
57+ filename="boot-initrd",
58+ content=b"some content",
59+ )
60+ largefile = resource_file.largefile
61+ largefile.size = 0
62+ largefile.save()
63+
64+ export_images_from_db(controller, image_store_dir)
65+
66+ assert reload_object(largefile) is None
67+ # largeobject also gets deleted
68+ with connection.cursor() as cursor:
69+ cursor.execute("SELECT loid FROM pg_largeobject")
70+ assert cursor.fetchall() == []
71+
72 def test_no_largefile_ignore(self, controller, image_store_dir, factory):
73 resource = factory.make_BootResource(
74 name="ubuntu/jammy",

Subscribers

People subscribed via source and target branches