/** * 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 org.apache.tajo.master.rm; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class WorkerResource implements Comparable<WorkerResource> { private static final Log LOG = LogFactory.getLog(WorkerResource.class); private String allocatedHost; private int peerRpcPort; private int queryMasterPort; private int clientPort; private int pullServerPort; private int httpPort; private float diskSlots; private int cpuCoreSlots; private int memoryMB; private float usedDiskSlots; private int usedMemoryMB; private int usedCpuCoreSlots; private long maxHeap; private long freeHeap; private long totalHeap; private int numRunningTasks; private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock rlock = lock.readLock(); private final Lock wlock = lock.writeLock(); private WorkerStatus workerStatus; private long lastHeartbeat; private boolean queryMasterMode; private boolean taskRunnerMode; private AtomicInteger numQueryMasterTasks = new AtomicInteger(0); public String getId() { return allocatedHost + ":" + queryMasterPort + ":" + peerRpcPort; } public String getAllocatedHost() { return allocatedHost; } public void setAllocatedHost(String allocatedHost) { this.allocatedHost = allocatedHost; } public float getDiskSlots() { return diskSlots; } public void setDiskSlots(float diskSlots) { this.diskSlots = diskSlots; } public int getCpuCoreSlots() { return cpuCoreSlots; } public void setCpuCoreSlots(int cpuCoreSlots) { this.cpuCoreSlots = cpuCoreSlots; } public int getMemoryMB() { try { rlock.lock(); return memoryMB; } finally { rlock.unlock(); } } public void setMemoryMB(int memoryMB) { try { wlock.lock(); this.memoryMB = memoryMB; } finally { wlock.unlock(); } } public float getAvailableDiskSlots() { return diskSlots - usedDiskSlots; } public int getAvailableMemoryMB() { return memoryMB - usedMemoryMB; } public int getAvailableCpuCoreSlots() { return cpuCoreSlots - usedCpuCoreSlots; } @Override public String toString() { return "host:" + allocatedHost + ", port=" + portsToStr() + ", slots=m:" + memoryMB + ",d:" + diskSlots + ",c:" + cpuCoreSlots + ", used=m:" + usedMemoryMB + ",d:" + usedDiskSlots + ",c:" + usedCpuCoreSlots; } public String portsToStr() { return queryMasterPort + "," + peerRpcPort + "," + clientPort + "," + pullServerPort; } public void setLastHeartbeat(long heartbeatTime) { this.lastHeartbeat = heartbeatTime; } public int getUsedMemoryMB() { try { rlock.lock(); return usedMemoryMB; } finally { rlock.unlock(); } } public void setUsedMemoryMB(int usedMemoryMB) { try { wlock.lock(); this.usedMemoryMB = usedMemoryMB; } finally { wlock.unlock(); } } public int getUsedCpuCoreSlots() { return usedCpuCoreSlots; } public void setUsedCpuCoreSlots(int usedCpuCoreSlots) { this.usedCpuCoreSlots = usedCpuCoreSlots; } public float getUsedDiskSlots() { return usedDiskSlots; } public void setUsedDiskSlots(int usedDiskSlots) { this.usedDiskSlots = usedDiskSlots; } public WorkerStatus getWorkerStatus() { return workerStatus; } public void setWorkerStatus(WorkerStatus workerStatus) { this.workerStatus = workerStatus; } public long getLastHeartbeat() { return lastHeartbeat; } public boolean isQueryMasterMode() { return queryMasterMode; } public void setQueryMasterMode(boolean queryMasterMode) { this.queryMasterMode = queryMasterMode; } public boolean isTaskRunnerMode() { return taskRunnerMode; } public void setTaskRunnerMode(boolean taskRunnerMode) { this.taskRunnerMode = taskRunnerMode; } public void releaseResource(float diskSlots, int memoryMB) { try { wlock.lock(); usedMemoryMB = usedMemoryMB - memoryMB; usedDiskSlots -= diskSlots; if(usedMemoryMB < 0) { LOG.warn("Used memory can't be a minus: " + usedMemoryMB); usedMemoryMB = 0; } if(usedDiskSlots < 0) { LOG.warn("Used disk slot can't be a minus: " + usedDiskSlots); usedDiskSlots = 0; } } finally { wlock.unlock(); } } public void allocateResource(float diskSlots, int memoryMB) { try { wlock.lock(); usedMemoryMB += memoryMB; usedDiskSlots += diskSlots; if(usedMemoryMB > this.memoryMB) { usedMemoryMB = this.memoryMB; } if(usedDiskSlots > this.diskSlots) { usedDiskSlots = this.diskSlots; } } finally { wlock.unlock(); } } public int getPeerRpcPort() { return peerRpcPort; } public void setPeerRpcPort(int peerRpcPort) { this.peerRpcPort = peerRpcPort; } public int getQueryMasterPort() { return queryMasterPort; } public void setQueryMasterPort(int queryMasterPort) { this.queryMasterPort = queryMasterPort; } public int getClientPort() { return clientPort; } public void setClientPort(int clientPort) { this.clientPort = clientPort; } public int getPullServerPort() { return pullServerPort; } public void setPullServerPort(int pullServerPort) { this.pullServerPort = pullServerPort; } public int getHttpPort() { return httpPort; } public void setHttpPort(int httpPort) { this.httpPort = httpPort; } public long getMaxHeap() { return maxHeap; } public void setMaxHeap(long maxHeap) { this.maxHeap = maxHeap; } public long getFreeHeap() { return freeHeap; } public void setFreeHeap(long freeHeap) { this.freeHeap = freeHeap; } public long getTotalHeap() { return totalHeap; } public void setTotalHeap(long totalHeap) { this.totalHeap = totalHeap; } public int getNumRunningTasks() { return numRunningTasks; } public void setNumRunningTasks(int numRunningTasks) { this.numRunningTasks = numRunningTasks; } public int getNumQueryMasterTasks() { return numQueryMasterTasks.get(); } public void addNumQueryMasterTask(float diskSlots, int memoryMB) { numQueryMasterTasks.getAndIncrement(); allocateResource(diskSlots, memoryMB); } public void releaseQueryMasterTask(float diskSlots, int memoryMB) { numQueryMasterTasks.getAndDecrement(); releaseResource(diskSlots, memoryMB); } @Override public int compareTo(WorkerResource workerResource) { if(workerResource == null) { return 1; } return getId().compareTo(workerResource.getId()); } }