fix UnixChannelUtil#isBufferCopyNeededForWrite
fix not execute unit test in transport-native-unix-common-tests module Motivation: - Commit047da11
introduced an bug for still copy byteBuf for composed of n(n <= IOV_MAX) NIO direct buffers - Commit3c4dfed
add UnixChannelUtilTest in transport-native-unix-common-tests module, but not execute in maven compile as issue #6825, #6870 Modifications: - modified UnixChannelUtil#isBufferCopyNeededForWrite(ByteBuf), and UnixChannelUtilTest - move UnixChannelUtilTest into transport-native-unix-common module, and add packet scope method UnixChannelUtil#isBufferCopyNeededForWrite(ByteBuf, int) Result: - no copy byteBuf for composed of n(n <= IOV_MAX) NIO direct buffers - auto execute unit tests in UnixChannelUtilTest and it is easier to mock IOV_MAX
This commit is contained in:
parent
efe37e0d28
commit
c8a23028ad
@ -29,6 +29,10 @@ public final class UnixChannelUtil {
|
|||||||
* (We check this because otherwise we need to make it a new direct buffer.)
|
* (We check this because otherwise we need to make it a new direct buffer.)
|
||||||
*/
|
*/
|
||||||
public static boolean isBufferCopyNeededForWrite(ByteBuf byteBuf) {
|
public static boolean isBufferCopyNeededForWrite(ByteBuf byteBuf) {
|
||||||
return !byteBuf.hasMemoryAddress() || !byteBuf.isDirect() || byteBuf.nioBufferCount() > IOV_MAX;
|
return isBufferCopyNeededForWrite(byteBuf, IOV_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean isBufferCopyNeededForWrite(ByteBuf byteBuf, int iovMax) {
|
||||||
|
return !byteBuf.hasMemoryAddress() && (!byteBuf.isDirect() || byteBuf.nioBufferCount() > iovMax);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package io.netty.channel.unix.tests;
|
package io.netty.channel.unix;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.ByteBufAllocator;
|
import io.netty.buffer.ByteBufAllocator;
|
||||||
@ -27,13 +27,15 @@ import java.util.Collections;
|
|||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static io.netty.channel.unix.Limits.IOV_MAX;
|
|
||||||
import static io.netty.channel.unix.UnixChannelUtil.isBufferCopyNeededForWrite;
|
import static io.netty.channel.unix.UnixChannelUtil.isBufferCopyNeededForWrite;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
public class UnixChannelUtilTest {
|
public class UnixChannelUtilTest {
|
||||||
|
|
||||||
|
private static final int IOV_MAX = 1024;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPooledAllocatorIsBufferCopyNeededForWrite() {
|
public void testPooledAllocatorIsBufferCopyNeededForWrite() {
|
||||||
testIsBufferCopyNeededForWrite(PooledByteBufAllocator.DEFAULT);
|
testIsBufferCopyNeededForWrite(PooledByteBufAllocator.DEFAULT);
|
||||||
@ -46,16 +48,16 @@ public class UnixChannelUtilTest {
|
|||||||
|
|
||||||
private static void testIsBufferCopyNeededForWrite(ByteBufAllocator alloc) {
|
private static void testIsBufferCopyNeededForWrite(ByteBufAllocator alloc) {
|
||||||
ByteBuf byteBuf = alloc.directBuffer();
|
ByteBuf byteBuf = alloc.directBuffer();
|
||||||
assertFalse(isBufferCopyNeededForWrite(byteBuf));
|
assertFalse(isBufferCopyNeededForWrite(byteBuf, IOV_MAX));
|
||||||
assertFalse(isBufferCopyNeededForWrite(byteBuf.asReadOnly()));
|
assertFalse(isBufferCopyNeededForWrite(byteBuf.asReadOnly(), IOV_MAX));
|
||||||
assertTrue(byteBuf.release());
|
assertTrue(byteBuf.release());
|
||||||
|
|
||||||
byteBuf = alloc.heapBuffer();
|
byteBuf = alloc.heapBuffer();
|
||||||
assertTrue(isBufferCopyNeededForWrite(byteBuf));
|
assertTrue(isBufferCopyNeededForWrite(byteBuf, IOV_MAX));
|
||||||
assertTrue(isBufferCopyNeededForWrite(byteBuf.asReadOnly()));
|
assertTrue(isBufferCopyNeededForWrite(byteBuf.asReadOnly(), IOV_MAX));
|
||||||
assertTrue(byteBuf.release());
|
assertTrue(byteBuf.release());
|
||||||
|
|
||||||
assertCompositeByteBufIsBufferCopyNeededForWrite(alloc, 2, 0, true);
|
assertCompositeByteBufIsBufferCopyNeededForWrite(alloc, 2, 0, false);
|
||||||
assertCompositeByteBufIsBufferCopyNeededForWrite(alloc, IOV_MAX + 1, 0, true);
|
assertCompositeByteBufIsBufferCopyNeededForWrite(alloc, IOV_MAX + 1, 0, true);
|
||||||
assertCompositeByteBufIsBufferCopyNeededForWrite(alloc, 0, 2, true);
|
assertCompositeByteBufIsBufferCopyNeededForWrite(alloc, 0, 2, true);
|
||||||
assertCompositeByteBufIsBufferCopyNeededForWrite(alloc, 1, 1, true);
|
assertCompositeByteBufIsBufferCopyNeededForWrite(alloc, 1, 1, true);
|
||||||
@ -80,7 +82,7 @@ public class UnixChannelUtilTest {
|
|||||||
comp.addComponent(byteBuf);
|
comp.addComponent(byteBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
assertEquals(byteBufs.toString(), expected, isBufferCopyNeededForWrite(comp));
|
assertEquals(byteBufs.toString(), expected, isBufferCopyNeededForWrite(comp, IOV_MAX));
|
||||||
assertTrue(comp.release());
|
assertTrue(comp.release());
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user