/* * Title: CloudSim Toolkit * Description: CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds * Licence: GPL - http://www.gnu.org/copyleft/gpl.html * * Copyright (c) 2009-2012, The University of Melbourne, Australia */ package org.cloudbus.cloudsim; import java.util.Iterator; import java.util.List; /** * SANStorage represents a storage area network composed of a set of harddisks connected in a LAN. * Capacity of individual disks are abstracted, thus only the overall capacity of the SAN is * considered. WARNING: This class is not yet fully functional. Effects of network contention are * not considered in the simulation. So, time for file transfer is underestimated in the presence of * high network load. * * @author Rodrigo N. Calheiros * @since CloudSim Toolkit 1.0 */ public class SanStorage extends HarddriveStorage { /** The bandwidth. */ double bandwidth; /** The network latency. */ double networkLatency; /** * Creates a new SAN with a given capacity, latency, and bandwidth of the network connection. * * @param capacity Storage device capacity * @param bandwidth Network bandwidth * @param networkLatency Network latency * @throws ParameterException when the name and the capacity are not valid */ public SanStorage(double capacity, double bandwidth, double networkLatency) throws ParameterException { super(capacity); this.bandwidth = bandwidth; this.networkLatency = networkLatency; } /** * Creates a new SAN with a given capacity, latency, and bandwidth of the network connection. * * @param name the name of the new harddrive storage * @param capacity Storage device capacity * @param bandwidth Network bandwidth * @param networkLatency Network latency * @throws ParameterException when the name and the capacity are not valid */ public SanStorage(String name, double capacity, double bandwidth, double networkLatency) throws ParameterException { super(name, capacity); this.bandwidth = bandwidth; this.networkLatency = networkLatency; } /** * Adds a file for which the space has already been reserved. * * @param file the file to be added * @return the time (in seconds) required to add the file */ @Override public double addReservedFile(File file) { double time = super.addReservedFile(file); time += networkLatency; time += file.getSize() * bandwidth; return time; } /** * Gets the maximum transfer rate of the storage in MB/sec. * * @return the maximum transfer rate in MB/sec */ @Override public double getMaxTransferRate() { double diskRate = super.getMaxTransferRate(); // the max transfer rate is the minimum between // the network bandwidth and the disk rate if (diskRate < bandwidth) { return diskRate; } return bandwidth; } /** * Adds a file to the storage. * * @param file the file to be added * @return the time taken (in seconds) for adding the specified file */ @Override public double addFile(File file) { double time = super.addFile(file); time += networkLatency; time += file.getSize() * bandwidth; return time; } /** * Adds a set of files to the storage. Runs through the list of files and save all of them. The * time taken (in seconds) for adding each file can also be found using * {@link gridsim.datagrid.File#getTransactionTime()}. * * @param list the files to be added * @return the time taken (in seconds) for adding the specified files */ @Override public double addFile(List<File> list) { double result = 0.0; if (list == null || list.size() == 0) { Log.printLine(getName() + ".addFile(): Warning - list is empty."); return result; } Iterator<File> it = list.iterator(); File file = null; while (it.hasNext()) { file = it.next(); result += this.addFile(file); // add each file in the list } return result; } /** * Removes a file from the storage. The time taken (in seconds) for deleting the file can also * be found using {@link gridsim.datagrid.File#getTransactionTime()}. * * @param fileName the name of the file to be removed * @param file the file which is removed from the storage is returned through this parameter * @return the time taken (in seconds) for deleting the specified file */ @Override public double deleteFile(String fileName, File file) { return this.deleteFile(file); } /** * Removes a file from the storage. The time taken (in seconds) for deleting the file can also * be found using {@link gridsim.datagrid.File#getTransactionTime()}. * * @param file the file which is removed from the storage is returned through this parameter * @return the time taken (in seconds) for deleting the specified file */ @Override public double deleteFile(File file) { double time = super.deleteFile(file); time += networkLatency; time += file.getSize() * bandwidth; return time; } }