@@ -579,3 +579,44 @@ func TestMVCCStore_ApplyMutations_ValueTooLarge(t *testing.T) {
579579 require .Error (t , err )
580580 assert .ErrorIs (t , err , ErrValueTooLarge )
581581}
582+
583+ // TestPebbleStore_SnapshotRestore_MaxSizeKey verifies that a key of exactly
584+ // maxSnapshotKeySize bytes survives a Snapshot()+Restore() round-trip.
585+ // The encoded on-disk Pebble key is maxSnapshotKeySize+timestampSize bytes;
586+ // previously the restore path used maxSnapshotKeySize as the limit and would
587+ // reject this key.
588+ func TestPebbleStore_SnapshotRestore_MaxSizeKey (t * testing.T ) {
589+ dir , err := os .MkdirTemp ("" , "pebble-maxkey-snap-*" )
590+ require .NoError (t , err )
591+ defer os .RemoveAll (dir )
592+
593+ s , err := NewPebbleStore (dir )
594+ require .NoError (t , err )
595+ defer func () { assert .NoError (t , s .Close ()) }()
596+
597+ ctx := context .Background ()
598+ bigKey := bytes .Repeat ([]byte ("k" ), maxSnapshotKeySize )
599+ require .NoError (t , s .PutAt (ctx , bigKey , []byte ("val" ), 1 , 0 ))
600+
601+ snap , err := s .Snapshot ()
602+ require .NoError (t , err )
603+ defer func () { assert .NoError (t , snap .Close ()) }()
604+
605+ var buf bytes.Buffer
606+ _ , err = snap .WriteTo (& buf )
607+ require .NoError (t , err )
608+
609+ dir2 , err := os .MkdirTemp ("" , "pebble-maxkey-restore-*" )
610+ require .NoError (t , err )
611+ defer os .RemoveAll (dir2 )
612+
613+ s2 , err := NewPebbleStore (dir2 )
614+ require .NoError (t , err )
615+ defer func () { assert .NoError (t , s2 .Close ()) }()
616+
617+ require .NoError (t , s2 .Restore (bytes .NewReader (buf .Bytes ())))
618+
619+ got , err := s2 .GetAt (ctx , bigKey , 1 )
620+ require .NoError (t , err )
621+ assert .Equal (t , []byte ("val" ), got )
622+ }
0 commit comments