1 /** 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 package org.apache.hadoop.yarn.server.api.protocolrecords.impl.pb; 20 21 import java.nio.ByteBuffer; 22 import java.util.ArrayList; 23 import java.util.HashMap; 24 import java.util.Iterator; 25 import java.util.List; 26 import java.util.Map; 27 28 import org.apache.hadoop.yarn.api.records.ApplicationId; 29 import org.apache.hadoop.yarn.api.records.ContainerId; 30 import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl; 31 import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl; 32 import org.apache.hadoop.yarn.api.records.impl.pb.ProtoBase; 33 import org.apache.hadoop.yarn.api.records.impl.pb.ProtoUtils; 34 import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationIdProto; 35 import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto; 36 import org.apache.hadoop.yarn.proto.YarnServerCommonProtos.MasterKeyProto; 37 import org.apache.hadoop.yarn.proto.YarnServerCommonProtos.NodeActionProto; 38 import org.apache.hadoop.yarn.proto.YarnServerCommonServiceProtos.NodeHeartbeatResponseProto; 39 import org.apache.hadoop.yarn.proto.YarnServerCommonServiceProtos.NodeHeartbeatResponseProtoOrBuilder; 40 import org.apache.hadoop.yarn.proto.YarnServerCommonServiceProtos.SystemCredentialsForAppsProto; 41 import org.apache.hadoop.yarn.server.api.protocolrecords.NodeHeartbeatResponse; 42 import org.apache.hadoop.yarn.server.api.records.MasterKey; 43 import org.apache.hadoop.yarn.server.api.records.NodeAction; 44 import org.apache.hadoop.yarn.server.api.records.impl.pb.MasterKeyPBImpl; 45 46 47 48 public class NodeHeartbeatResponsePBImpl extends 49 ProtoBase<NodeHeartbeatResponseProto> implements NodeHeartbeatResponse { 50 NodeHeartbeatResponseProto proto = NodeHeartbeatResponseProto.getDefaultInstance(); 51 NodeHeartbeatResponseProto.Builder builder = null; 52 boolean viaProto = false; 53 54 private List<ContainerId> containersToCleanup = null; 55 private List<ContainerId> containersToBeRemovedFromNM = null; 56 private List<ApplicationId> applicationsToCleanup = null; 57 private Map<ApplicationId, ByteBuffer> systemCredentials = null; 58 59 private MasterKey containerTokenMasterKey = null; 60 private MasterKey nmTokenMasterKey = null; 61 NodeHeartbeatResponsePBImpl()62 public NodeHeartbeatResponsePBImpl() { 63 builder = NodeHeartbeatResponseProto.newBuilder(); 64 } 65 NodeHeartbeatResponsePBImpl(NodeHeartbeatResponseProto proto)66 public NodeHeartbeatResponsePBImpl(NodeHeartbeatResponseProto proto) { 67 this.proto = proto; 68 viaProto = true; 69 } 70 getProto()71 public NodeHeartbeatResponseProto getProto() { 72 mergeLocalToProto(); 73 proto = viaProto ? proto : builder.build(); 74 viaProto = true; 75 return proto; 76 } 77 mergeLocalToBuilder()78 private void mergeLocalToBuilder() { 79 if (this.containersToCleanup != null) { 80 addContainersToCleanupToProto(); 81 } 82 if (this.applicationsToCleanup != null) { 83 addApplicationsToCleanupToProto(); 84 } 85 if (this.containersToBeRemovedFromNM != null) { 86 addContainersToBeRemovedFromNMToProto(); 87 } 88 if (this.containerTokenMasterKey != null) { 89 builder.setContainerTokenMasterKey( 90 convertToProtoFormat(this.containerTokenMasterKey)); 91 } 92 if (this.nmTokenMasterKey != null) { 93 builder.setNmTokenMasterKey( 94 convertToProtoFormat(this.nmTokenMasterKey)); 95 } 96 if (this.systemCredentials != null) { 97 addSystemCredentialsToProto(); 98 } 99 } 100 addSystemCredentialsToProto()101 private void addSystemCredentialsToProto() { 102 maybeInitBuilder(); 103 builder.clearSystemCredentialsForApps(); 104 for (Map.Entry<ApplicationId, ByteBuffer> entry : systemCredentials.entrySet()) { 105 builder.addSystemCredentialsForApps(SystemCredentialsForAppsProto.newBuilder() 106 .setAppId(convertToProtoFormat(entry.getKey())) 107 .setCredentialsForApp(ProtoUtils.convertToProtoFormat( 108 entry.getValue().duplicate()))); 109 } 110 } 111 mergeLocalToProto()112 private void mergeLocalToProto() { 113 if (viaProto) 114 maybeInitBuilder(); 115 mergeLocalToBuilder(); 116 proto = builder.build(); 117 viaProto = true; 118 } 119 maybeInitBuilder()120 private void maybeInitBuilder() { 121 if (viaProto || builder == null) { 122 builder = NodeHeartbeatResponseProto.newBuilder(proto); 123 } 124 viaProto = false; 125 } 126 127 128 @Override getResponseId()129 public int getResponseId() { 130 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 131 return (p.getResponseId()); 132 } 133 134 @Override setResponseId(int responseId)135 public void setResponseId(int responseId) { 136 maybeInitBuilder(); 137 builder.setResponseId((responseId)); 138 } 139 140 @Override getContainerTokenMasterKey()141 public MasterKey getContainerTokenMasterKey() { 142 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 143 if (this.containerTokenMasterKey != null) { 144 return this.containerTokenMasterKey; 145 } 146 if (!p.hasContainerTokenMasterKey()) { 147 return null; 148 } 149 this.containerTokenMasterKey = 150 convertFromProtoFormat(p.getContainerTokenMasterKey()); 151 return this.containerTokenMasterKey; 152 } 153 154 @Override setContainerTokenMasterKey(MasterKey masterKey)155 public void setContainerTokenMasterKey(MasterKey masterKey) { 156 maybeInitBuilder(); 157 if (masterKey == null) 158 builder.clearContainerTokenMasterKey(); 159 this.containerTokenMasterKey = masterKey; 160 } 161 162 @Override getNMTokenMasterKey()163 public MasterKey getNMTokenMasterKey() { 164 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 165 if (this.nmTokenMasterKey != null) { 166 return this.nmTokenMasterKey; 167 } 168 if (!p.hasNmTokenMasterKey()) { 169 return null; 170 } 171 this.nmTokenMasterKey = 172 convertFromProtoFormat(p.getNmTokenMasterKey()); 173 return this.nmTokenMasterKey; 174 } 175 176 @Override setNMTokenMasterKey(MasterKey masterKey)177 public void setNMTokenMasterKey(MasterKey masterKey) { 178 maybeInitBuilder(); 179 if (masterKey == null) 180 builder.clearNmTokenMasterKey(); 181 this.nmTokenMasterKey = masterKey; 182 } 183 184 @Override getNodeAction()185 public NodeAction getNodeAction() { 186 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 187 if (!p.hasNodeAction()) { 188 return null; 189 } 190 return (convertFromProtoFormat(p.getNodeAction())); 191 } 192 193 @Override setNodeAction(NodeAction nodeAction)194 public void setNodeAction(NodeAction nodeAction) { 195 maybeInitBuilder(); 196 if (nodeAction == null) { 197 builder.clearNodeAction(); 198 return; 199 } 200 builder.setNodeAction(convertToProtoFormat(nodeAction)); 201 } 202 203 @Override getDiagnosticsMessage()204 public String getDiagnosticsMessage() { 205 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 206 if (!p.hasDiagnosticsMessage()) { 207 return null; 208 } 209 return p.getDiagnosticsMessage(); 210 } 211 212 @Override setDiagnosticsMessage(String diagnosticsMessage)213 public void setDiagnosticsMessage(String diagnosticsMessage) { 214 maybeInitBuilder(); 215 if (diagnosticsMessage == null) { 216 builder.clearDiagnosticsMessage(); 217 return; 218 } 219 builder.setDiagnosticsMessage((diagnosticsMessage)); 220 } 221 222 @Override getContainersToCleanup()223 public List<ContainerId> getContainersToCleanup() { 224 initContainersToCleanup(); 225 return this.containersToCleanup; 226 } 227 228 @Override getContainersToBeRemovedFromNM()229 public List<ContainerId> getContainersToBeRemovedFromNM() { 230 initContainersToBeRemovedFromNM(); 231 return this.containersToBeRemovedFromNM; 232 } 233 initContainersToCleanup()234 private void initContainersToCleanup() { 235 if (this.containersToCleanup != null) { 236 return; 237 } 238 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 239 List<ContainerIdProto> list = p.getContainersToCleanupList(); 240 this.containersToCleanup = new ArrayList<ContainerId>(); 241 242 for (ContainerIdProto c : list) { 243 this.containersToCleanup.add(convertFromProtoFormat(c)); 244 } 245 } 246 initContainersToBeRemovedFromNM()247 private void initContainersToBeRemovedFromNM() { 248 if (this.containersToBeRemovedFromNM != null) { 249 return; 250 } 251 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 252 List<ContainerIdProto> list = p.getContainersToBeRemovedFromNmList(); 253 this.containersToBeRemovedFromNM = new ArrayList<ContainerId>(); 254 255 for (ContainerIdProto c : list) { 256 this.containersToBeRemovedFromNM.add(convertFromProtoFormat(c)); 257 } 258 } 259 260 @Override addAllContainersToCleanup( final List<ContainerId> containersToCleanup)261 public void addAllContainersToCleanup( 262 final List<ContainerId> containersToCleanup) { 263 if (containersToCleanup == null) 264 return; 265 initContainersToCleanup(); 266 this.containersToCleanup.addAll(containersToCleanup); 267 } 268 269 @Override 270 public void addContainersToBeRemovedFromNM(final List<ContainerId> containers)271 addContainersToBeRemovedFromNM(final List<ContainerId> containers) { 272 if (containers == null) 273 return; 274 initContainersToBeRemovedFromNM(); 275 this.containersToBeRemovedFromNM.addAll(containers); 276 } 277 addContainersToCleanupToProto()278 private void addContainersToCleanupToProto() { 279 maybeInitBuilder(); 280 builder.clearContainersToCleanup(); 281 if (containersToCleanup == null) 282 return; 283 Iterable<ContainerIdProto> iterable = new Iterable<ContainerIdProto>() { 284 285 @Override 286 public Iterator<ContainerIdProto> iterator() { 287 return new Iterator<ContainerIdProto>() { 288 289 Iterator<ContainerId> iter = containersToCleanup.iterator(); 290 291 @Override 292 public boolean hasNext() { 293 return iter.hasNext(); 294 } 295 296 @Override 297 public ContainerIdProto next() { 298 return convertToProtoFormat(iter.next()); 299 } 300 301 @Override 302 public void remove() { 303 throw new UnsupportedOperationException(); 304 305 } 306 }; 307 308 } 309 }; 310 builder.addAllContainersToCleanup(iterable); 311 } 312 addContainersToBeRemovedFromNMToProto()313 private void addContainersToBeRemovedFromNMToProto() { 314 maybeInitBuilder(); 315 builder.clearContainersToBeRemovedFromNm(); 316 if (containersToBeRemovedFromNM == null) 317 return; 318 Iterable<ContainerIdProto> iterable = new Iterable<ContainerIdProto>() { 319 320 @Override 321 public Iterator<ContainerIdProto> iterator() { 322 return new Iterator<ContainerIdProto>() { 323 324 Iterator<ContainerId> iter = containersToBeRemovedFromNM.iterator(); 325 326 @Override 327 public boolean hasNext() { 328 return iter.hasNext(); 329 } 330 331 @Override 332 public ContainerIdProto next() { 333 return convertToProtoFormat(iter.next()); 334 } 335 336 @Override 337 public void remove() { 338 throw new UnsupportedOperationException(); 339 340 } 341 }; 342 343 } 344 }; 345 builder.addAllContainersToBeRemovedFromNm(iterable); 346 } 347 348 @Override getApplicationsToCleanup()349 public List<ApplicationId> getApplicationsToCleanup() { 350 initApplicationsToCleanup(); 351 return this.applicationsToCleanup; 352 } 353 initApplicationsToCleanup()354 private void initApplicationsToCleanup() { 355 if (this.applicationsToCleanup != null) { 356 return; 357 } 358 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 359 List<ApplicationIdProto> list = p.getApplicationsToCleanupList(); 360 this.applicationsToCleanup = new ArrayList<ApplicationId>(); 361 362 for (ApplicationIdProto c : list) { 363 this.applicationsToCleanup.add(convertFromProtoFormat(c)); 364 } 365 } 366 367 @Override addAllApplicationsToCleanup( final List<ApplicationId> applicationsToCleanup)368 public void addAllApplicationsToCleanup( 369 final List<ApplicationId> applicationsToCleanup) { 370 if (applicationsToCleanup == null) 371 return; 372 initApplicationsToCleanup(); 373 this.applicationsToCleanup.addAll(applicationsToCleanup); 374 } 375 addApplicationsToCleanupToProto()376 private void addApplicationsToCleanupToProto() { 377 maybeInitBuilder(); 378 builder.clearApplicationsToCleanup(); 379 if (applicationsToCleanup == null) 380 return; 381 Iterable<ApplicationIdProto> iterable = new Iterable<ApplicationIdProto>() { 382 383 @Override 384 public Iterator<ApplicationIdProto> iterator() { 385 return new Iterator<ApplicationIdProto>() { 386 387 Iterator<ApplicationId> iter = applicationsToCleanup.iterator(); 388 389 @Override 390 public boolean hasNext() { 391 return iter.hasNext(); 392 } 393 394 @Override 395 public ApplicationIdProto next() { 396 return convertToProtoFormat(iter.next()); 397 } 398 399 @Override 400 public void remove() { 401 throw new UnsupportedOperationException(); 402 403 } 404 }; 405 406 } 407 }; 408 builder.addAllApplicationsToCleanup(iterable); 409 } 410 411 412 @Override getSystemCredentialsForApps()413 public Map<ApplicationId, ByteBuffer> getSystemCredentialsForApps() { 414 if (this.systemCredentials != null) { 415 return this.systemCredentials; 416 } 417 initSystemCredentials(); 418 return systemCredentials; 419 } 420 initSystemCredentials()421 private void initSystemCredentials() { 422 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 423 List<SystemCredentialsForAppsProto> list = p.getSystemCredentialsForAppsList(); 424 this.systemCredentials = new HashMap<ApplicationId, ByteBuffer> (); 425 for (SystemCredentialsForAppsProto c : list) { 426 ApplicationId appId = convertFromProtoFormat(c.getAppId()); 427 ByteBuffer byteBuffer = ProtoUtils.convertFromProtoFormat(c.getCredentialsForApp()); 428 this.systemCredentials.put(appId, byteBuffer); 429 } 430 } 431 432 @Override setSystemCredentialsForApps( Map<ApplicationId, ByteBuffer> systemCredentials)433 public void setSystemCredentialsForApps( 434 Map<ApplicationId, ByteBuffer> systemCredentials) { 435 if (systemCredentials == null || systemCredentials.isEmpty()) { 436 return; 437 } 438 maybeInitBuilder(); 439 this.systemCredentials = new HashMap<ApplicationId, ByteBuffer>(); 440 this.systemCredentials.putAll(systemCredentials); 441 } 442 443 @Override getNextHeartBeatInterval()444 public long getNextHeartBeatInterval() { 445 NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder; 446 return (p.getNextHeartBeatInterval()); 447 } 448 449 @Override setNextHeartBeatInterval(long nextHeartBeatInterval)450 public void setNextHeartBeatInterval(long nextHeartBeatInterval) { 451 maybeInitBuilder(); 452 builder.setNextHeartBeatInterval(nextHeartBeatInterval); 453 } 454 convertFromProtoFormat(ContainerIdProto p)455 private ContainerIdPBImpl convertFromProtoFormat(ContainerIdProto p) { 456 return new ContainerIdPBImpl(p); 457 } 458 convertToProtoFormat(ContainerId t)459 private ContainerIdProto convertToProtoFormat(ContainerId t) { 460 return ((ContainerIdPBImpl) t).getProto(); 461 } 462 convertFromProtoFormat(ApplicationIdProto p)463 private ApplicationIdPBImpl convertFromProtoFormat(ApplicationIdProto p) { 464 return new ApplicationIdPBImpl(p); 465 } 466 convertToProtoFormat(ApplicationId t)467 private ApplicationIdProto convertToProtoFormat(ApplicationId t) { 468 return ((ApplicationIdPBImpl) t).getProto(); 469 } 470 convertFromProtoFormat(NodeActionProto p)471 private NodeAction convertFromProtoFormat(NodeActionProto p) { 472 return NodeAction.valueOf(p.name()); 473 } 474 convertToProtoFormat(NodeAction t)475 private NodeActionProto convertToProtoFormat(NodeAction t) { 476 return NodeActionProto.valueOf(t.name()); 477 } 478 convertFromProtoFormat(MasterKeyProto p)479 private MasterKeyPBImpl convertFromProtoFormat(MasterKeyProto p) { 480 return new MasterKeyPBImpl(p); 481 } 482 convertToProtoFormat(MasterKey t)483 private MasterKeyProto convertToProtoFormat(MasterKey t) { 484 return ((MasterKeyPBImpl) t).getProto(); 485 } 486 } 487 488