Search in sources :

Example 1 with InstrumentedPool

use of reactor.netty.internal.shaded.reactor.pool.InstrumentedPool in project reactor-netty by reactor.

the class DefaultPooledConnectionProviderTest method doTestIssue1982.

private void doTestIssue1982(HttpProtocol[] serverProtocols, HttpProtocol[] clientProtocols, @Nullable Http2SslContextSpec serverCtx, @Nullable Http2SslContextSpec clientCtx) throws Exception {
    HttpServer server = serverCtx != null ? HttpServer.create().secure(sslContextSpec -> sslContextSpec.sslContext(serverCtx)) : HttpServer.create();
    disposableServer = server.protocol(serverProtocols).http2Settings(h2 -> h2.maxConcurrentStreams(20)).handle((req, res) -> res.sendString(Mono.just("testIssue1982").delayElement(Duration.ofMillis(100)))).bindNow();
    DefaultPooledConnectionProvider provider = (DefaultPooledConnectionProvider) ConnectionProvider.create("", 5);
    CountDownLatch latch = new CountDownLatch(1);
    AtomicInteger counter = new AtomicInteger();
    HttpClient mainClient = clientCtx != null ? HttpClient.create(provider).port(disposableServer.port()).secure(sslContextSpec -> sslContextSpec.sslContext(clientCtx)) : HttpClient.create(provider).port(disposableServer.port());
    HttpClient client = mainClient.protocol(clientProtocols).observe((conn, state) -> {
        if (state == ConnectionObserver.State.CONNECTED) {
            counter.incrementAndGet();
        }
        if (state == ConnectionObserver.State.RELEASED && counter.decrementAndGet() == 0) {
            latch.countDown();
        }
    });
    try {
        Flux.range(0, 80).flatMap(i -> client.get().uri("/").responseContent().aggregate().asString()).blockLast(Duration.ofSeconds(10));
        assertThat(latch.await(5, TimeUnit.SECONDS)).isTrue();
        @SuppressWarnings({ "unchecked", "rawtypes" }) InstrumentedPool<DefaultPooledConnectionProvider.PooledConnection> channelPool = provider.channelPools.values().toArray(new InstrumentedPool[0])[0];
        InstrumentedPool.PoolMetrics metrics = channelPool.metrics();
        assertThat(metrics.acquiredSize()).isEqualTo(0);
        assertThat(metrics.allocatedSize()).isEqualTo(metrics.idleSize());
    } finally {
        provider.disposeLater().block(Duration.ofSeconds(5));
    }
}
Also used : StepVerifier(reactor.test.StepVerifier) Http11SslContextSpec(reactor.netty.http.Http11SslContextSpec) SocketAddress(java.net.SocketAddress) PoolShutdownException(reactor.netty.internal.shaded.reactor.pool.PoolShutdownException) HttpProtocol(reactor.netty.http.HttpProtocol) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) Http2SslContextSpec(reactor.netty.http.Http2SslContextSpec) BaseHttpTest(reactor.netty.BaseHttpTest) Disabled(org.junit.jupiter.api.Disabled) StringUtils(org.apache.commons.lang3.StringUtils) Nullable(reactor.util.annotation.Nullable) AtomicReference(java.util.concurrent.atomic.AtomicReference) ConcurrentMap(java.util.concurrent.ConcurrentMap) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) InsecureTrustManagerFactory(io.netty.handler.ssl.util.InsecureTrustManagerFactory) ConnectionObserver(reactor.netty.ConnectionObserver) ChannelPromise(io.netty.channel.ChannelPromise) BeforeAll(org.junit.jupiter.api.BeforeAll) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Duration(java.time.Duration) ByteBufMono(reactor.netty.ByteBufMono) DefaultChannelPromise(io.netty.channel.DefaultChannelPromise) MethodSource(org.junit.jupiter.params.provider.MethodSource) ValueSource(org.junit.jupiter.params.provider.ValueSource) ChannelOutboundHandlerAdapter(io.netty.channel.ChannelOutboundHandlerAdapter) SslContext(io.netty.handler.ssl.SslContext) SelfSignedCertificate(io.netty.handler.ssl.util.SelfSignedCertificate) InstrumentedPool(reactor.netty.internal.shaded.reactor.pool.InstrumentedPool) HttpResponseStatus(io.netty.handler.codec.http.HttpResponseStatus) Mono(reactor.core.publisher.Mono) IOException(java.io.IOException) Signal(reactor.core.publisher.Signal) CertificateException(java.security.cert.CertificateException) InetSocketAddress(java.net.InetSocketAddress) Channel(io.netty.channel.Channel) Test(org.junit.jupiter.api.Test) TimeUnit(java.util.concurrent.TimeUnit) Flux(reactor.core.publisher.Flux) CountDownLatch(java.util.concurrent.CountDownLatch) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) HttpServer(reactor.netty.http.server.HttpServer) SSLException(javax.net.ssl.SSLException) List(java.util.List) SslProvider(io.netty.handler.ssl.SslProvider) SslContextBuilder(io.netty.handler.ssl.SslContextBuilder) HttpHeaderNames(io.netty.handler.codec.http.HttpHeaderNames) HttpClient(reactor.netty.http.client.HttpClient) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) HttpClient(reactor.netty.http.client.HttpClient) HttpServer(reactor.netty.http.server.HttpServer) InstrumentedPool(reactor.netty.internal.shaded.reactor.pool.InstrumentedPool) CountDownLatch(java.util.concurrent.CountDownLatch)

Example 2 with InstrumentedPool

use of reactor.netty.internal.shaded.reactor.pool.InstrumentedPool in project reactor-netty by reactor.

the class DefaultPooledConnectionProviderTest method testConnectionReturnedToParentPoolWhenNoActiveStreams.

@Test
void testConnectionReturnedToParentPoolWhenNoActiveStreams() throws Exception {
    Http2SslContextSpec serverCtx = Http2SslContextSpec.forServer(ssc.certificate(), ssc.privateKey());
    Http2SslContextSpec clientCtx = Http2SslContextSpec.forClient().configure(builder -> builder.trustManager(InsecureTrustManagerFactory.INSTANCE));
    disposableServer = createServer().wiretap(false).protocol(HttpProtocol.H2).secure(spec -> spec.sslContext(serverCtx)).route(routes -> routes.post("/", (req, res) -> res.send(req.receive().retain()))).bindNow();
    int requestsNum = 10;
    CountDownLatch latch = new CountDownLatch(1);
    DefaultPooledConnectionProvider provider = (DefaultPooledConnectionProvider) ConnectionProvider.create("testConnectionReturnedToParentPoolWhenNoActiveStreams", 5);
    AtomicInteger counter = new AtomicInteger();
    HttpClient client = createClient(provider, disposableServer.port()).wiretap(false).protocol(HttpProtocol.H2).secure(spec -> spec.sslContext(clientCtx)).observe((conn, state) -> {
        if (state == ConnectionObserver.State.CONNECTED) {
            counter.incrementAndGet();
        }
        if (state == ConnectionObserver.State.RELEASED && counter.decrementAndGet() == 0) {
            latch.countDown();
        }
    });
    try {
        Flux.range(0, requestsNum).flatMap(i -> client.post().uri("/").send(ByteBufMono.fromString(Mono.just("testConnectionReturnedToParentPoolWhenNoActiveStreams"))).responseContent().aggregate().asString()).blockLast(Duration.ofSeconds(5));
        assertThat(latch.await(5, TimeUnit.SECONDS)).isTrue();
        assertThat(provider.channelPools).hasSize(1);
        @SuppressWarnings({ "unchecked", "rawtypes" }) InstrumentedPool<DefaultPooledConnectionProvider.PooledConnection> channelPool = provider.channelPools.values().toArray(new InstrumentedPool[0])[0];
        InstrumentedPool.PoolMetrics metrics = channelPool.metrics();
        assertThat(metrics.acquiredSize()).isEqualTo(0);
        assertThat(metrics.allocatedSize()).isEqualTo(metrics.idleSize());
    } finally {
        provider.disposeLater().block(Duration.ofSeconds(5));
    }
}
Also used : Http2SslContextSpec(reactor.netty.http.Http2SslContextSpec) StepVerifier(reactor.test.StepVerifier) Http11SslContextSpec(reactor.netty.http.Http11SslContextSpec) SocketAddress(java.net.SocketAddress) PoolShutdownException(reactor.netty.internal.shaded.reactor.pool.PoolShutdownException) HttpProtocol(reactor.netty.http.HttpProtocol) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) Http2SslContextSpec(reactor.netty.http.Http2SslContextSpec) BaseHttpTest(reactor.netty.BaseHttpTest) Disabled(org.junit.jupiter.api.Disabled) StringUtils(org.apache.commons.lang3.StringUtils) Nullable(reactor.util.annotation.Nullable) AtomicReference(java.util.concurrent.atomic.AtomicReference) ConcurrentMap(java.util.concurrent.ConcurrentMap) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) InsecureTrustManagerFactory(io.netty.handler.ssl.util.InsecureTrustManagerFactory) ConnectionObserver(reactor.netty.ConnectionObserver) ChannelPromise(io.netty.channel.ChannelPromise) BeforeAll(org.junit.jupiter.api.BeforeAll) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Duration(java.time.Duration) ByteBufMono(reactor.netty.ByteBufMono) DefaultChannelPromise(io.netty.channel.DefaultChannelPromise) MethodSource(org.junit.jupiter.params.provider.MethodSource) ValueSource(org.junit.jupiter.params.provider.ValueSource) ChannelOutboundHandlerAdapter(io.netty.channel.ChannelOutboundHandlerAdapter) SslContext(io.netty.handler.ssl.SslContext) SelfSignedCertificate(io.netty.handler.ssl.util.SelfSignedCertificate) InstrumentedPool(reactor.netty.internal.shaded.reactor.pool.InstrumentedPool) HttpResponseStatus(io.netty.handler.codec.http.HttpResponseStatus) Mono(reactor.core.publisher.Mono) IOException(java.io.IOException) Signal(reactor.core.publisher.Signal) CertificateException(java.security.cert.CertificateException) InetSocketAddress(java.net.InetSocketAddress) Channel(io.netty.channel.Channel) Test(org.junit.jupiter.api.Test) TimeUnit(java.util.concurrent.TimeUnit) Flux(reactor.core.publisher.Flux) CountDownLatch(java.util.concurrent.CountDownLatch) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) HttpServer(reactor.netty.http.server.HttpServer) SSLException(javax.net.ssl.SSLException) List(java.util.List) SslProvider(io.netty.handler.ssl.SslProvider) SslContextBuilder(io.netty.handler.ssl.SslContextBuilder) HttpHeaderNames(io.netty.handler.codec.http.HttpHeaderNames) HttpClient(reactor.netty.http.client.HttpClient) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) HttpClient(reactor.netty.http.client.HttpClient) InstrumentedPool(reactor.netty.internal.shaded.reactor.pool.InstrumentedPool) CountDownLatch(java.util.concurrent.CountDownLatch) BaseHttpTest(reactor.netty.BaseHttpTest) Test(org.junit.jupiter.api.Test) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Aggregations

Channel (io.netty.channel.Channel)2 ChannelHandlerContext (io.netty.channel.ChannelHandlerContext)2 ChannelOutboundHandlerAdapter (io.netty.channel.ChannelOutboundHandlerAdapter)2 ChannelPromise (io.netty.channel.ChannelPromise)2 DefaultChannelPromise (io.netty.channel.DefaultChannelPromise)2 HttpHeaderNames (io.netty.handler.codec.http.HttpHeaderNames)2 HttpResponseStatus (io.netty.handler.codec.http.HttpResponseStatus)2 SslContext (io.netty.handler.ssl.SslContext)2 SslContextBuilder (io.netty.handler.ssl.SslContextBuilder)2 SslProvider (io.netty.handler.ssl.SslProvider)2 InsecureTrustManagerFactory (io.netty.handler.ssl.util.InsecureTrustManagerFactory)2 SelfSignedCertificate (io.netty.handler.ssl.util.SelfSignedCertificate)2 IOException (java.io.IOException)2 InetSocketAddress (java.net.InetSocketAddress)2 SocketAddress (java.net.SocketAddress)2 CertificateException (java.security.cert.CertificateException)2 Duration (java.time.Duration)2 List (java.util.List)2 ConcurrentMap (java.util.concurrent.ConcurrentMap)2 CountDownLatch (java.util.concurrent.CountDownLatch)2