Amazing technological breakthrough possible @S-Logix pro@slogix.in

Office Address

  • #5, First Floor, 4th Street Dr. Subbarayan Nagar Kodambakkam, Chennai-600 024 Landmark : Samiyar Madam
  • pro@slogix.in
  • +91- 81240 01111

Social List

How to place the application in edge and fog devices

Description

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.

Source Code

private void placeModulesInPath(List path) {

if(path.size()==0)return;

List placedModules = new ArrayList();

Map appEdgeToRate = new HashMap();

for(AppEdge edge : getApplication().getEdges()){

if(edge.isPeriodic()){

appEdgeToRate.put(edge, 1/edge.getPeriodicity());

}

}

for(Integer deviceId : path){

FogDevice device = getFogDeviceById(deviceId);

Map sensorsAssociated = getAssociatedSensors(device);

Map actuatorsAssociated = getAssociatedActuators(device);

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 rateMap = new HashMap(appEdgeToRate);

for(AppEdge edge : rateMap.keySet()){

AppModule destModule = getApplication().getModuleByName(edge.getDestination());

if(destModule == null)continue;

Map, SelectivityModel> map = destModule.getSelectivityMap();

for(Pair pair : map.keySet()){

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 modulesToPlace = getModulesToPlace(placedModules);

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 _placedOperators = shiftModuleNorth(moduleName, totalCpuLoad, deviceId, modulesToPlace);

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);

}

}

}

Output

place the application in edge devices
place the application in fog devices