@@ -197,25 +197,52 @@ def randstream(vm: VM, args: str) -> str:
197197
198198def coalesce_integrity (vm : VM , vdi : VDI , vdi_op : CoalesceOperation , defer : Defer ):
199199 vdi_size = vdi .get_virtual_size ()
200- # second stream is 1/8 of the full one, truncated to a multiple of 32KiB, in order to
201- # be validable in a single command
202- second_stream_size = (vdi_size // 8 // (32 * KiB )) * (32 * KiB )
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 )
203202 vbd = vm .connect_vdi (vdi )
204203 defer (lambda : vm .disconnect_vdi (vdi ))
205204
206205 dev = f'/dev/{ vbd .param_get ("device" )} '
207- checksum = randstream (vm , f'generate { dev } ' )
208- # default seed is 0
209- randstream (vm , f'validate --expected-checksum { checksum } { dev } ' )
206+ # 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 } ' )
210+ # 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+ )
210216 match vdi_op :
211217 case 'clone' : new_vdi = vdi .clone ()
212218 case 'snapshot' : new_vdi = vdi .snapshot ()
213219 defer (lambda : new_vdi .destroy () if new_vdi is not None else None )
214220
215- randstream (vm , f'generate --seed 1 --size { second_stream_size } { dev } ' )
216- checksum = randstream (vm , f"validate { dev } " )
221+ # 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 } ' )
224+ # make sure we can write that data before the coalesce
225+ randstream (
226+ vm , f'validate --expected-checksum { checksum2bis } --position { vdi_size // 2 } --size { stream_size } { dev } ' ,
227+ )
228+ randstream (
229+ vm , f'validate --expected-checksum { checksum4 } --position { stream_size } --size { stream_size } { dev } '
230+ )
231+
232+ # trigger the coalesce
217233 new_vdi = vdi .wait_for_coalesce (new_vdi .destroy )
218- randstream (vm , f'validate --expected-checksum { checksum } { dev } ' )
234+
235+ # 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+ )
243+ randstream (
244+ vm , f'validate --expected-checksum { checksum4 } --position { stream_size } --size { stream_size } { dev } '
245+ )
219246
220247XVACompression = Literal ['none' , 'gzip' , 'zstd' ]
221248
0 commit comments