/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.jstorm.yarn.registry; import com.alibaba.jstorm.yarn.constants.JstormKeys; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.registry.client.api.BindFlags; import org.apache.hadoop.registry.client.api.RegistryOperations; import org.apache.hadoop.registry.client.binding.RegistryUtils; import org.apache.hadoop.registry.client.types.ServiceRecord; import org.apache.hadoop.yarn.api.records.ContainerId; import java.io.IOException; import java.util.Date; import java.util.List; /** * every container has a view which indicate used resources include core memory,port etc * * Created by fengjian on 16/3/29. */ public class ContainersView { private static final Log LOG = LogFactory.getLog(ContainersView.class); private String instanceName; private String host; private ContainerId containerId; private RegistryOperations registryOperations; public ContainersView(String instanceName, String host, ContainerId containerId, RegistryOperations registryOperations) { this.instanceName = instanceName; this.containerId = containerId; this.registryOperations = registryOperations; this.host = host; } public List<String> getContainerFreePorts() { return null; } public List<String> getHostUsedPort() { return null; } public List<String> findFreePorts(int count) { return null; } public String getHostPath() { String hostPath = RegistryUtils.servicePath( JstormKeys.APP_TYPE, this.instanceName, host); return hostPath; } /** * see if anyone is updating host's port list, if not start , update this host itself * timeout is 45 seconds * * @throws InterruptedException * @throws IOException */ private void tryHostLock() throws Exception { String hostPath = getHostPath(); //if path has created 60 seconds ago, then delete if (registryOperations.exists(hostPath)) { try { ServiceRecord host = registryOperations.resolve(hostPath); Long cTime = Long.parseLong(host.get("cTime", "0")); Date now = new Date(); if (now.getTime() - cTime > 60 * 1000 || cTime > now.getTime()) registryOperations.delete(hostPath, true); } catch (Exception ex) { LOG.error(ex); // registryOperations.delete(hostPath, true); } } int failedCount = 45; while (!registryOperations.mknode(hostPath, true)) { Thread.sleep(1000); failedCount--; if (failedCount <= 0) break; } if (failedCount > 0) { ServiceRecord sr = new ServiceRecord(); Date date = new Date(); date.getTime(); sr.set("cTime", String.valueOf(date.getTime())); registryOperations.bind(hostPath, sr, BindFlags.OVERWRITE); return; } throw new Exception("can't get host lock"); } private void releaseHostLock() throws IOException { String hostPath = getHostPath(); registryOperations.delete(hostPath, true); } }