From: <mar...@us...> - 2008-02-11 05:27:39
|
Revision: 96 http://gridsim.svn.sourceforge.net/gridsim/?rev=96&view=rev Author: marcos_dias Date: 2008-02-10 21:27:42 -0800 (Sun, 10 Feb 2008) Log Message: ----------- Policy updated to provide options when a reservation is rejected. Modified Paths: -------------- branches/gridsim4.0-branch3/source/gridsim/turbo/ARParallelSpaceShared.java Modified: branches/gridsim4.0-branch3/source/gridsim/turbo/ARParallelSpaceShared.java =================================================================== --- branches/gridsim4.0-branch3/source/gridsim/turbo/ARParallelSpaceShared.java 2008-02-11 02:35:48 UTC (rev 95) +++ branches/gridsim4.0-branch3/source/gridsim/turbo/ARParallelSpaceShared.java 2008-02-11 05:27:42 UTC (rev 96) @@ -303,7 +303,7 @@ // creates a Server Side Reservation (i.e. SSReservation) SSReservation sRes = new SSReservation(reservation); - double expTime; + double expTime = Double.NaN; // creates a response message to be sent to the requester ARMessage response = message.createResponse(); @@ -330,8 +330,10 @@ return; } + boolean success = true; + // if start time is 0, then it is an immediate reservation - if(startTime == 0) { + if(startTime == 0 || startTime == currentTime) { // sets the start time of the reservation as the current time startTime = currentTime; @@ -353,31 +355,29 @@ userName + " user requires " + reservation.getNumPE() + " PEs from " + startTime + " to " + (startTime + duration)); System.out.println("--> The resource cannot handle the reservation"); - - reservation.setStatus(Reservation.STATUS_FAILED); - response.setErrorCode(ARMessage.EC_OPERATION_FAILURE); - super.sendARMessage(response); - return; + success = false; } - - // gets the index of the entry closest to the termination of the - // reservation but whose time is not larger than the reservation's - // termination time - int tailIndex = (Integer)availObj[0]; - - // gets the list of PEs selected for the reservation - PERangeList selected = (PERangeList)availObj[1]; - - // allocates the list of PEs to the reservation - sRes.setPERangeList(selected); - - // updates the availability profile accordingly - allocateImmediatePERanges(tailIndex, selected, - currentTime, sRes.getFinishTime()); - - // the expiration time for immediate reservation is the - // termination time - expTime = sRes.getFinishTime(); + else { // there resources available + + // gets the index of the entry closest to the termination of the + // reservation but whose time is not larger than the reservation's + // termination time + int tailIndex = (Integer)availObj[0]; + + // gets the list of PEs selected for the reservation + PERangeList selected = (PERangeList)availObj[1]; + + // allocates the list of PEs to the reservation + sRes.setPERangeList(selected); + + // updates the availability profile accordingly + allocateImmediatePERanges(tailIndex, selected, + currentTime, sRes.getFinishTime()); + + // the expiration time for immediate reservation is the + // termination time + expTime = sRes.getFinishTime(); + } } // It is not an immediate reservation else { @@ -396,71 +396,84 @@ userName + " user requires " + reservation.getNumPE() + " PEs from " + startTime + " to " + (startTime + duration) ); System.out.println("--> The resource cannot handle the reservation"); - - reservation.setStatus(Reservation.STATUS_FAILED); - response.setErrorCode(ARMessage.EC_OPERATION_FAILURE); - super.sendARMessage(response); - return; + success = false; } - - // gets the index of the entry closest to the start time - // of the reservation and whose time is smaller or equals - // to the reservation's start time - int anchorIndex = (Integer)availObj[0]; - - // gets the index of the entry closest to the termination of the - // reservation but whose time is not larger than the reservation's - // termination time - int tailIndex = (Integer)availObj[1]; - - // gets the list of PE ranges selected for the reservation - // and sets the reservation to use them - PERangeList selected = (PERangeList)availObj[2]; - sRes.setPERangeList(selected); - - // allocates the ranges and updates the availability profile - allocatePERanges(anchorIndex, tailIndex, selected, - startTime, sRes.getFinishTime()); - - // calculate the expiration time of the reservation - expTime = currentTime + commitPeriod_; - - // if the expiration time is greater than the start time of the - // reservation, then set the expiration time as the start time - if(expTime > startTime) { - expTime = startTime; + else { // there are resource available + + // gets the index of the entry closest to the start time + // of the reservation and whose time is smaller or equals + // to the reservation's start time + int anchorIndex = (Integer)availObj[0]; + + // gets the index of the entry closest to the termination of the + // reservation but whose time is not larger than the reservation's + // termination time + int tailIndex = (Integer)availObj[1]; + + // gets the list of PE ranges selected for the reservation + // and sets the reservation to use them + PERangeList selected = (PERangeList)availObj[2]; + sRes.setPERangeList(selected); + + // allocates the ranges and updates the availability profile + allocatePERanges(anchorIndex, tailIndex, selected, + startTime, sRes.getFinishTime()); + + // calculate the expiration time of the reservation + expTime = currentTime + commitPeriod_; + + // if the expiration time is greater than the start time of the + // reservation, then set the expiration time as the start time + if(expTime > startTime) { + expTime = startTime; + } } } - // if the start time of the reservation is equals to the current - // time, meaning that it is an immediate reservation, then start - // the reservation straight away. Therefore, sets the status to - // committed and sends an internal event to start the reservation - if(currentTime == startTime) { - sRes.setStatus(Reservation.STATUS_COMMITTED); - super.sendInternalEvent(GridSimTags.SCHEDULE_NOW, START_RESERVATION); + // resources are available and have been allocated for the reservation + if(success) { + + // if the start time of the reservation is equals to the current + // time, meaning that it is an immediate reservation, then start + // the reservation straight away. Therefore, sets the status to + // committed and sends an internal event to start the reservation + if(currentTime == startTime) { + sRes.setStatus(Reservation.STATUS_COMMITTED); + super.sendInternalEvent(GridSimTags.SCHEDULE_NOW, START_RESERVATION); + } + else { + sRes.setStatus(Reservation.STATUS_NOT_COMMITTED); + } + + sRes.setExpiryTime(expTime); + + // add the reservation into the reservation table and sends the + // response message to the requester + reservTable_.put(new Integer(sRes.getID()), sRes); + super.sendARMessage(response); + + // then send this into itself to check for expired reservations + super.sendInternalEvent(expTime - currentTime, + EXPIRY_TIME); + + //-------------- FOR DEBUGGING PURPOSES ONLY -------------- + + // Informs the listeners about the reservation that has been created + GridSim.notifyListeners(this.get_id(), AllocationAction.ITEM_SCHEDULED, true, sRes); + + //---------------------------------------------------------- } - else { - sRes.setStatus(Reservation.STATUS_NOT_COMMITTED); + else { // Creates a list of options + + // Gets availability information and provides it as options + AvailabilityInfo availability = + getAvailabilityInfo(startTime, Integer.MAX_VALUE); + + reservation.setStatus(Reservation.STATUS_FAILED); + reservation.setReservationOptions(availability); + response.setErrorCode(ARMessage.EC_OPERATION_FAILURE_BUT_OPTIONS); + super.sendARMessage(response); } - - sRes.setExpiryTime(expTime); - - // add the reservation into the reservation table and sends the - // response message to the requester - reservTable_.put(new Integer(sRes.getID()), sRes); - super.sendARMessage(response); - - // then send this into itself to check for expired reservations - super.sendInternalEvent(expTime - currentTime, - EXPIRY_TIME); - - //-------------- FOR DEBUGGING PURPOSES ONLY -------------- - - // Informs the listeners about the reservation that has been created - GridSim.notifyListeners(this.get_id(), AllocationAction.ITEM_SCHEDULED, true, sRes); - - //---------------------------------------------------------- } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |