From 3faaac095d7405754c5314d9b957b3df4a7f156e Mon Sep 17 00:00:00 2001 From: "Y. SREENIVASULU REDDY" Date: Sat, 7 Feb 2026 20:16:12 +0530 Subject: [PATCH 1/3] HBASE-29871 During WAL write times out add DataNode address in. the exception message --- .../hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java | 5 +++-- .../io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java | 7 ++++--- .../io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java | 4 +++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java index 2dcbf56ade8f..9052775d0e0b 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java @@ -333,8 +333,9 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == READER_IDLE) { - failed(ctx.channel(), - () -> new IOException("Timeout(" + timeoutMs + "ms) waiting for response")); + failed(ctx.channel(), () -> new IOException( + "Timeout(" + timeoutMs + "ms) waiting for response from datanode " + ctx.channel() + .remoteAddress())); } else if (e.state() == WRITER_IDLE) { PacketHeader heartbeat = new PacketHeader(4, 0, HEART_BEAT_SEQNO, false, 0, false); int len = heartbeat.getSerializedSize(); diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java index 1f1da6615586..ce051852d378 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java @@ -345,7 +345,8 @@ protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp if (PipelineAck.isRestartOOBStatus(pipelineStatus)) { throw new IOException("datanode " + dnInfo + " is restarting"); } - String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink(); + String logInfo = + "ack with firstBadLink as " + resp.getFirstBadLink() + " from datanode " + dnInfo; if (resp.getStatus() != Status.SUCCESS) { if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) { throw new InvalidBlockTokenException("Got access token error" + ", status message " @@ -378,8 +379,8 @@ public void channelInactive(ChannelHandlerContext ctx) throws Exception { @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent && ((IdleStateEvent) evt).state() == READER_IDLE) { - promise - .tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response")); + promise.tryFailure(new IOException( + "Timeout(" + timeoutMs + "ms) waiting for response from datanode " + dnInfo)); } else { super.userEventTriggered(ctx, evt); } diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java index a39c4fba7919..19a7c5e0b711 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java @@ -607,7 +607,9 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent && ((IdleStateEvent) evt).state() == READER_IDLE) { - promise.tryFailure(new IOException("Timeout(" + timeoutMs + "ms) waiting for response")); + promise.tryFailure(new IOException( + "Timeout(" + timeoutMs + "ms) waiting for response from datanode " + ctx.channel() + .remoteAddress())); } else { super.userEventTriggered(ctx, evt); } From 435757aecd94ea858dff9532635c26987852a661 Mon Sep 17 00:00:00 2001 From: "Y. SREENIVASULU REDDY" Date: Tue, 10 Feb 2026 09:37:55 +0530 Subject: [PATCH 2/3] HBASE-29871 During WAL write times out add DataNode address in. the exception message --- .../hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java | 5 ++--- .../io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java index 9052775d0e0b..0987c482edb7 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.java @@ -333,9 +333,8 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == READER_IDLE) { - failed(ctx.channel(), () -> new IOException( - "Timeout(" + timeoutMs + "ms) waiting for response from datanode " + ctx.channel() - .remoteAddress())); + failed(ctx.channel(), () -> new IOException("Timeout(" + timeoutMs + + "ms) waiting for response from datanode " + ctx.channel().remoteAddress())); } else if (e.state() == WRITER_IDLE) { PacketHeader heartbeat = new PacketHeader(4, 0, HEART_BEAT_SEQNO, false, 0, false); int len = heartbeat.getSerializedSize(); diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java index 19a7c5e0b711..3650854e6e18 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.java @@ -607,9 +607,8 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent && ((IdleStateEvent) evt).state() == READER_IDLE) { - promise.tryFailure(new IOException( - "Timeout(" + timeoutMs + "ms) waiting for response from datanode " + ctx.channel() - .remoteAddress())); + promise.tryFailure(new IOException("Timeout(" + timeoutMs + + "ms) waiting for response from datanode " + ctx.channel().remoteAddress())); } else { super.userEventTriggered(ctx, evt); } From 8494a3ea43b92881a319ea4c5814daaf70b1862e Mon Sep 17 00:00:00 2001 From: "Y. SREENIVASULU REDDY" Date: Wed, 11 Feb 2026 00:43:33 +0530 Subject: [PATCH 3/3] HBASE-29871 During WAL write times out add DataNode address in. the exception message --- .../io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java index ce051852d378..f064980b6ebc 100644 --- a/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java +++ b/hbase-asyncfs/src/main/java/org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputHelper.java @@ -345,8 +345,8 @@ protected void channelRead0(ChannelHandlerContext ctx, BlockOpResponseProto resp if (PipelineAck.isRestartOOBStatus(pipelineStatus)) { throw new IOException("datanode " + dnInfo + " is restarting"); } - String logInfo = - "ack with firstBadLink as " + resp.getFirstBadLink() + " from datanode " + dnInfo; + String logInfo = "ack with firstBadLink as " + resp.getFirstBadLink() + " from datanode " + + dnInfo.getHostName() + "/" + dnInfo.getInfoAddr(); if (resp.getStatus() != Status.SUCCESS) { if (resp.getStatus() == Status.ERROR_ACCESS_TOKEN) { throw new InvalidBlockTokenException("Got access token error" + ", status message " @@ -379,8 +379,9 @@ public void channelInactive(ChannelHandlerContext ctx) throws Exception { @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent && ((IdleStateEvent) evt).state() == READER_IDLE) { - promise.tryFailure(new IOException( - "Timeout(" + timeoutMs + "ms) waiting for response from datanode " + dnInfo)); + promise.tryFailure( + new IOException("Timeout(" + timeoutMs + "ms) waiting for response from datanode " + + dnInfo.getHostName() + "/" + dnInfo.getInfoAddr())); } else { super.userEventTriggered(ctx, evt); }