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 ):
1818 try :
@@ -25,6 +25,28 @@ def try_to_create_sr_with_missing_device(sr_type, label, host):
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 ):
2951 """ Storage migration of a shutdown VM, then migrate it back. """
3052 prov_sr = vm .get_sr ()
@@ -197,30 +219,23 @@ def randstream(vm: VM, args: str) -> str:
197219
198220def coalesce_integrity (vm : VM , vdi : VDI , vdi_op : CoalesceOperation , defer : Defer ):
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 match vdi_op :
217232 case 'clone' : new_vdi = vdi .clone ()
218233 case 'snapshot' : new_vdi = vdi .snapshot ()
219234 defer (lambda : new_vdi .destroy () if new_vdi is not None else None )
220235
221236 # add some data in a non-used place, and overwrite an already used one
222- checksum2bis = randstream (vm , f'generate --seed 1 --position { vdi_size // 2 } --size { stream_size } { dev } ' )
223- checksum4 = randstream (vm , f'generate --position { stream_size } --size { stream_size } { dev } ' )
237+ checksum2bis = randstream (vm , f'generate --seed 0 --position { vdi_size // 2 } --size { stream_size } { dev } ' )
238+ checksum4 = randstream (vm , f'generate --seed 1 -- position { stream_size } --size { stream_size } { dev } ' )
224239 # make sure we can write that data before the coalesce
225240 randstream (
226241 vm , f'validate --expected-checksum { checksum2bis } --position { vdi_size // 2 } --size { stream_size } { dev } ' ,
@@ -233,13 +248,7 @@ def coalesce_integrity(vm: VM, vdi: VDI, vdi_op: CoalesceOperation, defer: Defer
233248 new_vdi = vdi .wait_for_coalesce (new_vdi .destroy )
234249
235250 # verify the data is still as expected
236- randstream (vm , f'validate --expected-checksum { checksum1 } --size { stream_size } { dev } ' )
237- randstream (
238- vm , f'validate --expected-checksum { checksum2bis } --position { vdi_size // 2 } --size { stream_size } { dev } ' ,
239- )
240- randstream (
241- vm , f'validate --expected-checksum { checksum3 } --position { vdi_size - stream_size } --size { stream_size } { dev } '
242- )
251+ validate_partially_populated_device (vm , dev , vdi_size , (checksum1 , checksum2bis , checksum3 ))
243252 randstream (
244253 vm , f'validate --expected-checksum { checksum4 } --position { stream_size } --size { stream_size } { dev } '
245254 )
0 commit comments