@@ -452,29 +452,46 @@ private void WriteAsync<TContext>(long flushPage, ulong alignedDestinationAddres
452
452
}
453
453
454
454
long endPosition = 0 ;
455
- for ( int i = start / recordSize ; i < end / recordSize ; i ++ )
455
+ for ( int i = start / recordSize ; i < end / recordSize ; i ++ )
456
456
{
457
- if ( ! src [ i ] . info . Invalid )
457
+ byte * recordPtr = buffer . aligned_pointer + i * recordSize ;
458
+
459
+ // Retrieve reference to record struct
460
+ ref var record = ref Unsafe . AsRef < Record < Key , Value > > ( recordPtr ) ;
461
+ AddressInfo * key_address = null , value_address = null ;
462
+
463
+ // Zero out object reference addresses (AddressInfo) in the planned disk image
464
+ if ( KeyHasObjects ( ) )
465
+ {
466
+ key_address = GetKeyAddressInfo ( ( long ) recordPtr ) ;
467
+ * key_address = default ;
468
+ }
469
+ if ( ValueHasObjects ( ) )
470
+ {
471
+ value_address = GetValueAddressInfo ( ( long ) recordPtr ) ;
472
+ * value_address = default ;
473
+ }
474
+
475
+ // Now fill in AddressInfo data for the valid records
476
+ if ( ! record . info . Invalid )
458
477
{
459
478
var address = ( flushPage << LogPageSizeBits ) + i * recordSize ;
460
- if ( address < fuzzyStartLogicalAddress || ! src [ i ] . info . IsInNewVersion )
479
+ if ( address < fuzzyStartLogicalAddress || ! record . info . IsInNewVersion )
461
480
{
462
481
if ( KeyHasObjects ( ) )
463
482
{
464
483
long pos = ms . Position ;
465
484
keySerializer . Serialize ( ref src [ i ] . key ) ;
466
- var key_address = GetKeyAddressInfo ( ( long ) ( buffer . aligned_pointer + i * recordSize ) ) ;
467
485
key_address ->Address = pos ;
468
486
key_address ->Size = ( int ) ( ms . Position - pos ) ;
469
487
addr . Add ( ( long ) key_address ) ;
470
488
endPosition = pos + key_address ->Size ;
471
489
}
472
490
473
- if ( ValueHasObjects ( ) && ! src [ i ] . info . Tombstone )
491
+ if ( ValueHasObjects ( ) && ! record . info . Tombstone )
474
492
{
475
493
long pos = ms . Position ;
476
494
valueSerializer . Serialize ( ref src [ i ] . value ) ;
477
- var value_address = GetValueAddressInfo ( ( long ) ( buffer . aligned_pointer + i * recordSize ) ) ;
478
495
value_address ->Address = pos ;
479
496
value_address ->Size = ( int ) ( ms . Position - pos ) ;
480
497
addr . Add ( ( long ) value_address ) ;
@@ -484,7 +501,6 @@ private void WriteAsync<TContext>(long flushPage, ulong alignedDestinationAddres
484
501
else
485
502
{
486
503
// Mark v+1 records as invalid to avoid deserializing them on recovery
487
- ref var record = ref Unsafe . AsRef < Record < Key , Value > > ( buffer . aligned_pointer + i * recordSize ) ;
488
504
record . info . SetInvalid ( ) ;
489
505
}
490
506
}
@@ -846,7 +862,7 @@ public void Deserialize(byte *raw, long ptr, long untilptr, Record<Key, Value>[]
846
862
stream . Seek ( streamStartPos + key_addr ->Address - start_addr , SeekOrigin . Begin ) ;
847
863
}
848
864
849
- keySerializer . Deserialize ( out src [ ptr / recordSize ] . key ) ;
865
+ keySerializer . Deserialize ( out src [ ptr / recordSize ] . key ) ;
850
866
}
851
867
else
852
868
{
0 commit comments