@@ -1666,5 +1666,105 @@ public void ClusterMigrateDataSlotsRange()
16661666 ClassicAssert . AreEqual ( Encoding . ASCII . GetString ( key ) , resp ) ;
16671667 }
16681668 }
1669+
1670+ [ Test , Order ( 16 ) ]
1671+ [ Category ( "CLUSTER" ) ]
1672+ public void ClusterMigrateLargePayload ( [ Values ] bool expiration , [ Values ] bool largePayload )
1673+ {
1674+ var r = new Random ( 674386 ) ;
1675+ var key = new byte [ 12 ] ;
1676+ ClusterTestUtils . RandomBytes ( ref r , ref key ) ;
1677+ var value = new byte [ largePayload ? 6789 : 123 ] ;
1678+ ClusterTestUtils . RandomBytes ( ref r , ref value ) ;
1679+
1680+ List < ( byte [ ] , byte [ ] ) > data = [ ( key , value ) ] ;
1681+ ClusterMigrateExpirationWithVaryingPayload ( expiration , data ) ;
1682+ }
1683+
1684+ [ Test , Order ( 16 ) ]
1685+ [ Category ( "CLUSTER" ) ]
1686+ public void ClusterMigrateIncreasingPayload ( [ Values ] bool expiration , [ Values ] bool largeSameSize )
1687+ {
1688+ var r = new Random ( 674386 ) ;
1689+ List < ( byte [ ] , byte [ ] ) > data = [ ] ;
1690+ var valueSize = largeSameSize ? 1234 : 12 ;
1691+
1692+ for ( var i = 0 ; i < 8 ; i ++ )
1693+ {
1694+ var key = new byte [ 12 ] ;
1695+ ClusterTestUtils . RandomBytes ( ref r , ref key ) ;
1696+ var value = new byte [ valueSize ] ;
1697+ ClusterTestUtils . RandomBytes ( ref r , ref value ) ;
1698+
1699+ data . Add ( ( key , value ) ) ;
1700+ if ( ! largeSameSize ) valueSize += valueSize * 2 ;
1701+ }
1702+
1703+ ClusterMigrateExpirationWithVaryingPayload ( expiration , data ) ;
1704+ }
1705+
1706+ private void ClusterMigrateExpirationWithVaryingPayload ( bool expiration , List < ( byte [ ] , byte [ ] ) > data )
1707+ {
1708+ var Shards = 2 ;
1709+ context . CreateInstances ( Shards , useTLS : UseTLS ) ;
1710+ context . CreateConnection ( useTLS : UseTLS ) ;
1711+
1712+ var srcNodeIndex = 0 ;
1713+ var dstNodeIndex = 1 ;
1714+ ClassicAssert . AreEqual ( "OK" , context . clusterTestUtils . AddDelSlotsRange ( srcNodeIndex , [ ( 0 , 16383 ) ] , addslot : true , logger : context . logger ) ) ;
1715+
1716+ context . clusterTestUtils . SetConfigEpoch ( srcNodeIndex , srcNodeIndex + 1 , logger : context . logger ) ;
1717+ context . clusterTestUtils . SetConfigEpoch ( dstNodeIndex , dstNodeIndex + 2 , logger : context . logger ) ;
1718+ context . clusterTestUtils . Meet ( srcNodeIndex , dstNodeIndex , logger : context . logger ) ;
1719+ context . clusterTestUtils . WaitUntilNodeIsKnown ( dstNodeIndex , srcNodeIndex , logger : context . logger ) ;
1720+ var config1 = context . clusterTestUtils . ClusterNodes ( srcNodeIndex , logger : context . logger ) ;
1721+ var config2 = context . clusterTestUtils . ClusterNodes ( dstNodeIndex , logger : context . logger ) ;
1722+ ClassicAssert . AreEqual ( config1 . GetBySlot ( 0 ) . NodeId , config2 . GetBySlot ( 0 ) . NodeId ) ;
1723+
1724+ var db = context . clusterTestUtils . GetDatabase ( ) ;
1725+
1726+ foreach ( var pair in data )
1727+ ClassicAssert . IsTrue ( db . StringSet ( pair . Item1 , pair . Item2 ) ) ;
1728+
1729+ foreach ( var pair in data )
1730+ {
1731+ var returnedValue = ( string ) db . StringGet ( pair . Item1 ) ;
1732+ ClassicAssert . AreEqual ( pair . Item2 , returnedValue ) ;
1733+ }
1734+
1735+ if ( expiration )
1736+ {
1737+ foreach ( var pair in data )
1738+ {
1739+ ClassicAssert . IsNull ( db . KeyTimeToLive ( pair . Item1 ) , "set key should not have an existing expiry" ) ;
1740+ ClassicAssert . AreEqual ( true , db . KeyExpire ( pair . Item1 , TimeSpan . FromSeconds ( 10000 ) ) ) ;
1741+ ClassicAssert . IsNotNull ( db . KeyTimeToLive ( pair . Item1 ) ) ;
1742+ }
1743+ }
1744+
1745+ var sourceEndPoint = context . clusterTestUtils . GetEndPoint ( srcNodeIndex ) ;
1746+ var targetEndPoint = context . clusterTestUtils . GetEndPoint ( dstNodeIndex ) ;
1747+ context . clusterTestUtils . MigrateSlots (
1748+ sourceEndPoint ,
1749+ targetEndPoint ,
1750+ [ 0 , 16383 ] ,
1751+ range : true ,
1752+ logger : context . logger ) ;
1753+
1754+ context . clusterTestUtils . WaitForMigrationCleanup ( srcNodeIndex , logger : context . logger ) ;
1755+
1756+ foreach ( var pair in data )
1757+ {
1758+ var returnedValue = ( string ) db . StringGet ( pair . Item1 ) ;
1759+ ClassicAssert . AreEqual ( pair . Item2 , returnedValue , "returned value mismatch after migration" ) ;
1760+ }
1761+
1762+
1763+ if ( expiration )
1764+ {
1765+ foreach ( var pair in data )
1766+ ClassicAssert . IsNotNull ( db . KeyTimeToLive ( pair . Item1 ) , "key does not have expiry after migration" ) ;
1767+ }
1768+ }
16691769 }
16701770}
0 commit comments