@@ -145,27 +145,7 @@ public void recoveryAfterOom() {
145145
146146 @ Test
147147 public void testMessagesSize () throws Exception {
148- ProducerImpl <?> producer = mock (ProducerImpl .class );
149-
150- final ProducerConfigurationData producerConfigurationData = new ProducerConfigurationData ();
151- producerConfigurationData .setCompressionType (CompressionType .NONE );
152- PulsarClientImpl pulsarClient = mock (PulsarClientImpl .class );
153- ConnectionPool connectionPool = mock (ConnectionPool .class );
154- when (pulsarClient .getCnxPool ()).thenReturn (connectionPool );
155- MemoryLimitController memoryLimitController = mock (MemoryLimitController .class );
156- when (pulsarClient .getMemoryLimitController ()).thenReturn (memoryLimitController );
157- try {
158- Field clientFiled = HandlerState .class .getDeclaredField ("client" );
159- clientFiled .setAccessible (true );
160- clientFiled .set (producer , pulsarClient );
161- } catch (Exception e ){
162- fail (e .getMessage ());
163- }
164-
165- ByteBuffer payload = ByteBuffer .wrap ("payload" .getBytes (StandardCharsets .UTF_8 ));
166-
167- when (producer .getConfiguration ()).thenReturn (producerConfigurationData );
168- when (producer .encryptMessage (any (), any ())).thenReturn (ByteBufAllocator .DEFAULT .buffer ().writeBytes (payload ));
148+ ProducerImpl <?> producer = createTestProducer ();
169149
170150 final int initNum = 32 ;
171151 BatchMessageContainerImpl batchMessageContainer = new BatchMessageContainerImpl (producer );
@@ -181,16 +161,67 @@ public void testMessagesSize() throws Exception {
181161 assertEquals (batchMessageContainer .getMaxMessagesNum (), 200 );
182162 }
183163
164+ @ Test
165+ public void testEntryBucketHashRangeIsStampedWhenCreatingSendOperation () throws Exception {
166+ BatchMessageContainerImpl batchMessageContainer = new BatchMessageContainerImpl (createTestProducer ());
167+ ArrayList <MessageImpl <?>> messages = new ArrayList <>();
168+ try {
169+ MessageImpl <?> singleMessage = createMessage (1 );
170+ messages .add (singleMessage );
171+ batchMessageContainer .add (singleMessage , null , 0x3000 );
172+ batchMessageContainer .createOpSendMsg ();
173+ assertEquals (batchMessageContainer .messageMetadata .getEntryHashMin (), 0x3000 );
174+ assertEquals (batchMessageContainer .messageMetadata .getEntryHashMax (), 0x3000 );
175+
176+ batchMessageContainer .clear ();
177+ MessageImpl <?> firstMessage = createMessage (2 );
178+ MessageImpl <?> secondMessage = createMessage (3 );
179+ MessageImpl <?> thirdMessage = createMessage (4 );
180+ messages .add (firstMessage );
181+ messages .add (secondMessage );
182+ messages .add (thirdMessage );
183+ batchMessageContainer .add (firstMessage , null , 0x2000 );
184+ batchMessageContainer .add (secondMessage , null , 0x1000 );
185+ batchMessageContainer .add (thirdMessage , null , 0x1800 );
186+ batchMessageContainer .createOpSendMsg ();
187+ assertEquals (batchMessageContainer .messageMetadata .getEntryHashMin (), 0x1000 );
188+ assertEquals (batchMessageContainer .messageMetadata .getEntryHashMax (), 0x2000 );
189+ } finally {
190+ batchMessageContainer .discard (null );
191+ messages .forEach (ReferenceCountUtil ::safeRelease );
192+ }
193+ }
194+
195+ private MessageImpl <?> createMessage (long sequenceId ) {
196+ MessageMetadata messageMetadata = new MessageMetadata ();
197+ messageMetadata .setSequenceId (sequenceId );
198+ messageMetadata .setProducerName ("producer" );
199+ messageMetadata .setPublishTime (System .currentTimeMillis ());
200+ ByteBuffer payload = ByteBuffer .wrap ("payload" .getBytes (StandardCharsets .UTF_8 ));
201+ return MessageImpl .create (messageMetadata , payload , Schema .BYTES , null );
202+ }
203+
204+ private ProducerImpl <?> createTestProducer () throws Exception {
205+ ProducerImpl <?> producer = mock (ProducerImpl .class );
206+ ProducerConfigurationData producerConfigurationData = new ProducerConfigurationData ();
207+ producerConfigurationData .setCompressionType (CompressionType .NONE );
208+ PulsarClientImpl pulsarClient = mock (PulsarClientImpl .class );
209+ when (pulsarClient .getCnxPool ()).thenReturn (mock (ConnectionPool .class ));
210+ when (pulsarClient .getMemoryLimitController ()).thenReturn (mock (MemoryLimitController .class ));
211+ Field clientField = HandlerState .class .getDeclaredField ("client" );
212+ clientField .setAccessible (true );
213+ clientField .set (producer , pulsarClient );
214+ when (producer .getConfiguration ()).thenReturn (producerConfigurationData );
215+ when (producer .encryptMessage (any (), any ())).thenAnswer (__ -> ByteBufAllocator .DEFAULT .buffer ()
216+ .writeBytes ("payload" .getBytes (StandardCharsets .UTF_8 )));
217+ return producer ;
218+ }
219+
184220 private void addMessagesAndCreateOpSendMsg (BatchMessageContainerImpl batchMessageContainer , int num )
185221 throws Exception {
186222 ArrayList <MessageImpl <?>> messages = new ArrayList <>();
187223 for (int i = 0 ; i < num ; ++i ) {
188- MessageMetadata messageMetadata = new MessageMetadata ();
189- messageMetadata .setSequenceId (i );
190- messageMetadata .setProducerName ("producer" );
191- messageMetadata .setPublishTime (System .currentTimeMillis ());
192- ByteBuffer payload = ByteBuffer .wrap ("payload" .getBytes (StandardCharsets .UTF_8 ));
193- MessageImpl <?> message = MessageImpl .create (messageMetadata , payload , Schema .BYTES , null );
224+ MessageImpl <?> message = createMessage (i );
194225 messages .add (message );
195226 batchMessageContainer .add (message , null );
196227 }
0 commit comments