Skip to content

Commit 81bc179

Browse files
authored
HDDS-11013. Ensure version is always set in ContainerCommandRequestProto (apache#6812)
1 parent b20ceeb commit 81bc179

6 files changed

Lines changed: 44 additions & 13 deletions

File tree

hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientGrpc.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.apache.hadoop.hdds.security.exception.SCMSecurityException;
5353
import org.apache.hadoop.hdds.tracing.GrpcClientInterceptor;
5454
import org.apache.hadoop.hdds.tracing.TracingUtil;
55+
import org.apache.hadoop.ozone.ClientVersion;
5556
import org.apache.hadoop.ozone.OzoneConfigKeys;
5657
import org.apache.hadoop.ozone.OzoneConsts;
5758
import java.util.concurrent.TimeoutException;
@@ -277,6 +278,11 @@ public ContainerCommandResponseProto sendCommand(
277278
List<DatanodeDetails> datanodeList = pipeline.getNodes();
278279
HashMap<DatanodeDetails, CompletableFuture<ContainerCommandResponseProto>>
279280
futureHashMap = new HashMap<>();
281+
if (!request.hasVersion()) {
282+
ContainerCommandRequestProto.Builder builder = ContainerCommandRequestProto.newBuilder(request);
283+
builder.setVersion(ClientVersion.CURRENT.toProtoValue());
284+
request = builder.build();
285+
}
280286
for (DatanodeDetails dn : datanodeList) {
281287
try {
282288
futureHashMap.put(dn, sendCommandAsync(request, dn).getResponse());
@@ -337,10 +343,13 @@ private XceiverClientReply sendCommandWithTraceIDAndRetry(
337343

338344
return TracingUtil.executeInNewSpan(spanName,
339345
() -> {
340-
ContainerCommandRequestProto finalPayload =
346+
ContainerCommandRequestProto.Builder builder =
341347
ContainerCommandRequestProto.newBuilder(request)
342-
.setTraceID(TracingUtil.exportCurrentSpan()).build();
343-
return sendCommandWithRetry(finalPayload, validators);
348+
.setTraceID(TracingUtil.exportCurrentSpan());
349+
if (!request.hasVersion()) {
350+
builder.setVersion(ClientVersion.CURRENT.toProtoValue());
351+
}
352+
return sendCommandWithRetry(builder.build(), validators);
344353
});
345354
}
346355

@@ -490,12 +499,14 @@ public XceiverClientReply sendCommandAsync(
490499

491500
try (Scope ignored = GlobalTracer.get().activateSpan(span)) {
492501

493-
ContainerCommandRequestProto finalPayload =
502+
ContainerCommandRequestProto.Builder builder =
494503
ContainerCommandRequestProto.newBuilder(request)
495-
.setTraceID(TracingUtil.exportCurrentSpan())
496-
.build();
504+
.setTraceID(TracingUtil.exportCurrentSpan());
505+
if (!request.hasVersion()) {
506+
builder.setVersion(ClientVersion.CURRENT.toProtoValue());
507+
}
497508
XceiverClientReply asyncReply =
498-
sendCommandAsync(finalPayload, pipeline.getFirstNode());
509+
sendCommandAsync(builder.build(), pipeline.getFirstNode());
499510
if (shouldBlockAndWaitAsyncReply(request)) {
500511
asyncReply.getResponse().get();
501512
}

hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestBlockOutputStreamCorrectness.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.apache.hadoop.hdds.scm.pipeline.MockPipeline;
4848
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
4949
import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
50+
import org.apache.hadoop.ozone.ClientVersion;
5051
import org.apache.hadoop.ozone.OzoneConsts;
5152
import org.apache.hadoop.ozone.container.common.helpers.BlockData;
5253
import org.apache.hadoop.ozone.container.common.helpers.ChunkInfo;
@@ -228,9 +229,12 @@ public Pipeline getPipeline() {
228229
}
229230

230231
@Override
231-
public XceiverClientReply sendCommandAsync(
232-
ContainerCommandRequestProto request
233-
) {
232+
public XceiverClientReply sendCommandAsync(ContainerCommandRequestProto request) {
233+
234+
if (!request.hasVersion()) {
235+
request = ContainerCommandRequestProto.newBuilder(request)
236+
.setVersion(ClientVersion.CURRENT.toProtoValue()).build();
237+
}
234238
final ContainerCommandResponseProto.Builder builder =
235239
ContainerCommandResponseProto.newBuilder()
236240
.setResult(Result.SUCCESS)

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/ratis/ContainerCommandRequestMessage.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.PutSmallFileRequestProto;
2525
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type;
2626
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.WriteChunkRequestProto;
27+
import org.apache.hadoop.ozone.ClientVersion;
2728
import org.apache.hadoop.ozone.common.Checksum;
2829

2930
import org.apache.ratis.protocol.Message;
@@ -44,6 +45,9 @@ public static ContainerCommandRequestMessage toMessage(
4445
if (traceId != null) {
4546
b.setTraceID(traceId);
4647
}
48+
if (!request.hasVersion()) {
49+
b.setVersion(ClientVersion.CURRENT.toProtoValue());
50+
}
4751

4852
ByteString data = ByteString.EMPTY;
4953
if (request.getCmdType() == Type.WriteChunk) {

hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/ratis/TestContainerCommandRequestMessage.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.PutSmallFileRequestProto;
3232
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type;
3333
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.WriteChunkRequestProto;
34+
import org.apache.hadoop.ozone.ClientVersion;
3435
import org.apache.hadoop.ozone.common.Checksum;
3536
import org.apache.hadoop.ozone.common.ChecksumData;
3637
import org.apache.hadoop.ozone.common.OzoneChecksumException;
@@ -91,6 +92,7 @@ static ContainerCommandRequestProto newPutSmallFile(
9192
.setContainerID(blockID.getContainerID())
9293
.setDatanodeUuid(UUID.randomUUID().toString())
9394
.setPutSmallFile(putSmallFileRequest)
95+
.setVersion(ClientVersion.CURRENT.toProtoValue())
9496
.build();
9597
}
9698

@@ -113,6 +115,7 @@ static ContainerCommandRequestProto newWriteChunk(
113115
.setContainerID(blockID.getContainerID())
114116
.setDatanodeUuid(UUID.randomUUID().toString())
115117
.setWriteChunk(writeChunkRequest)
118+
.setVersion(ClientVersion.CURRENT.toProtoValue())
116119
.build();
117120
}
118121

hadoop-hdds/common/src/test/java/org/apache/hadoop/ozone/container/ContainerTestHelper.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.apache.hadoop.hdds.scm.pipeline.MockPipeline;
3939
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
4040
import org.apache.hadoop.hdds.utils.UniqueId;
41+
import org.apache.hadoop.ozone.ClientVersion;
4142
import org.apache.hadoop.ozone.common.Checksum;
4243
import org.apache.hadoop.ozone.common.ChunkBuffer;
4344
import org.apache.hadoop.ozone.common.OzoneChecksumException;
@@ -540,6 +541,11 @@ public static byte[] generateData(int length, boolean random) {
540541
return data;
541542
}
542543

544+
public static ContainerCommandRequestProto getDummyCommandRequestProto(
545+
ContainerProtos.Type cmdType) {
546+
return getDummyCommandRequestProto(ClientVersion.CURRENT, cmdType, 0);
547+
}
548+
543549
/**
544550
* Construct fake protobuf messages for various types of requests.
545551
* This is tedious, however necessary to test. Protobuf classes are final
@@ -549,16 +555,17 @@ public static byte[] generateData(int length, boolean random) {
549555
* @return
550556
*/
551557
public static ContainerCommandRequestProto getDummyCommandRequestProto(
552-
ContainerProtos.Type cmdType) {
558+
ClientVersion clientVersion, ContainerProtos.Type cmdType, int replicaIndex) {
553559
final Builder builder =
554560
ContainerCommandRequestProto.newBuilder()
561+
.setVersion(clientVersion.toProtoValue())
555562
.setCmdType(cmdType)
556563
.setContainerID(DUMMY_CONTAINER_ID)
557564
.setDatanodeUuid(DATANODE_UUID);
558565

559566
final DatanodeBlockID fakeBlockId =
560567
DatanodeBlockID.newBuilder()
561-
.setContainerID(DUMMY_CONTAINER_ID).setLocalID(1)
568+
.setContainerID(DUMMY_CONTAINER_ID).setLocalID(1).setReplicaIndex(replicaIndex)
562569
.setBlockCommitSequenceId(101).build();
563570

564571
final ContainerProtos.ChunkInfo fakeChunkInfo =

hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestKeyValueStreamDataChannel.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.PutBlockRequestProto;
2525
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type;
2626
import org.apache.hadoop.hdds.ratis.ContainerCommandRequestMessage;
27+
import org.apache.hadoop.ozone.ClientVersion;
2728
import org.apache.hadoop.ozone.container.keyvalue.impl.KeyValueStreamDataChannel.Buffers;
2829
import org.apache.hadoop.ozone.container.keyvalue.impl.KeyValueStreamDataChannel.WriteMethod;
2930
import org.apache.ratis.client.api.DataStreamOutput;
@@ -70,14 +71,15 @@ public class TestKeyValueStreamDataChannel {
7071
public static final Logger LOG =
7172
LoggerFactory.getLogger(TestKeyValueStreamDataChannel.class);
7273

73-
static final ContainerCommandRequestProto PUT_BLOCK_PROTO
74+
private static final ContainerCommandRequestProto PUT_BLOCK_PROTO
7475
= ContainerCommandRequestProto.newBuilder()
7576
.setCmdType(Type.PutBlock)
7677
.setPutBlock(PutBlockRequestProto.newBuilder().setBlockData(
7778
BlockData.newBuilder().setBlockID(DatanodeBlockID.newBuilder()
7879
.setContainerID(222).setLocalID(333).build()).build()))
7980
.setDatanodeUuid("datanodeId")
8081
.setContainerID(111L)
82+
.setVersion(ClientVersion.CURRENT.toProtoValue())
8183
.build();
8284
static final int PUT_BLOCK_PROTO_SIZE = PUT_BLOCK_PROTO.toByteString().size();
8385
static {

0 commit comments

Comments
 (0)