1212from lib .vdi import VDI , ImageFormat
1313from lib .vm import VM
1414
15- from typing import Literal
15+ from typing import Literal , Tuple
1616
1717def try_to_create_sr_with_missing_device (sr_type , label , host ) -> None :
1818 try :
@@ -25,6 +25,28 @@ def try_to_create_sr_with_missing_device(sr_type, label, host) -> None:
2525 return
2626 assert False , 'SR creation should not have succeeded!'
2727
28+ def partial_stream_size (vdi_size : int ) -> int :
29+ return min ((vdi_size // 16 // (32 * KiB )) * (32 * KiB ), 2 * GiB )
30+
31+ def partially_populate_device (vm : VM , dev_path : str , dev_size : int ) -> Tuple [str , str , str ]:
32+ logging .info (f"Generate { dev_path } content" )
33+ size = partial_stream_size (dev_size )
34+ # generate at the start, in the middle and the end of the disk
35+ # use seeds unlikely to collide with other usages
36+ checksum1 = randstream (vm , f'generate --seed 10 --size { size } { dev_path } ' )
37+ checksum2 = randstream (vm , f'generate --seed 11 --position { dev_size // 2 } --size { size } { dev_path } ' )
38+ checksum3 = randstream (vm , f'generate --seed 12 --position { dev_size - size } --size { size } { dev_path } ' )
39+ return (checksum1 , checksum2 , checksum3 )
40+
41+ def validate_partially_populated_device (vm : VM , dev_path : str , dev_size : int , checksums : Tuple [str , str , str ]) -> None :
42+ logging .info (f"Validate { dev_path } content" )
43+ size = partial_stream_size (dev_size )
44+ checksum1 , checksum2 , checksum3 = checksums
45+ randstream (vm , f'validate --expected-checksum { checksum1 } --size { size } { dev_path } ' )
46+ randstream (vm , f'validate --expected-checksum { checksum2 } --position { dev_size // 2 } --size { size } { dev_path } ' )
47+ randstream (vm , f'validate --expected-checksum { checksum3 } --position { dev_size - size } --size { size } { dev_path } ' )
48+
49+
2850def cold_migration_then_come_back (vm : VM , prov_host : Host , dest_host : Host , dest_sr : SR ) -> None :
2951 """ Storage migration of a shutdown VM, then migrate it back. """
3052 prov_sr = vm .get_sr ()
@@ -197,22 +219,15 @@ def randstream(vm: VM, args: str) -> str:
197219
198220def coalesce_integrity (vm : VM , vdi : VDI , vdi_op : CoalesceOperation , defer : Defer ) -> None :
199221 vdi_size = vdi .get_virtual_size ()
200- # second stream is 1/16 of the full one, truncated to a multiple of 32KiB
201- stream_size = min ((vdi_size // 16 // (32 * KiB )) * (32 * KiB ), 2 * GiB )
222+ stream_size = partial_stream_size (vdi_size )
202223 vbd = vm .connect_vdi (vdi )
203224 defer (lambda : vm .disconnect_vdi (vdi ))
204225
205226 dev = f'/dev/{ vbd .param_get ("device" )} '
206227 # generate at the start, in the middle and the end of the disk
207- checksum1 = randstream (vm , f'generate --size { stream_size } { dev } ' )
208- checksum2 = randstream (vm , f'generate --position { vdi_size // 2 } --size { stream_size } { dev } ' )
209- checksum3 = randstream (vm , f'generate --position { vdi_size - stream_size } --size { stream_size } { dev } ' )
228+ checksum1 , checksum2 , checksum3 = partially_populate_device (vm , dev , vdi_size )
210229 # make sure we can read that exact data before the snapshot/clone
211- randstream (vm , f'validate --expected-checksum { checksum1 } --size { stream_size } { dev } ' )
212- randstream (vm , f'validate --expected-checksum { checksum2 } --position { vdi_size // 2 } --size { stream_size } { dev } ' )
213- randstream (
214- vm , f'validate --expected-checksum { checksum3 } --position { vdi_size - stream_size } --size { stream_size } { dev } '
215- )
230+ validate_partially_populated_device (vm , dev , vdi_size , (checksum1 , checksum2 , checksum3 ))
216231 new_vdi : VDI | None = None
217232 match vdi_op :
218233 case 'clone' : new_vdi = vdi .clone ()
@@ -221,8 +236,8 @@ def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer
221236 assert vdi is not None
222237
223238 # add some data in a non-used place, and overwrite an already used one
224- checksum2bis = randstream (vm , f'generate --seed 1 --position { vdi_size // 2 } --size { stream_size } { dev } ' )
225- checksum4 = randstream (vm , f'generate --position { stream_size } --size { stream_size } { dev } ' )
239+ checksum2bis = randstream (vm , f'generate --seed 0 --position { vdi_size // 2 } --size { stream_size } { dev } ' )
240+ checksum4 = randstream (vm , f'generate --seed 1 -- position { stream_size } --size { stream_size } { dev } ' )
226241 # make sure we can write that data before the coalesce
227242 randstream (
228243 vm , f'validate --expected-checksum { checksum2bis } --position { vdi_size // 2 } --size { stream_size } { dev } ' ,
@@ -236,13 +251,7 @@ def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer
236251 new_vdi = None
237252
238253 # verify the data is still as expected
239- randstream (vm , f'validate --expected-checksum { checksum1 } --size { stream_size } { dev } ' )
240- randstream (
241- vm , f'validate --expected-checksum { checksum2bis } --position { vdi_size // 2 } --size { stream_size } { dev } ' ,
242- )
243- randstream (
244- vm , f'validate --expected-checksum { checksum3 } --position { vdi_size - stream_size } --size { stream_size } { dev } '
245- )
254+ validate_partially_populated_device (vm , dev , vdi_size , (checksum1 , checksum2bis , checksum3 ))
246255 randstream (
247256 vm , f'validate --expected-checksum { checksum4 } --position { stream_size } --size { stream_size } { dev } '
248257 )
0 commit comments