From: <mar...@us...> - 2007-12-16 23:08:29
|
Revision: 82 http://gridsim.svn.sourceforge.net/gridsim/?rev=82&view=rev Author: marcos_dias Date: 2007-12-16 15:08:32 -0800 (Sun, 16 Dec 2007) Log Message: ----------- This update contains an additional resource allocation policy that supports parallel jobs with aggressive (EASY) backfilling. Due to the inclusion of this policy, a few other classes have been updated as well. Added Paths: ----------- branches/gridsim4.0-branch3/build.xml branches/gridsim4.0-branch3/examples/examples/WorkloadWithCancellation.java branches/gridsim4.0-branch3/examples/examples/WorkloadWithReservation.java branches/gridsim4.0-branch3/examples/examples/ar/ARTest.java branches/gridsim4.0-branch3/examples/examples/ar/SimpleARExample01.java branches/gridsim4.0-branch3/examples/examples/workload/ar/TurboARExample01.java branches/gridsim4.0-branch3/examples/examples/workload/ar/TurboARExample02.java branches/gridsim4.0-branch3/examples/examples/workload/ar/TurboARExample03.java branches/gridsim4.0-branch3/examples/examples/workload/ar/TurboARExampleWithCancellation01.java branches/gridsim4.0-branch3/examples/examples/workload/parallel/TurboExample01.java branches/gridsim4.0-branch3/examples/examples/workload/parallel/TurboExampleEasy01.java branches/gridsim4.0-branch3/examples/examples/workload/parallel/TurboExampleWithCancellation01.java branches/gridsim4.0-branch3/source/eduni/simjava/Evqueue.java branches/gridsim4.0-branch3/source/eduni/simjava/Semaphore.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_any_p.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_entity.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_event.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_exception.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_from_p.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_none_p.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_not_from_p.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_not_type_p.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_outfile.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_output.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_port.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_predicate.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_system.java branches/gridsim4.0-branch3/source/eduni/simjava/Sim_type_p.java branches/gridsim4.0-branch3/source/gridsim/ARGridResource.java branches/gridsim4.0-branch3/source/gridsim/ARObject.java branches/gridsim4.0-branch3/source/gridsim/ARPolicy.java branches/gridsim4.0-branch3/source/gridsim/ARSimpleSpaceShared.java branches/gridsim4.0-branch3/source/gridsim/Accumulator.java branches/gridsim4.0-branch3/source/gridsim/AdvanceReservation.java branches/gridsim4.0-branch3/source/gridsim/AllocPolicy.java branches/gridsim4.0-branch3/source/gridsim/GridInformationService.java branches/gridsim4.0-branch3/source/gridsim/GridResource.java branches/gridsim4.0-branch3/source/gridsim/GridSim.java branches/gridsim4.0-branch3/source/gridsim/GridSimCore.java branches/gridsim4.0-branch3/source/gridsim/GridSimRandom.java branches/gridsim4.0-branch3/source/gridsim/GridSimShutdown.java branches/gridsim4.0-branch3/source/gridsim/GridSimStandardPE.java branches/gridsim4.0-branch3/source/gridsim/GridSimTags.java branches/gridsim4.0-branch3/source/gridsim/GridStatistics.java branches/gridsim4.0-branch3/source/gridsim/GridUser.java branches/gridsim4.0-branch3/source/gridsim/Gridlet.java branches/gridsim4.0-branch3/source/gridsim/GridletList.java branches/gridsim4.0-branch3/source/gridsim/IO_data.java branches/gridsim4.0-branch3/source/gridsim/Machine.java branches/gridsim4.0-branch3/source/gridsim/MachineList.java branches/gridsim4.0-branch3/source/gridsim/ParameterException.java branches/gridsim4.0-branch3/source/gridsim/ResGridlet.java branches/gridsim4.0-branch3/source/gridsim/ResGridletList.java branches/gridsim4.0-branch3/source/gridsim/ResourceCalendar.java branches/gridsim4.0-branch3/source/gridsim/ResourceCharacteristics.java branches/gridsim4.0-branch3/source/gridsim/ResourceUserList.java branches/gridsim4.0-branch3/source/gridsim/Sim_from_port.java branches/gridsim4.0-branch3/source/gridsim/SpaceShared.java branches/gridsim4.0-branch3/source/gridsim/Stat.java branches/gridsim4.0-branch3/source/gridsim/TimeShared.java branches/gridsim4.0-branch3/source/gridsim/gui/AllocationAction.java branches/gridsim4.0-branch3/source/gridsim/gui/AllocationListener.java branches/gridsim4.0-branch3/source/gridsim/gui/DefaultGridSimVisualizer.java branches/gridsim4.0-branch3/source/gridsim/gui/GUISettings.java branches/gridsim4.0-branch3/source/gridsim/gui/GridSimVisualizer.java branches/gridsim4.0-branch3/source/gridsim/gui/ResourceWindow.java branches/gridsim4.0-branch3/source/gridsim/turbo/ARMessage.java branches/gridsim4.0-branch3/source/gridsim/turbo/ARParallelSpaceShared.java branches/gridsim4.0-branch3/source/gridsim/turbo/ARTGridResource.java branches/gridsim4.0-branch3/source/gridsim/turbo/ARTPolicy.java branches/gridsim4.0-branch3/source/gridsim/turbo/AvailabilityInfo.java branches/gridsim4.0-branch3/source/gridsim/turbo/AvailabilityInfoEntry.java branches/gridsim4.0-branch3/source/gridsim/turbo/AvailabilityProfile.java branches/gridsim4.0-branch3/source/gridsim/turbo/AvailabilityProfileEntry.java branches/gridsim4.0-branch3/source/gridsim/turbo/CBParallelSpaceShared.java branches/gridsim4.0-branch3/source/gridsim/turbo/EBParallelSpaceShared.java branches/gridsim4.0-branch3/source/gridsim/turbo/FilterARMessage.java branches/gridsim4.0-branch3/source/gridsim/turbo/OrderGridletByStartTime.java branches/gridsim4.0-branch3/source/gridsim/turbo/PERange.java branches/gridsim4.0-branch3/source/gridsim/turbo/PERangeList.java branches/gridsim4.0-branch3/source/gridsim/turbo/Reservation.java branches/gridsim4.0-branch3/source/gridsim/turbo/ReservationRequester.java branches/gridsim4.0-branch3/source/gridsim/turbo/SSGridlet.java branches/gridsim4.0-branch3/source/gridsim/turbo/SSReservation.java branches/gridsim4.0-branch3/source/gridsim/turbo/ScheduleItem.java branches/gridsim4.0-branch3/source/gridsim/turbo/TAllocPolicy.java branches/gridsim4.0-branch3/source/gridsim/turbo/TResourceCharacteristics.java branches/gridsim4.0-branch3/workloads/sdsc_blue_2000_01.txt branches/gridsim4.0-branch3/workloads/sdsc_blue_2000_02.txt branches/gridsim4.0-branch3/workloads/sdsc_blue_2000_03.txt Removed Paths: ------------- branches/gridsim4.0-branch3/workloads/sdsc_blue_2000.swf Added: branches/gridsim4.0-branch3/build.xml =================================================================== --- branches/gridsim4.0-branch3/build.xml (rev 0) +++ branches/gridsim4.0-branch3/build.xml 2007-12-16 23:08:32 UTC (rev 82) @@ -0,0 +1,63 @@ +<?xml version="1.0"?> + +<!-- September 2004 +Build file or Makefile for GridSim. +NOTE: Make sure you have installed 'ant' and put the location of it into + your path so you can access it anywhere. + 'ant' can be downloadable from http://ant.apache.org/ + +Usage: +* type 'ant' to compile all gridsim source files and put them into + classes/ directory +* type 'ant makejar' to compile the source files (if necessary) and to create + a jar file into jar/ directory + +NOTE: rule for javadoc is not included yet. Use javadoc.sh script instead under + Unix/Linux environment. + +Acknowledgement: Thank to Uros Cibej for providing this file and instruction on + how to use it. +--> + + +<project name="GridSim" basedir="." default="build"> + <description> + This is the build file for GridSim + </description> + + <!-- gridsim version id --> + <property name="version" value="turbo01"/> + + <!-- location to store Java classes --> + <property name="class.dir" location="./classes" /> + + <!-- location to store GridSim source files --> + <property name="src.dir" location="./source" /> + + <!-- location to store jar files --> + <property name="jar.dir" location="./jars" /> + + <!-- location to store Javadoc files --> + <property name="doc.dir" location="./doc" /> + + <target name="prepare"> + <mkdir dir="${class.dir}" /> + </target> + + <!-- rule to compile GridSim source files --> + <target name="build" depends="prepare"> + <javac srcdir="${src.dir}" destdir="${class.dir}" classpath="." /> + </target> + + <!-- rule for making a jar file. + NOTE: + * The new jar file is named as "gridsim_VERSION.jar". + --> + <target name="makejar" depends="build"> + <echo>Compiling a new jar file, named: "gridsim_${version}.jar".</echo> + <jar destfile="${jar.dir}/gridsim_${version}.jar" basedir="${class.dir}" /> + </target> + +</project> + + Added: branches/gridsim4.0-branch3/examples/examples/WorkloadWithCancellation.java =================================================================== --- branches/gridsim4.0-branch3/examples/examples/WorkloadWithCancellation.java (rev 0) +++ branches/gridsim4.0-branch3/examples/examples/WorkloadWithCancellation.java 2007-12-16 23:08:32 UTC (rev 82) @@ -0,0 +1,250 @@ +/* Title: GridSim Toolkit + * Description: GridSim (Grid Simulation) Toolkit for Modeling and Simulation + * of Parallel and Distributed Systems such as Clusters and Grids + * Licence: GPL - http://www.gnu.org/copyleft/gpl.html + */ + +package examples; + +import eduni.simjava.Sim_event; +import eduni.simjava.Sim_system; +import gridsim.GridSimTags; +import gridsim.Gridlet; +import gridsim.IO_data; +import gridsim.ParameterException; +import gridsim.net.Link; +import gridsim.util.Workload; + +import java.util.ArrayList; + +/** + * This class is an extended version of {@link Workload}. This class + * cancels some gridlets submitted. + * + * @author Marcos Dias de Assuncao + * @since GridSim Turbo Alpha 0.1 + * + * @see Workload + */ +public class WorkloadWithCancellation extends Workload { + private final int NUM_GRIDLETS_BETWEEN_CANCELLATIONS = 50; + // value of 1, means that the cancellation will be sent + // at the gridlet's submission time + (gridlet duration * 1) + private final double TIME_CANCELLATION = 0.5; + + /** + * Create a new {@link WorkloadWithCancellation} object <b>without</b> using + * the network extension. This means this entity directly sends Gridlets + * to a resource destination without going through a wired network. <br> + * <tt>NOTE:</tt> + * You can not use this constructor in an experiment that uses a wired + * network topology. + * + * @param name this entity name + * @param fileName the workload trace filename in one of the following + * format: <i>ASCII text, zip, gz.</i> + * @param resourceName the resource name + * @param rating the resource's PE rating + * @throws Exception This happens when creating this entity before + * initialising GridSim package or this entity name is + * <tt>null</tt> or empty + * @throws ParameterException This happens for the following conditions: + * <ul> + * <li>the entity name is null or empty + * <li>the workload trace file name is null or empty + * <li>the resource entity name is null or empty + * <li>the resource PE rating <= 0 + * </ul> + * @pre name != null + * @pre fileName != null + * @pre resourceName != null + * @pre rating > 0 + * @post $none + */ + public WorkloadWithCancellation(String name, String fileName, String resourceName, + int rating) throws ParameterException, Exception { + + super(name, fileName, resourceName, rating); + } + + /** + * Create a new {@link WorkloadWithCancellation} object <b>with</b> the network extension. + * This means this entity directly sends Gridlets to a destination resource + * through a link. The link is automatically created by this constructor. + * + * @param name this entity name + * @param baudRate baud rate of this link (bits/s) + * @param propDelay Propagation delay of the Link in milliseconds + * @param MTU Maximum Transmission Unit of the Link in bytes. + * Packets which are larger than the MTU should be split + * up into MTU size units. + * For example, a 1024 byte packet trying to cross a 576 + * byte MTU link should get split into 2 packets of 576 + * bytes and 448 bytes. + * @param fileName the workload trace filename in one of the following + * format: <i>ASCII text, zip, gz.</i> + * @param resourceName the resource name + * @param rating the resource's PE rating + * @throws Exception This happens when creating this entity before + * initialising GridSim package or this entity name is + * <tt>null</tt> or empty + * @throws ParameterException This happens for the following conditions: + * <ul> + * <li>the entity name is null or empty + * <li> baudRate <= 0 + * <li> propDelay <= 0 + * <li> MTU <= 0 + * <li>the workload trace file name is null or empty + * <li>the resource entity name is null or empty + * <li>the resource PE rating <= 0 + * </ul> + * @pre name != null + * @pre baudRate > 0 + * @pre propDelay > 0 + * @pre MTU > 0 + * @pre fileName != null + * @pre resourceName != null + * @pre rating > 0 + * @post $none + */ + public WorkloadWithCancellation(String name, double baudRate, double propDelay, int MTU, + String fileName, String resourceName, int rating) + throws ParameterException, Exception { + + super( name, baudRate, propDelay, MTU, fileName, resourceName, rating ); + } + + /** + * Create a new Workload object <b>with</b> the network extension. + * This means this entity directly sends Gridlets to a destination resource + * through a link. The link is automatically created by this constructor. + * + * @param name this entity name + * @param link the link that will be used to connect this Workload + * to another entity or a Router. + * @param fileName the workload trace filename in one of the following + * format: <i>ASCII text, zip, gz.</i> + * @param resourceName the resource name + * @param rating the resource's PE rating + * @throws Exception This happens when creating this entity before + * initialising GridSim package or this entity name is + * <tt>null</tt> or empty + * @throws ParameterException This happens for the following conditions: + * <ul> + * <li>the entity name is null or empty + * <li>the link is empty + * <li>the workload trace file name is null or empty + * <li>the resource entity name is null or empty + * <li>the resource PE rating <= 0 + * </ul> + * @pre name != null + * @pre link != null + * @pre fileName != null + * @pre resourceName != null + * @pre rating > 0 + * @post $none + */ + public WorkloadWithCancellation(String name, Link link, String fileName, + String resourceName, int rating) + throws ParameterException, Exception { + + super(name, link, fileName, resourceName, rating); + } + + //////////////////////// PRIVATE METHODS /////////////////////// + + /** + * Collects Gridlets sent and stores them into a list. + * @pre $none + * @post $none + */ + protected void collectGridlet() { + System.out.println(super.get_name() + ": Collecting Gridlets ..."); + list_ = new ArrayList(gridletID_ + 1); + + Object data = null; + Gridlet gl = null; + + int counter = 1; // starts at 1, since gridletID_ starts at 1 too + Sim_event ev = new Sim_event(); + while ( Sim_system.running() ) { + + super.sim_get_next(ev); // get the next available event + data = ev.get_data(); // get the event's data + + // handle ping request + if (ev.get_tag() == GridSimTags.INFOPKT_SUBMIT) { + processPingRequest(ev); + continue; + } + + // get the Gridlet data + if (data != null && data instanceof Gridlet) { + gl = (Gridlet) data; + +// if(gl.getGridletStatus() == Gridlet.FAILED) +// System.out.println("Gridlet failed"); +// +// if(gl.getGridletStatus() == Gridlet.CANCELED) +// System.out.println("Gridlet cancelled"); + + list_.add(gl); + counter++; + } + + // if all the Gridlets have been collected + if (counter == gridletID_) { + break; + } + } + } + + /** + * Creates a Gridlet with the given information, then submit it to a + * resource + * @param id a Gridlet ID + * @param submitTime Gridlet's submit time + * @param runTime Gridlet's run time + * @param numProc number of processors + * @pre id >= 0 + * @pre submitTime >= 0 + * @pre runTime >= 0 + * @pre numProc > 0 + * @post $none + */ + protected void submitGridlet(int id, long submitTime, int runTime, int numProc) { + + // create the gridlet + int len = runTime * rating_; // calculate a job length for each PE + Gridlet gl = new Gridlet(id, len, size_, size_); + gl.setUserID( super.get_id() ); // set the owner ID + gl.setNumPE(numProc); // set the requested num of proc + + // printing to inform user + if (gridletID_ == 1 || gridletID_ % INTERVAL == 0) { + System.out.println(super.get_name() + ": Submitting Gridlets to " + + resName_ + " ..."); + } + + // check the submit time + if (submitTime < 0) { + submitTime = 0; + } + + gridletID_++; // increment the counter + + // submit a gridlet to resource + super.send(super.output, submitTime, GridSimTags.GRIDLET_SUBMIT, + new IO_data(gl, gl.getGridletFileSize(), resID_) ); + + // check whether a cancellation has to be scheduled or not + int result = gridletID_ % NUM_GRIDLETS_BETWEEN_CANCELLATIONS; + if(result == 0) { + super.send(super.output, (submitTime + (TIME_CANCELLATION * runTime)), GridSimTags.GRIDLET_CANCEL, + new IO_data(gl, 0, resID_) ); + gridletID_++; + } + } + +} // end class + Added: branches/gridsim4.0-branch3/examples/examples/WorkloadWithReservation.java =================================================================== --- branches/gridsim4.0-branch3/examples/examples/WorkloadWithReservation.java (rev 0) +++ branches/gridsim4.0-branch3/examples/examples/WorkloadWithReservation.java 2007-12-16 23:08:32 UTC (rev 82) @@ -0,0 +1,1077 @@ +/* + * Title: GridSim Toolkit + * Description: GridSim (Grid Simulation) Toolkit for Modeling and Simulation + * of Parallel and Distributed Systems such as Clusters and Grids + * Licence: GPL - http://www.gnu.org/copyleft/gpl.html + * + */ + +package examples; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Enumeration; +import java.util.Random; +import java.util.zip.GZIPInputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import eduni.simjava.Sim_event; +import eduni.simjava.Sim_system; + +import gridsim.GridSim; +import gridsim.GridSimTags; +import gridsim.Gridlet; +import gridsim.IO_data; +import gridsim.ParameterException; +import gridsim.net.InfoPacket; +import gridsim.net.Link; +import gridsim.net.SimpleLink; +import gridsim.turbo.Reservation; +import gridsim.turbo.ReservationRequester; + +/** + * The main purpose of this class is to create a realistic simulation + * environment where your jobs or Gridlets are competing with others. + * In other words, the grid resource might not be available at certain times. + * In addition, the arrival time of jobs are also captured in the trace file. + * <p> + * This workload class has been modified to simulate advance reservations. + * Some parameters where included to indicate the frequency in which + * advance reservations are made. Additionally, it is possible to specify how + * long in advance the advance reservations are made. + * <p> + * This class is responsible for reading resource traces from a file and + * sends Gridlets to only <tt>one</tt> destinated resource. <br> + * <b>NOTE:</b> + * <ul> + * <li> This class can only take <tt>one</tt> trace file of the following + * format: <i>ASCII text, zip, gz.</i> + * <li> This class can be classified as <b>one grid user entity</b>. + * Hence, you need to incorporate this entity into <tt>numUser</tt> + * during {@link gridsim.GridSim#init(int, Calendar, boolean)} + * <li> If you need to use multiple trace files to submit Gridlets to + * same or different resources, then you need to create multiple + * instances of this class <tt>each with a unique entity name</tt>. + * <li> If size of the trace file is huge or contains lots of traces + * please increase the JVM heap size accordingly by using + * <tt>java -Xmx</tt> option when running the simulation. + * <li> If you are running an experiment using the network extension, + * i.e. the gridsim.net package, then you need to use + * {@link #Workload(String, double, double, int, String, String, int)} + * instead. + * <li> The default job file size for sending to and receiving from + * a resource is {@link gridsim.net.Link#DEFAULT_MTU}. + * However, you can specify + * the file size by using {@link #setGridletFileSize(int)}. + * <li> A job run time is only for 1 PE <tt>not</tt> the total number of + * allocated PEs. + * Therefore, a Gridlet length is also calculated for 1 PE.<br> + * For example, job #1 in the trace has a run time of 100 seconds + * for 2 processors. This means each processor runs + * job #1 for 100 seconds, if the processors have the same + * specification. + * </ul> + * <p> + * By default, this class follows the standard workload format as specified + * in <a href="http://www.cs.huji.ac.il/labs/parallel/workload/"> + * http://www.cs.huji.ac.il/labs/parallel/workload/</a> <br> + * However, you can use other format by calling the below methods before + * running the simulation: + * <ul> + * <li> {@link #setComment(String)} + * <li> {@link #setField(int, int, int, int, int)} + * </ul> + * + * @see gridsim.GridSim#init(int, Calendar, boolean) + * @author Marcos Dias de Assuncao (the most of the code came + * from {@link Workload} class) + * @since GridSim Turbo Alpha 0.1 + * @invariant $none + */ + +public class WorkloadWithReservation extends ReservationRequester { + + protected String fileName_; // file name + protected String resName_; // resource name + protected int resID_; // resource ID + protected int rating_; // a PE rating + protected int gridletID_; // gridletID + protected int size_; // job size for sending it through a network + protected ArrayList list_; // a list for getting all the Gridlets + + // constant + private int JOB_NUM; // job number + private int SUBMIT_TIME; // submit time of a Gridlet + private int RUN_TIME; // running time of a Gridlet + private int NUM_PROC; // number of processors needed for a Gridlet + private int REQ_NUM_PROC; // required number of processors + private int REQ_RUN_TIME; // required running time + private int MAX_FIELD; // max number of field in the trace file + private String COMMENT; // a string that denotes the start of a comment + private final int IRRELEVANT = -1; // irrelevant number + protected final int INTERVAL = 10; // number of intervals + private String[] fieldArray_; // a temp array storing all the fields + + // ADVANCE RESERVATION PROPERTIES + private double reservProbability_; + private double timeInAdvance_; + private Random numGen_; + private long seed_ = 11L*13*17*19*23+1; + + // TAGS FOR INTERNAL EVENTS + private final int GRIDLET_SUBMIT = 10; + private final int RESERVE_RESOURCES = 11; + + /** + * Create a new Workload object <b>without</b> using the network extension. + * This means this entity directly sends Gridlets to a destination resource + * without going through a wired network. <br> + * <tt>NOTE:</tt> + * You can not use this constructor in an experiment that uses a wired + * network topology. + * + * @param name this entity name + * @param fileName the workload trace filename in one of the following + * format: <i>ASCII text, zip, gz.</i> + * @param resourceName the resource name + * @param rating the resource's PE rating + * @throws Exception This happens when creating this entity before + * initialising GridSim package or this entity name is + * <tt>null</tt> or empty + * @throws ParameterException This happens for the following conditions: + * <ul> + * <li>the entity name is null or empty + * <li>the workload trace file name is null or empty + * <li>the resource entity name is null or empty + * <li>the resource PE rating <= 0 + * </ul> + * @pre name != null + * @pre fileName != null + * @pre resourceName != null + * @pre rating > 0 + * @post $none + */ + public WorkloadWithReservation(String name, String fileName, String resourceName, + int rating) throws ParameterException, Exception { + super(name, GridSimTags.DEFAULT_BAUD_RATE); + + // check the input parameters first + String msg = name + "(): Error - "; + if (fileName == null || fileName.length() == 0) { + throw new ParameterException(msg + "invalid trace file name."); + } + else if (resourceName == null || resourceName.length() == 0) { + throw new ParameterException(msg + "invalid resource name."); + } + else if (rating <= 0) { + throw new ParameterException(msg+"resource PE rating must be > 0."); + } + + System.out.println(name + ": Creating a workload object ..."); + init(fileName, resourceName, rating); + } + + /** + * Create a new Workload object <b>with</b> the network extension. + * This means this entity directly sends Gridlets to a destination resource + * through a link. The link is automatically created by this constructor. + * + * @param name this entity name + * @param baudRate baud rate of this link (bits/s) + * @param propDelay Propagation delay of the Link in milliseconds + * @param MTU Maximum Transmission Unit of the Link in bytes. + * Packets which are larger than the MTU should be split + * up into MTU size units. + * For example, a 1024 byte packet trying to cross a 576 + * byte MTU link should get split into 2 packets of 576 + * bytes and 448 bytes. + * @param fileName the workload trace filename in one of the following + * format: <i>ASCII text, zip, gz.</i> + * @param resourceName the resource name + * @param rating the resource's PE rating + * @throws Exception This happens when creating this entity before + * initialising GridSim package or this entity name is + * <tt>null</tt> or empty + * @throws ParameterException This happens for the following conditions: + * <ul> + * <li>the entity name is null or empty + * <li> baudRate <= 0 + * <li> propDelay <= 0 + * <li> MTU <= 0 + * <li>the workload trace file name is null or empty + * <li>the resource entity name is null or empty + * <li>the resource PE rating <= 0 + * </ul> + * @pre name != null + * @pre baudRate > 0 + * @pre propDelay > 0 + * @pre MTU > 0 + * @pre fileName != null + * @pre resourceName != null + * @pre rating > 0 + * @post $none + */ + public WorkloadWithReservation(String name, double baudRate, double propDelay, int MTU, + String fileName, String resourceName, int rating) + throws ParameterException, Exception { + super( name, new SimpleLink(name+"_link", baudRate, propDelay, MTU) ); + + // check the input parameters first + String msg = name + "(): Error - "; + if (fileName == null || fileName.length() == 0) { + throw new ParameterException(msg + "invalid trace file name."); + } + else if (resourceName == null || resourceName.length() == 0) { + throw new ParameterException(msg + "invalid resource name."); + } + else if (rating <= 0) { + throw new ParameterException(msg+"resource PE rating must be > 0."); + } + + System.out.println(name + ": Creating a workload object ..."); + init(fileName, resourceName, rating); + } + + /** + * Create a new Workload object <b>with</b> the network extension. + * This means this entity directly sends Gridlets to a destination resource + * through a link. The link is automatically created by this constructor. + * + * @param name this entity name + * @param link the link that will be used to connect this Workload + * to another entity or a Router. + * @param fileName the workload trace filename in one of the following + * format: <i>ASCII text, zip, gz.</i> + * @param resourceName the resource name + * @param rating the resource's PE rating + * @throws Exception This happens when creating this entity before + * initialising GridSim package or this entity name is + * <tt>null</tt> or empty + * @throws ParameterException This happens for the following conditions: + * <ul> + * <li>the entity name is null or empty + * <li>the link is empty + * <li>the workload trace file name is null or empty + * <li>the resource entity name is null or empty + * <li>the resource PE rating <= 0 + * </ul> + * @pre name != null + * @pre link != null + * @pre fileName != null + * @pre resourceName != null + * @pre rating > 0 + * @post $none + */ + public WorkloadWithReservation(String name, Link link, String fileName, + String resourceName, int rating) + throws ParameterException, Exception { + super(name, link); + + // check the input parameters first + String msg = name + "(): Error - "; + if (fileName == null || fileName.length() == 0) { + throw new ParameterException(msg + "invalid trace file name."); + } + else if (resourceName == null || resourceName.length() == 0) { + throw new ParameterException(msg + "invalid resource name."); + } + else if (rating <= 0) { + throw new ParameterException(msg+"resource PE rating must be > 0."); + } + + System.out.println(name + ": Creating a workload object ..."); + init(fileName, resourceName, rating); + } + + /** + * Gets the probability of a job in the workload + * be an advance reservation + * @return the reservation probability + */ + public double getReservationProbability() { + return reservProbability_; + } + + /** + * Sets the probability of a job in the workload + * be an advance reservation + * @param probability the reservation probability + */ + public void setReservationProbability(double probability) { + reservProbability_ = probability; + } + + /** + * Gets how long in advance an advance reservation has to + * be made. The time in advance is how long in advance to + * the submission time included in the log the reservation + * has to be made + * @return the time in advance + */ + public double getARTimeInAdvance() { + return timeInAdvance_; + } + + /** + * Sets how long in advance an advance reservation has to + * be made. The time in advance is how long in advance to + * the submission time included in the log the reservation + * has to be made + * @param time the time in advance + */ + public void setARTimeInAdvance(double time) { + timeInAdvance_ = time; + } + + /** + * Initialises all the attributes + * @param fileName trace file name + * @param resourceName resource entity name + * @param rating resource PE rating + * @pre $none + * @post $none + */ + private void init(String fileName, String resourceName, int rating) + { + fileName_ = fileName; + resName_ = resourceName; + resID_ = GridSim.getEntityId(resName_); + rating_ = rating; + gridletID_ = 1; // starts at 1 to make it the same as in a trace file + list_ = null; + size_ = Link.DEFAULT_MTU; + + timeInAdvance_ = 60 * 60; // one hour + reservProbability_ = 0D; + numGen_ = new Random(seed_); + + // if using Standard Workload Format -- don't forget to substract by 1 + // since an array starts at 0, but the field in a trace starts at 1 + JOB_NUM = 1 - 1; + SUBMIT_TIME = 2 - 1; + RUN_TIME = 4 - 1; + NUM_PROC = 5 - 1; + REQ_NUM_PROC = 8 - 1; + REQ_RUN_TIME = 9 - 1; + + COMMENT = ";"; // semicolon means the start of a comment + MAX_FIELD = 18; // standard workload format has 18 fields + fieldArray_ = null; + } + + /** + * Sets a Gridlet file size (in byte) for sending to/from a resource. + * @param size a Gridlet file size (in byte) + * @return <tt>true</tt> if it is successful, <tt>false</tt> otherwise + * @pre size > 0 + * @post $none + */ + public boolean setGridletFileSize(int size) { + if (size < 0) { + return false; + } + + size_ = size; + return true; + } + + /** + * Identifies the start of a comment line. Hence, a line that starts + * with a given comment will be ignored. + * @param comment a character that denotes the start of a comment, + * e.g. ";" or "#" + * @return <tt>true</tt> if it is successful, <tt>false</tt> otherwise + * @pre comment != null + * @post $none + */ + public boolean setComment(String comment) + { + boolean success = false; + if (comment != null && comment.length() > 0) + { + COMMENT = comment; + success = true; + } + return success; + } + + /** + * Tells this class what to look in the trace file. + * This method should be called before the start of the simulation. + * <p> + * By default, this class follows the standard workload format as specified + * in <a href="http://www.cs.huji.ac.il/labs/parallel/workload/"> + * http://www.cs.huji.ac.il/labs/parallel/workload/</a> <br> + * However, you can use other format by calling this method. + * <p> + * The parameters must be a positive integer number starting from 1. + * A special case is where <tt>jobNum == -1</tt>, meaning the job or + * gridlet ID starts at 1. + * + * @param maxField max. number of field/column in one row + * @param jobNum field/column number for locating the job ID + * @param submitTime field/column number for locating the job submit time + * @param runTime field/column number for locating the job run time + * @param numProc field/column number for locating the number of PEs + * required to run a job + * @return <tt>true</tt> if successful, <tt>false</tt> otherwise + * @pre maxField > 0 + * @pre submitTime > 0 + * @pre runTime > 0 + * @pre numProc > 0 + * @post $none + */ + public boolean setField(int maxField, int jobNum, int submitTime, + int runTime, int numProc) + { + // need to substract by 1 since array starts at 0. Need to convert, + // position in a field into the index of the array + if (jobNum > 0) { + JOB_NUM = jobNum - 1; + } + else if (jobNum == 0) + { + System.out.println(super.get_name() + + ".setField(): Invalid job number field."); + return false; + } + else { + JOB_NUM = -1; + } + + // get the max. number of field + if (maxField > 0) { + MAX_FIELD = maxField; + } + else + { + System.out.println(super.get_name() + + ".setField(): Invalid max. number of field."); + return false; + } + + // get the submit time field + if (submitTime > 0) { + SUBMIT_TIME = submitTime - 1; + } + else + { + System.out.println(super.get_name() + + ".setField(): Invalid submit time field."); + return false; + } + + // get the run time field + if (runTime > 0) { + REQ_RUN_TIME = runTime - 1; + } + else + { + System.out.println(super.get_name() + + ".setField(): Invalid run time field."); + return false; + } + + // get the number of processors field + if (numProc > 0) { + REQ_NUM_PROC = numProc - 1; + } + else + { + System.out.println(super.get_name() + + ".setField(): Invalid number of processors field."); + return false; + } + + return true; + } + + /** + * Gets a list of completed Gridlets + * @return a list of Gridlets + * @pre $none + * @post $none + */ + public ArrayList getGridletList() { + return list_; + } + + /** + * Prints the Gridlet objects + * @param history <tt>true</tt> means printing each Gridlet's history, + * <tt>false</tt> otherwise + * @pre $none + * @post $none + */ + public void printGridletList(boolean history) + { + String name = super.get_name(); + int size = list_.size(); + Gridlet gridlet; + + String indent = " "; + System.out.println(); + System.out.println("========== OUTPUT for " + name + " =========="); + System.out.println("Gridlet_ID" + indent + "STATUS" + indent + + "Resource_ID" + indent + "Cost"); + + int i = 0; + for (i = 0; i < size; i++) + { + gridlet = (Gridlet) list_.get(i); + System.out.print(indent + gridlet.getGridletID() + indent + + indent); + + // get the status of a Gridlet + System.out.print( gridlet.getGridletStatusString() ); + System.out.println( indent + indent + gridlet.getResourceID() + + indent + indent + gridlet.getProcessingCost() ); + } + + System.out.println(); + if (history == true) + { + // a loop to print each Gridlet's history + System.out.println(); + for (i = 0; i < size; i++) + { + gridlet = (Gridlet) list_.get(i); + System.out.println( gridlet.getGridletHistory() ); + + System.out.print("Gridlet #" + gridlet.getGridletID() ); + System.out.println(", length = " + gridlet.getGridletLength() + + ", finished so far = " + + gridlet.getGridletFinishedSoFar() ); + System.out.println("========================================="); + System.out.println(); + } + } + } + + /** + * Reads from a given file when the simulation starts running. + * Then submits Gridlets to a resource and collects them before exiting. + * To collect the completed Gridlets, use {@link #getGridletList()} + * @pre $none + * @post $none + */ + public void body() { + System.out.println(); + System.out.println(super.get_name() + ".body() :%%%% Start ..."); + + // create a temp array + fieldArray_ = new String[MAX_FIELD]; + + // get the resource id + if (resID_ < 0) + { + System.out.println(super.get_name() + + ".body(): Error - invalid resource name: " + resName_); + return; + } + + boolean success = false; + + // read the gz file + if (fileName_.endsWith(".gz") == true) { + success = readGZIPFile(fileName_); + } + // read the zip file + else if (fileName_.endsWith(".zip") == true) { + success = readZipFile(fileName_); + } + // read from uncompressed file as well + else { + success = readFile(fileName_); + } + + // if all the gridlets have been submitted + if (!success ) { + System.out.println(super.get_name() + + ".body(): Error - unable to parse from a file."); + return; + } + + System.out.println(super.get_name() + ": Collecting Gridlets ..."); + list_ = new ArrayList(gridletID_ + 1); + + Object data = null; + Gridlet gl = null; + + int counter = 1; // starts at 1, since gridletID_ starts at 1 too + Sim_event ev = new Sim_event(); + Object[] reservObj = null; + + while ( Sim_system.running() + && counter < gridletID_ ) { + + super.sim_get_next(ev); // get the next available event + data = ev.get_data(); // get the event's data + + // handle ping request + if (ev.get_tag() == GridSimTags.INFOPKT_SUBMIT) { + processPingRequest(ev); + continue; + } + else if (ev.get_tag() == RESERVE_RESOURCES) { + + reservObj = (Object[])ev.get_data(); + + double startTime = (Double)reservObj[0]; + int duration = (Integer)reservObj[1]; + Gridlet resGl = (Gridlet)reservObj[2]; + + // creates a new reservation + Reservation reservation = null; + reservation = super.createReservation(startTime, duration, resGl.getNumPE(), resID_); + + success = true; + if(reservation == null) { + success = false; + } + + // commit the reservation + if(success) { + // for a reservation with an even number, commits straightaway + // without sending any Gridlets yet + success = super.commitReservation(reservation.getID()); + + // submit the gridlet if success + if(success) { + + // sets the reservation id of this gridlet + resGl.setReservationID(reservation.getID()); + + // submit the gridlet to the resource + super.send(super.output, GridSimTags.SCHEDULE_NOW, GridSimTags.GRIDLET_SUBMIT, + new IO_data(resGl, resGl.getGridletFileSize(), resID_) ); + } + // if the reservation fails, then sets the status of the + // gridlet to failed and adds the gridlet to the list + else { + try { + resGl.setGridletStatus(Gridlet.FAILED); + } + catch(Exception ex) { + + } + list_.add(resGl); + } + } + counter++; + } + + // get the Gridlet data + else if (data != null && data instanceof Gridlet) { + gl = (Gridlet) data; + list_.add(gl); + counter++; + } + + // if all the Gridlets have been collected + if (counter == gridletID_) { + break; + } + } + + // shut down all the entities, including GridStatistics entity since + // we used it to record certain events. + shutdownGridStatisticsEntity(); + shutdownUserEntity(); + terminateIOEntities(); + + System.out.println(super.get_name() + ".body() : %%%% Exit ..."); + } + + //////////////////////// PROTECTED METHODS /////////////////////// + + /** + * Processes a ping request. + * @param ev a Sim_event object + * @pre ev != null + * @post $none + */ + protected void processPingRequest(Sim_event ev) + { + InfoPacket pkt = (InfoPacket) ev.get_data(); + pkt.setTag(GridSimTags.INFOPKT_RETURN); + pkt.setDestID( pkt.getSrcID() ); + + // sends back to the sender + super.send(super.output, GridSimTags.SCHEDULE_NOW, + GridSimTags.INFOPKT_RETURN, + new IO_data(pkt, pkt.getSize(), pkt.getSrcID()) ); + } + + //////////////////////// PRIVATE METHODS /////////////////////// + + /** + * Breaks a line of string into many fields. + * @param line a line of string + * @param lineNum a line number + * @pre line != null + * @pre lineNum > 0 + * @post $none + */ + private void parseValue(String line, int lineNum) + { + // skip a comment line + if (line.startsWith(COMMENT) == true) { + return; + } + + String[] sp = line.split("\\s+"); // split the fields based on a space + int i; // a counter + int len = 0; // length of a string + int index = 0; // the index of an array + + // check for each field in the array + for (i = 0; i < sp.length; i++) + { + len = sp[i].length(); // get the length of a string + + // if it is empty then ignore + if (len == 0) { + continue; + } + // if not, then put into the array + else + { + fieldArray_[index] = sp[i]; + index++; + } + } + + if (index == MAX_FIELD) { + extractField(fieldArray_, lineNum); + } + } + + /** + * Extracts relevant information from a given array + * @param array an array of String + * @param line a line number + * @pre array != null + * @pre line > 0 + */ + private void extractField(String[] array, int line) + { + try + { + Integer obj = null; + + // get the job number + int id = 0; + if (JOB_NUM == IRRELEVANT) { + id = gridletID_; + } + else + { + obj = new Integer( array[JOB_NUM].trim() ); + id = obj.intValue(); + } + + // get the submit time + Long l = new Long( array[SUBMIT_TIME].trim() ); + long submitTime = l.intValue(); + + // get the run time + obj = new Integer( array[REQ_RUN_TIME].trim() ); + int runTime = obj.intValue(); + + // if the required run time field is ignored, then use + // the actual run time + if (runTime == IRRELEVANT) + { + obj = new Integer( array[RUN_TIME].trim() ); + runTime = obj.intValue(); + } + + // according to the SWF manual, runtime of 0 is possible due + // to rounding down. E.g. runtime is 0.4 seconds -> runtime = 0 + if (runTime == 0) { + runTime = 1; // change to 1 second + } + + // get the number of allocated processors + obj = new Integer( array[REQ_NUM_PROC].trim() ); + int numProc = obj.intValue(); + + // if the required num of allocated processors field is ignored + // or zero, then use the actual field + if (numProc == IRRELEVANT || numProc == 0) + { + obj = new Integer( array[NUM_PROC].trim() ); + numProc = obj.intValue(); + } + + // finally, check if the num of PEs required is valid or not + if (numProc <= 0) + { + System.out.println(super.get_name() + ": Warning - job #" + + id + " at line " + line + " requires " + numProc + + " CPU. Change to 1 CPU."); + numProc = 1; + } + + // creates a submission/reservation event + submitGridlet(id, submitTime, runTime, numProc); + } + catch (Exception e) + { + System.out.println(super.get_name() + + ": Exception in reading file at line #" + line); + e.printStackTrace(); + } + } + + /** + * Creates a Gridlet with the given information, then submit it to a + * resource + * @param id a Gridlet ID + * @param submitTime Gridlet's submit time + * @param runTime Gridlet's run time + * @param numProc number of processors + * @pre id >= 0 + * @pre submitTime >= 0 + * @pre runTime >= 0 + * @pre numProc > 0 + * @post $none + */ + protected void submitGridlet(int id, long submitTime, int runTime, int numProc) { + // create the gridlet + int len = runTime * rating_; // calculate a job length for each PE + Gridlet gridlet = new Gridlet(id, len, size_, size_); + gridlet.setUserID( super.get_id() ); // set the owner ID + gridlet.setNumPE(numProc); // set the requested num of proc + + // check the probability of creating an advance reservation + double probAR = Math.abs(numGen_.nextDouble()); + + // check the submit time + if (submitTime < 0) { + submitTime = 0; + } + + if(probAR <= reservProbability_) { + + // calculate how long in advance the reservation is made + double timeInAdvance = timeInAdvance_ * numGen_.nextDouble(); + + // convert to seconds + double timeToReserve = submitTime - timeInAdvance; + + // if the time the reservation would be done has already + // past, then consider now as the submission time + if(timeToReserve <= 0.0D) { + timeToReserve = GridSimTags.SCHEDULE_NOW; + } + + //TODO To check the duration of the advance reservation later + Object[] reservObj = new Object[3]; + reservObj[0] = new Double(submitTime); // start time of the reservation + reservObj[1] = (int) runTime + 1; // the advance reservation duration + reservObj[2] = gridlet; // the gridlet to be submitted + + // submit an internal event to create a reservation for this gridlet + super.send(super.get_id(), timeToReserve, RESERVE_RESOURCES, reservObj); + } + else { + // printing to inform user + if (gridletID_ == 1 || gridletID_ % INTERVAL == 0) { + System.out.println(super.get_name() + ": Submitting Gridlets to " + + resName_ + " ..."); + } + + // submit a gridlet to resource + super.send(super.output, submitTime, GridSimTags.GRIDLET_SUBMIT, + new IO_data(gridlet, gridlet.getGridletFileSize(), resID_) ); + } + + gridletID_++; // increment the counter + } + + /** + * Reads a text file one line at the time + * @param fileName a file name + * @return <tt>true</tt> if reading a file is successful, <tt>false</tt> + * otherwise. + * @pre fileName != null + * @post $none + */ + private boolean readFile(String fileName) + { + boolean success = false; + BufferedReader reader = null; + try + { + FileInputStream file = new FileInputStream(fileName); + InputStreamReader input = new InputStreamReader(file); + reader = new BufferedReader(input); + + // read one line at the time + int line = 1; + while ( reader.ready() ) + { + parseValue(reader.readLine(), line); + line++; + } + + reader.close(); // close the file + success = true; + } + catch (FileNotFoundException f) + { + System.out.println(super.get_name() + + ": Error - the file was not found: " + f.getMessage()); + } + catch (IOException e) + { + System.out.println(super.get_name() + + ": Error - an IOException occurred: " + e.getMessage()); + } + finally + { + if (reader != null) + { + try { + reader.close(); // close the file + } + catch (IOException e) + { + System.out.println(super.get_name() + + ": Error - an IOException occurred: " + e.getMessage()); + } + } + } + + return success; + } + + /** + * Reads a gzip file one line at the time + * @param fileName a gzip file name + * @return <tt>true</tt> if reading a file is successful, <tt>false</tt> + * otherwise. + * @pre fileName != null + * @post $none + */ + private boolean readGZIPFile(String fileName) + { + boolean success = false; + BufferedReader reader = null; + try + { + FileInputStream file = new FileInputStream(fileName); + GZIPInputStream gz = new GZIPInputStream(file); + InputStreamReader input = new InputStreamReader(gz); + reader = new BufferedReader(input); + + // read one line at the time + int line = 1; + while ( reader.ready() ) + { + parseValue(reader.readLine(), line); + line++; + } + + reader.close(); // close the file + success = true; + } + catch (FileNotFoundException f) + { + System.out.println(super.get_name() + + ": Error - the file was not found: " + f.getMessage()); + } + catch (IOException e) + { + System.out.println(super.get_name() + + ": Error - an IOException occurred: " + e.getMessage()); + } + finally + { + if (reader != null) + { + try { + reader.close(); // close the file + } + catch (IOException e) + { + System.out.println(super.get_name() + + ": Error - an IOException occurred: " + e.getMessage()); + } + } + } + + return success; + } + + /** + * Reads a Zip file. Iterating through each entry and reading it one line + * at the time. + * @param fileName a zip file name + * @return <tt>true</tt> if reading a file is successful, <tt>false</tt> + * otherwise. + * @pre fileName != null + * @post $none + */ + private boolean readZipFile(String fileName) + { + boolean success = false; + ZipFile zipFile = null; + try + { + InputStreamReader input = null; + BufferedReader reader = null; + + // ZipFile offers an Enumeration of all the files in the Zip file + zipFile = new ZipFile(fileName); + for (Enumeration e = zipFile.entries(); e.hasMoreElements();) + { + success = false; // reset the value again + ZipEntry zipEntry = (ZipEntry) e.nextElement(); + + input = new InputStreamReader(zipFile.getInputStream(zipEntry)); + reader = new BufferedReader(input); + + // read one line at the time + int line = 1; + while ( reader.ready() ) + { + parseValue(reader.readLine(), line); + line++; + } + + reader.close(); // close the file + success = true; + } + } + catch (IOException e) + { + System.out.println(super.get_name() + + ": Error - an IOException occurred: " + e.getMessage()); + } + finally + { + if (zipFile != null) + { + try { + zipFile.close(); // close the file + } + catch (IOException e) + { + System.out.println(super.get_name() + + ": Error - an IOException occurred: " + e.getMessage()); + } + } + } + + return success; + } +} Added: branches/gridsim4.0-branch3/examples/examples/ar/ARTest.java =================================================================== --- branches/gridsim4.0-branch3/examples/examples/ar/ARTest.java (rev 0) +++ branches/gridsim4.0-branch3/examples/examples/ar/ARTest.java 2007-12-16 23:08:32 UTC (rev 82) @@ -0,0 +1,288 @@ +/* + * Author Marcos Dias de Assuncao + * Date: September 2007 + * Description: A simple program to demonstrate of how to use basic + * advanced reservation functionalities, such as create, commit + * and status. + */ + +package examples.ar; + +import gridsim.GridSim; +import gridsim.Gridlet; +import gridsim.GridletList; +import gridsim.turbo.Reservation; +import gridsim.turbo.ReservationRequester; +import gridsim.turbo.AvailabilityInfo; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.LinkedList; +import java.util.Random; + +/** + * A user entity that reserves a resource in advance. + * In this example, only explore some functionalities, such as: + * - requests a new advanced reservation + * - requests a new immediate reservation. Immediate reservation means use + * current time as the starting time + * - commits an accepted reservation + * - checks the status of a reservation + */ +public class A... [truncated message content] |