Home / Function/ retryWithTcp() — netty Function Reference

retryWithTcp() — netty Function Reference

Architecture documentation for the retryWithTcp() function in DnsQueryContext.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  4d492031_b30c_1800_087b_fedd91fd6347["retryWithTcp()"]
  360b8eed_0666_8e3d_9331_e795bb312381["DnsQueryContext"]
  4d492031_b30c_1800_087b_fedd91fd6347 -->|defined in| 360b8eed_0666_8e3d_9331_e795bb312381
  ff2b708f_f879_8705_1346_618909272134["finishSuccess()"]
  ff2b708f_f879_8705_1346_618909272134 -->|calls| 4d492031_b30c_1800_087b_fedd91fd6347
  c1b3ef8a_d203_e5e3_4c2f_67fdad9bbd92["finishFailure()"]
  c1b3ef8a_d203_e5e3_4c2f_67fdad9bbd92 -->|calls| 4d492031_b30c_1800_087b_fedd91fd6347
  597cf108_a486_921e_d8ff_fe8d9e0d3906["finishOriginal()"]
  4d492031_b30c_1800_087b_fedd91fd6347 -->|calls| 597cf108_a486_921e_d8ff_fe8d9e0d3906
  74bccd11_01b5_da96_3a42_7c9f607f3a24["isDone()"]
  4d492031_b30c_1800_087b_fedd91fd6347 -->|calls| 74bccd11_01b5_da96_3a42_7c9f607f3a24
  41c25c76_287c_2ab1_c00c_41ae4814b34c["release()"]
  4d492031_b30c_1800_087b_fedd91fd6347 -->|calls| 41c25c76_287c_2ab1_c00c_41ae4814b34c
  ff2b708f_f879_8705_1346_618909272134["finishSuccess()"]
  4d492031_b30c_1800_087b_fedd91fd6347 -->|calls| ff2b708f_f879_8705_1346_618909272134
  a9dac59a_cab6_1ec7_05db_d19f1ccc8856["AddressedEnvelopeAdapter()"]
  4d492031_b30c_1800_087b_fedd91fd6347 -->|calls| a9dac59a_cab6_1ec7_05db_d19f1ccc8856
  c1b3ef8a_d203_e5e3_4c2f_67fdad9bbd92["finishFailure()"]
  4d492031_b30c_1800_087b_fedd91fd6347 -->|calls| c1b3ef8a_d203_e5e3_4c2f_67fdad9bbd92
  d553b80a_9410_aa58_ac6c_ad8bcdf2e222["writeQuery()"]
  4d492031_b30c_1800_087b_fedd91fd6347 -->|calls| d553b80a_9410_aa58_ac6c_ad8bcdf2e222
  style 4d492031_b30c_1800_087b_fedd91fd6347 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

resolver-dns/src/main/java/io/netty/resolver/dns/DnsQueryContext.java lines 349–428

    private boolean retryWithTcp(final Object originalResult) {
        if (socketBootstrap == null) {
            return false;
        }

        socketBootstrap.connect(nameServerAddr).addListener((ChannelFutureListener) future -> {
            if (!future.isSuccess()) {
                logger.debug("{} Unable to fallback to TCP [{}: {}]",
                        future.channel(), id, nameServerAddr, future.cause());
                // TCP fallback failed, just use the truncated response or error.
                finishOriginal(originalResult, future);
                return;
            }
            final Channel tcpCh = future.channel();
            Promise<AddressedEnvelope<DnsResponse, InetSocketAddress>> promise =
                    tcpCh.eventLoop().newPromise();
            final TcpDnsQueryContext tcpCtx = new TcpDnsQueryContext(tcpCh,
                    (InetSocketAddress) tcpCh.remoteAddress(), queryContextManager, queryLifecycleObserver, 0,
                    recursionDesired, queryTimeoutMillis, question(), additionals, promise);
            tcpCh.pipeline().addLast(TCP_ENCODER);
            tcpCh.pipeline().addLast(new TcpDnsResponseDecoder());
            tcpCh.pipeline().addLast(new ChannelInboundHandlerAdapter() {
                @Override
                public void channelRead(ChannelHandlerContext ctx, Object msg) {
                    Channel tcpCh = ctx.channel();
                    DnsResponse response = (DnsResponse) msg;
                    int queryId = response.id();

                    if (logger.isDebugEnabled()) {
                        logger.debug("{} RECEIVED: TCP [{}: {}], {}", tcpCh, queryId,
                                tcpCh.remoteAddress(), response);
                    }

                    DnsQueryContext foundCtx = queryContextManager.get(nameServerAddr, queryId);
                    if (foundCtx != null && foundCtx.isDone()) {
                        logger.debug("{} Received a DNS response for a query that was timed out or cancelled " +
                                ": TCP [{}: {}]", tcpCh, queryId, nameServerAddr);
                        response.release();
                    } else if (foundCtx == tcpCtx) {
                        tcpCtx.finishSuccess(new AddressedEnvelopeAdapter(
                                (InetSocketAddress) ctx.channel().remoteAddress(),
                                (InetSocketAddress) ctx.channel().localAddress(),
                                response), false);
                    } else {
                        response.release();
                        tcpCtx.finishFailure("Received TCP DNS response with unexpected ID", null, false);
                        if (logger.isDebugEnabled()) {
                            logger.debug("{} Received a DNS response with an unexpected ID: TCP [{}: {}]",
                                    tcpCh, queryId, tcpCh.remoteAddress());
                        }
                    }
                }

                @Override
                public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
                    if (tcpCtx.finishFailure(
                            "TCP fallback error", cause, false) && logger.isDebugEnabled()) {
                        logger.debug("{} Error during processing response: TCP [{}: {}]",
                                ctx.channel(), id,
                                ctx.channel().remoteAddress(), cause);
                    }
                }
            });

            promise.addListener(
                    (FutureListener<AddressedEnvelope<DnsResponse, InetSocketAddress>>) future1 -> {
                        if (future1.isSuccess()) {
                            finishSuccess(future1.getNow(), false);
                            // Release the original result.
                            ReferenceCountUtil.release(originalResult);
                        } else {
                            // TCP fallback failed, just use the truncated response or error.
                            finishOriginal(originalResult, future1);
                        }
                        tcpCh.close();
                    });
            tcpCtx.writeQuery(true);
        });
        return true;
    }

Subdomains

Frequently Asked Questions

What does retryWithTcp() do?
retryWithTcp() is a function in the netty codebase, defined in resolver-dns/src/main/java/io/netty/resolver/dns/DnsQueryContext.java.
Where is retryWithTcp() defined?
retryWithTcp() is defined in resolver-dns/src/main/java/io/netty/resolver/dns/DnsQueryContext.java at line 349.
What does retryWithTcp() call?
retryWithTcp() calls 7 function(s): AddressedEnvelopeAdapter, finishFailure, finishOriginal, finishSuccess, isDone, release, writeQuery.
What calls retryWithTcp()?
retryWithTcp() is called by 2 function(s): finishFailure, finishSuccess.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free