/**
* CopyRight by Chinamobile
*
* MessageQueuesForMem.java
*/
package com.chinamobile.bcbsp.comm;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* MessageQueuesForMem
* implements MessageQueuesInterface for only
* memory storage of the message queues.
*
* @author
* @version
*/
public class MessageQueuesForMem implements MessageQueuesInterface {
/**
* Outgoing Message Queues hash indexed by <WorkerManagerName:Port>
*/
private final ConcurrentHashMap<String, ConcurrentLinkedQueue<BSPMessage>> outgoingQueues = new ConcurrentHashMap<String, ConcurrentLinkedQueue<BSPMessage>>();
/**
* Incoming Message Queues hash indexed by vertexID(int)
*/
private ConcurrentHashMap<String, ConcurrentLinkedQueue<BSPMessage>> incomingQueues = new ConcurrentHashMap<String, ConcurrentLinkedQueue<BSPMessage>>();
/**
* Incomed Message Queues hash indexed by vertexID(int)
*/
private ConcurrentHashMap<String, ConcurrentLinkedQueue<BSPMessage>> incomedQueues = new ConcurrentHashMap<String, ConcurrentLinkedQueue<BSPMessage>>();
private int nextOutgoingQueueCount = 1;
@Override
public void clearAllQueues() {
clearIncomedQueues();
clearIncomingQueues();
clearOutgoingQueues();
}
@Override
public void clearIncomedQueues() {
this.incomedQueues.clear();
}
@Override
public void clearIncomingQueues() {
this.incomingQueues.clear();
}
@Override
public void clearOutgoingQueues() {
this.outgoingQueues.clear();
}
@Override
public void exchangeIncomeQueues() {
ConcurrentHashMap<String, ConcurrentLinkedQueue<BSPMessage>> tempQueues = this.incomedQueues;
this.incomedQueues = this.incomingQueues;
this.incomingQueues = tempQueues;
}
@Override
public int getIncomedQueuesSize() {
int size = 0;
Entry<String, ConcurrentLinkedQueue<BSPMessage>> entry;
Iterator<Entry<String, ConcurrentLinkedQueue<BSPMessage>>> it = this.incomedQueues
.entrySet().iterator();
ConcurrentLinkedQueue<BSPMessage> queue;
while (it.hasNext()) {
entry = it.next();
queue = entry.getValue();
size += queue.size();
}
return size;
}
@Override
public int getIncomingQueuesSize() {
int size = 0;
Entry<String, ConcurrentLinkedQueue<BSPMessage>> entry;
Iterator<Entry<String, ConcurrentLinkedQueue<BSPMessage>>> it = this.incomingQueues
.entrySet().iterator();
ConcurrentLinkedQueue<BSPMessage> queue;
while (it.hasNext()) {
entry = it.next();
queue = entry.getValue();
size += queue.size();
}
return size;
}
@Override
public String getMaxIncomingQueueIndex() {
int maxSize = 0;
String maxIndex = null;
ConcurrentLinkedQueue<BSPMessage> tempQueue = null;
Entry<String, ConcurrentLinkedQueue<BSPMessage>> entry = null;
Iterator<Entry<String, ConcurrentLinkedQueue<BSPMessage>>> it =
this.incomingQueues.entrySet().iterator();
while (it.hasNext()) { // Get the queue with the max size
entry = it.next();
tempQueue = entry.getValue();
if (tempQueue.size() > maxSize) {
maxSize = tempQueue.size();
maxIndex = entry.getKey();
} // if
} // while
return maxIndex;
}
@Override
public String getMaxOutgoingQueueIndex() {
int maxSize = 0;
String maxIndex = null;
ConcurrentLinkedQueue<BSPMessage> tempQueue = null;
Entry<String, ConcurrentLinkedQueue<BSPMessage>> entry = null;
Iterator<Entry<String, ConcurrentLinkedQueue<BSPMessage>>> it =
this.outgoingQueues.entrySet().iterator();
while (it.hasNext()) { // Get the queue with the max size
entry = it.next();
tempQueue = entry.getValue();
if (tempQueue.size() > maxSize) {
maxSize = tempQueue.size();
maxIndex = entry.getKey();
} // if
} // while
return maxIndex;
}
@Override
public int getOutgoingQueuesSize() {
int size = 0;
Entry<String, ConcurrentLinkedQueue<BSPMessage>> entry;
Iterator<Entry<String, ConcurrentLinkedQueue<BSPMessage>>> it = this.outgoingQueues
.entrySet().iterator();
ConcurrentLinkedQueue<BSPMessage> queue;
while (it.hasNext()) {
entry = it.next();
queue = entry.getValue();
size += queue.size();
}
return size;
}
@Override
public void incomeAMessage(String dstVertexID, BSPMessage msg) {
ConcurrentLinkedQueue<BSPMessage> incomingQueue = incomingQueues.get(dstVertexID);
if (incomingQueue == null) {
incomingQueue = new ConcurrentLinkedQueue<BSPMessage>();
}
incomingQueue.add(msg);
incomingQueues.put(dstVertexID, incomingQueue);
}
@Override
public void outgoAMessage(String outgoingIndex, BSPMessage msg) {
ConcurrentLinkedQueue<BSPMessage> outgoingQueue = outgoingQueues.get(outgoingIndex);
if (outgoingQueue == null) {
outgoingQueue = new ConcurrentLinkedQueue<BSPMessage>();
}
outgoingQueue.add(msg);
outgoingQueues.put(outgoingIndex, outgoingQueue);
}
@Override
public ConcurrentLinkedQueue<BSPMessage> removeIncomedQueue(String dstVertexID) {
ConcurrentLinkedQueue<BSPMessage> incomedQueue = incomedQueues.remove(dstVertexID);
if (incomedQueue == null) {
incomedQueue = new ConcurrentLinkedQueue<BSPMessage>();
}
return incomedQueue;
}
@Override
public int getIncomingQueueSize(String dstVertexID) {
if (incomingQueues.containsKey(dstVertexID)) {
return incomingQueues.get(dstVertexID).size();
} else {
return 0;
}
}
@Override
public ConcurrentLinkedQueue<BSPMessage> removeIncomingQueue(String dstVertexID) {
ConcurrentLinkedQueue<BSPMessage> incomingQueue = incomingQueues.remove(dstVertexID);
if (incomingQueue == null) {
incomingQueue = new ConcurrentLinkedQueue<BSPMessage>();
}
return incomingQueue;
}
@Override
public ConcurrentLinkedQueue<BSPMessage> removeOutgoingQueue(String index) {
ConcurrentLinkedQueue<BSPMessage> outgoingQueue = outgoingQueues.remove(index);
if (outgoingQueue == null) {
outgoingQueue = new ConcurrentLinkedQueue<BSPMessage>();
}
return outgoingQueue;
}
@Override
public int getOutgoingQueueSize(String index) {
if (outgoingQueues.containsKey(index)) {
return outgoingQueues.get(index).size();
} else {
return 0;
}
}
@Override
public void showMemoryInfo() {
}
@Override
public String getNextOutgoingQueueIndex() {
String nextIndex = null;
synchronized(this.outgoingQueues) {
int size = this.outgoingQueues.size();
if (size == 0) {
return null;
}
if (this.nextOutgoingQueueCount > size) {
this.nextOutgoingQueueCount = 1;
}
Entry<String, ConcurrentLinkedQueue<BSPMessage>> entry = null;
Iterator<Entry<String, ConcurrentLinkedQueue<BSPMessage>>> it = this.outgoingQueues.entrySet().iterator();
for (int i = 0; i < this.nextOutgoingQueueCount; i ++) {
entry = it.next();
nextIndex = entry.getKey();
}
this.nextOutgoingQueueCount++;
}
return nextIndex;
}
}