Edge-ward placement strategy favors the deployment of application modules close to the edge of the network. This strategy demonstrates the interplay between the edge and the fog, by placing modules both near the network edge and the fog.
private void placeModulesInPath(List
if(path.size()==0)return;
List
Map
for(AppEdge edge : getApplication().getEdges()){
if(edge.isPeriodic()){
appEdgeToRate.put(edge, 1/edge.getPeriodicity());
}
}
for(Integer deviceId : path){
FogDevice device = getFogDeviceById(deviceId);
Map
Map
placedModules.addAll(sensorsAssociated.keySet()); placedModules.addAll(actuatorsAssociated.keySet());
for(String sensor : sensorsAssociated.keySet()){
for(AppEdge edge : getApplication().getEdges()){
if(edge.getSource().equals(sensor)){
appEdgeToRate.put(edge, sensorsAssociated.get(sensor)*getRateOfSensor(sensor));
}
}
}
boolean changed = true;
while(changed){
changed=false;
Map
for(AppEdge edge : rateMap.keySet()){
AppModule destModule = getApplication().getModuleByName(edge.getDestination());
if(destModule == null)continue;
Map
for(Pair
if(pair.getFirst().equals(edge.getTupleType())){
double outputRate = appEdgeToRate.get(edge)*map.get(pair).getMeanRate(); // getting mean rate from SelectivityModel
AppEdge outputEdge = getApplication().getEdgeMap().get(pair.getSecond());
if(!appEdgeToRate.containsKey(outputEdge) || appEdgeToRate.get(outputEdge)!=outputRate){
changed = true;
}
appEdgeToRate.put(outputEdge, outputRate);
}
}
}
}
List
while(modulesToPlace.size() > 0){ // Loop runs until all modules in modulesToPlace are deployed in the path
String moduleName = modulesToPlace.get(0);
double totalCpuLoad = 0;
int upsteamDeviceId = isPlacedUpstream(moduleName, path);
if(upsteamDeviceId > 0){
if(upsteamDeviceId==deviceId){
placedModules.add(moduleName);
modulesToPlace = getModulesToPlace(placedModules);
for(AppEdge edge : getApplication().getEdges()){
if(edge.getDestination().equals(moduleName)){
double rate = appEdgeToRate.get(edge);
totalCpuLoad += rate*edge.getTupleCpuLength();
}
}
if(totalCpuLoad + getCurrentCpuLoad().get(deviceId) > device.getHost().getTotalMips()){
Logger.debug("ModulePlacementEdgeward", "Need to shift module "+moduleName+" upstream from device " + device.getName());
List
for(String placedOperator : _placedOperators){
if(!placedModules.contains(placedOperator))
placedModules.add(placedOperator);
}
} else{
placedModules.add(moduleName);
getCurrentCpuLoad().put(deviceId, getCurrentCpuLoad().get(deviceId)+totalCpuLoad);
getCurrentModuleInstanceNum().get(deviceId).put(moduleName, getCurrentModuleInstanceNum().get(deviceId).get(moduleName)+1);
Logger.debug("ModulePlacementEdgeward", "AppModule "+moduleName+" can be created on device "+device.getName());
}
}
}else{
for(AppEdge edge : getApplication().getEdges()){ // take all incoming edges
if(edge.getDestination().equals(moduleName)){
double rate = appEdgeToRate.get(edge);
totalCpuLoad += rate*edge.getTupleCpuLength();
}
}
if(totalCpuLoad + getCurrentCpuLoad().get(deviceId) > device.getHost().getTotalMips()){
Logger.debug("ModulePlacementEdgeward", "Placement of operator "+moduleName+ "NOT POSSIBLE on device "+device.getName());
}
else{
Logger.debug("ModulePlacementEdgeward", "Placement of operator "+moduleName+ " on device "+device.getName() + " successful.");
getCurrentCpuLoad().put(deviceId, totalCpuLoad + getCurrentCpuLoad().get(deviceId));
System.out.println("Placement of operator "+moduleName+ " on device "+device.getName() + " successful.");
if(!currentModuleMap.containsKey(deviceId))
currentModuleMap.put(deviceId, new ArrayList
currentModuleMap.get(deviceId).add(moduleName);
placedModules.add(moduleName);
modulesToPlace = getModulesToPlace(placedModules);
getCurrentModuleLoadMap().get(device.getId()).put(moduleName, totalCpuLoad);
int max = 1;
for(AppEdge edge : getApplication().getEdges()){
if(edge.getSource().equals(moduleName) && actuatorsAssociated.containsKey(edge.getDestination()))
max = Math.max(actuatorsAssociated.get(edge.getDestination()), max);
if(edge.getDestination().equals(moduleName) && sensorsAssociated.containsKey(edge.getSource()))
max = Math.max(sensorsAssociated.get(edge.getSource()), max);
}
getCurrentModuleInstanceNum().get(deviceId).put(moduleName, max);
}
}
modulesToPlace.remove(moduleName);
}
}
}