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;
}
Domain
Subdomains
Calls
Called By
Source
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