Skip to content

Commit 69a46a9

Browse files
ChenSammixiaoyuyao
authored andcommitted
HDDS-1713. ReplicationManager fail to find proper node topology based… (#1112)
1 parent 7f1b76c commit 69a46a9

File tree

18 files changed

+219
-182
lines changed

18 files changed

+219
-182
lines changed

hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.apache.hadoop.hdds.protocol;
2020

2121
import com.google.common.base.Preconditions;
22+
import com.google.common.base.Strings;
2223
import org.apache.hadoop.classification.InterfaceAudience;
2324
import org.apache.hadoop.classification.InterfaceStability;
2425
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
@@ -193,12 +194,12 @@ public static DatanodeDetails getFromProtoBuf(
193194
builder.addPort(newPort(
194195
Port.Name.valueOf(port.getName().toUpperCase()), port.getValue()));
195196
}
196-
if (datanodeDetailsProto.hasNetworkLocation()) {
197-
builder.setNetworkLocation(datanodeDetailsProto.getNetworkLocation());
198-
}
199197
if (datanodeDetailsProto.hasNetworkName()) {
200198
builder.setNetworkName(datanodeDetailsProto.getNetworkName());
201199
}
200+
if (datanodeDetailsProto.hasNetworkLocation()) {
201+
builder.setNetworkLocation(datanodeDetailsProto.getNetworkLocation());
202+
}
202203
return builder.build();
203204
}
204205

@@ -219,8 +220,12 @@ public HddsProtos.DatanodeDetailsProto getProtoBufMessage() {
219220
if (certSerialId != null) {
220221
builder.setCertSerialId(certSerialId);
221222
}
222-
builder.setNetworkLocation(getNetworkLocation());
223-
builder.setNetworkName(getNetworkName());
223+
if (!Strings.isNullOrEmpty(getNetworkName())) {
224+
builder.setNetworkName(getNetworkName());
225+
}
226+
if (!Strings.isNullOrEmpty(getNetworkLocation())) {
227+
builder.setNetworkLocation(getNetworkLocation());
228+
}
224229

225230
for (Port port : ports) {
226231
builder.addPorts(HddsProtos.Port.newBuilder()

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/states/endpoint/RegisterEndpointTask.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ public EndpointStateMachine.EndPointStates call() throws Exception {
128128
datanodeDetails.setHostName(response.getHostname());
129129
datanodeDetails.setIpAddress(response.getIpAddress());
130130
}
131+
if (response.hasNetworkName() && response.hasNetworkLocation()) {
132+
datanodeDetails.setNetworkName(response.getNetworkName());
133+
datanodeDetails.setNetworkLocation(response.getNetworkLocation());
134+
}
131135
EndpointStateMachine.EndPointStates nextState =
132136
rpcEndPoint.getState().getNextState();
133137
rpcEndPoint.setState(nextState);

hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/protocol/commands/RegisteredCommand.java

Lines changed: 35 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
*/
1818
package org.apache.hadoop.ozone.protocol.commands;
1919

20-
import com.google.common.base.Preconditions;
20+
import com.google.common.base.Strings;
21+
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
2122
import org.apache.hadoop.hdds.protocol.proto
2223
.StorageContainerDatanodeProtocolProtos.SCMRegisteredResponseProto;
2324
import org.apache.hadoop.hdds.protocol.proto
@@ -28,23 +29,15 @@
2829
* Response to Datanode Register call.
2930
*/
3031
public class RegisteredCommand {
31-
private String datanodeUUID;
3232
private String clusterID;
3333
private ErrorCode error;
34-
private String hostname;
35-
private String ipAddress;
34+
private DatanodeDetails datanode;
3635

37-
public RegisteredCommand(final ErrorCode error, final String datanodeUUID,
36+
public RegisteredCommand(final ErrorCode error, final DatanodeDetails node,
3837
final String clusterID) {
39-
this(error, datanodeUUID, clusterID, null, null);
40-
}
41-
public RegisteredCommand(final ErrorCode error, final String datanodeUUID,
42-
final String clusterID, final String hostname, final String ipAddress) {
43-
this.datanodeUUID = datanodeUUID;
38+
this.datanode = node;
4439
this.clusterID = clusterID;
4540
this.error = error;
46-
this.hostname = hostname;
47-
this.ipAddress = ipAddress;
4841
}
4942

5043
/**
@@ -57,12 +50,12 @@ public static Builder newBuilder() {
5750
}
5851

5952
/**
60-
* Returns datanode UUID.
53+
* Returns datanode.
6154
*
62-
* @return - Datanode ID.
55+
* @return - Datanode.
6356
*/
64-
public String getDatanodeUUID() {
65-
return datanodeUUID;
57+
public DatanodeDetails getDatanode() {
58+
return datanode;
6659
}
6760

6861
/**
@@ -83,79 +76,54 @@ public ErrorCode getError() {
8376
return error;
8477
}
8578

86-
/**
87-
* Returns the hostname.
88-
*
89-
* @return - hostname
90-
*/
91-
public String getHostName() {
92-
return hostname;
93-
}
94-
95-
/**
96-
* Returns the ipAddress of the dataNode.
97-
*/
98-
public String getIpAddress() {
99-
return ipAddress;
100-
}
101-
10279
/**
10380
* Gets the protobuf message of this object.
10481
*
10582
* @return A protobuf message.
10683
*/
107-
public byte[] getProtoBufMessage() {
84+
public SCMRegisteredResponseProto getProtoBufMessage() {
10885
SCMRegisteredResponseProto.Builder builder =
10986
SCMRegisteredResponseProto.newBuilder()
87+
// TODO : Fix this later when we have multiple SCM support.
88+
// .setAddressList(addressList)
11089
.setClusterID(this.clusterID)
111-
.setDatanodeUUID(this.datanodeUUID)
90+
.setDatanodeUUID(this.datanode.getUuidString())
11291
.setErrorCode(this.error);
113-
if (hostname != null && ipAddress != null) {
114-
builder.setHostname(hostname).setIpAddress(ipAddress);
92+
if (!Strings.isNullOrEmpty(datanode.getHostName())) {
93+
builder.setHostname(datanode.getHostName());
94+
}
95+
if (!Strings.isNullOrEmpty(datanode.getIpAddress())) {
96+
builder.setIpAddress(datanode.getIpAddress());
97+
}
98+
if (!Strings.isNullOrEmpty(datanode.getNetworkName())) {
99+
builder.setNetworkName(datanode.getNetworkName());
115100
}
116-
return builder.build().toByteArray();
101+
if (!Strings.isNullOrEmpty(datanode.getNetworkLocation())) {
102+
builder.setNetworkLocation(datanode.getNetworkLocation());
103+
}
104+
105+
return builder.build();
117106
}
118107

119108
/**
120109
* A builder class to verify all values are sane.
121110
*/
122111
public static class Builder {
123-
private String datanodeUUID;
112+
private DatanodeDetails datanode;
124113
private String clusterID;
125114
private ErrorCode error;
126-
private String ipAddress;
127-
private String hostname;
128115

129116
/**
130-
* sets UUID.
117+
* sets datanode details.
131118
*
132-
* @param dnUUID - datanode UUID
119+
* @param node - datanode details
133120
* @return Builder
134121
*/
135-
public Builder setDatanodeUUID(String dnUUID) {
136-
this.datanodeUUID = dnUUID;
122+
public Builder setDatanode(DatanodeDetails node) {
123+
this.datanode = node;
137124
return this;
138125
}
139126

140-
/**
141-
* Create this object from a Protobuf message.
142-
*
143-
* @param response - RegisteredCmdResponseProto
144-
* @return RegisteredCommand
145-
*/
146-
public RegisteredCommand getFromProtobuf(SCMRegisteredResponseProto
147-
response) {
148-
Preconditions.checkNotNull(response);
149-
if (response.hasHostname() && response.hasIpAddress()) {
150-
return new RegisteredCommand(response.getErrorCode(),
151-
response.getDatanodeUUID(), response.getClusterID(),
152-
response.getHostname(), response.getIpAddress());
153-
} else {
154-
return new RegisteredCommand(response.getErrorCode(),
155-
response.getDatanodeUUID(), response.getClusterID());
156-
}
157-
}
158-
159127
/**
160128
* Sets cluster ID.
161129
*
@@ -178,38 +146,19 @@ public Builder setErrorCode(ErrorCode errorCode) {
178146
return this;
179147
}
180148

181-
/**
182-
* sets the hostname.
183-
*/
184-
public Builder setHostname(String host) {
185-
this.hostname = host;
186-
return this;
187-
}
188-
189-
public Builder setIpAddress(String ipAddr) {
190-
this.ipAddress = ipAddr;
191-
return this;
192-
}
193-
194149
/**
195150
* Build the command object.
196151
*
197152
* @return RegisteredCommand
198153
*/
199154
public RegisteredCommand build() {
200-
if ((this.error == ErrorCode.success) && (this.datanodeUUID == null
201-
|| this.datanodeUUID.isEmpty()) || (this.clusterID == null
202-
|| this.clusterID.isEmpty())) {
155+
if ((this.error == ErrorCode.success) && (this.datanode == null
156+
|| Strings.isNullOrEmpty(this.datanode.getUuidString())
157+
|| Strings.isNullOrEmpty(this.clusterID))) {
203158
throw new IllegalArgumentException("On success, RegisteredCommand "
204159
+ "needs datanodeUUID and ClusterID.");
205160
}
206-
if (hostname != null && ipAddress != null) {
207-
return new RegisteredCommand(this.error, this.datanodeUUID,
208-
this.clusterID, this.hostname, this.ipAddress);
209-
} else {
210-
return new RegisteredCommand(this.error, this.datanodeUUID,
211-
this.clusterID);
212-
}
161+
return new RegisteredCommand(this.error, this.datanode, this.clusterID);
213162
}
214163
}
215164
}

hadoop-hdds/container-service/src/main/proto/StorageContainerDatanodeProtocol.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ message SCMRegisteredResponseProto {
7070
optional SCMNodeAddressList addressList = 4;
7171
optional string hostname = 5;
7272
optional string ipAddress = 6;
73+
optional string networkName = 7;
74+
optional string networkLocation = 8;
7375
}
7476

7577
/**

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManager.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,19 @@ void processNodeReport(DatanodeDetails datanodeDetails,
173173
List<SCMCommand> getCommandQueue(UUID dnID);
174174

175175
/**
176-
* Given datanode host address, returns the DatanodeDetails for the
177-
* node.
176+
* Given datanode uuid, returns the DatanodeDetails for the node.
178177
*
179-
* @param address node host address
178+
* @param uuid datanode uuid
180179
* @return the given datanode, or null if not found
181180
*/
182-
DatanodeDetails getNode(String address);
181+
DatanodeDetails getNodeByUuid(String uuid);
182+
183+
/**
184+
* Given datanode address(Ipaddress or hostname), returns the DatanodeDetails
185+
* for the node.
186+
*
187+
* @param address datanode address
188+
* @return the given datanode, or null if not found
189+
*/
190+
DatanodeDetails getNodeByAddress(String address);
183191
}

0 commit comments

Comments
 (0)