Пример #1
0
  public GridletReply askGridletStatusToAgent(int dst_agentID, int dst_resID, Gridlet gridlet) {
    GridletRequest request =
        new GridletRequest(this.get_id(), this.get_id(), dst_agentID, dst_resID, gridlet);
    int requestID = request.getRequestID();
    int reqrepID = request.getReqrepID();
    super.send(
        super.output,
        GridSimTags.SCHEDULE_NOW,
        Tags.GRIDLET_STATUS_REQ,
        new IO_data(request, gridlet.getGridletFileSize(), request.getDst_agentID()));

    Sim_type_p ptag = new Sim_type_p(Tags.GRIDLET_STATUS_REP);
    Sim_event ev = new Sim_event();
    super.sim_get_next(ptag, ev); // only look for this type of ack
    GridletReply gridletReply = GridletReply.get_data(ev);

    Assert.assertEquals(requestID, gridletReply.getRequestID());
    Assert.assertEquals(Tags.GRIDLET_STATUS_REQ, gridletReply.getRequestTAG());
    Assert.assertEquals(Tags.GRIDLET_STATUS_REP, ev.get_tag());
    double evrecv_time = GridSim.clock();
    String msg =
        String.format(
            "%1$f %2$d %3$s <-- GOT GRIDLET_STATUS_REP for Gridlet %4$d of Gridlet %5$d with status %6$d",
            evrecv_time,
            reqrepID,
            this.get_name(),
            gridletReply.getReceivedGridlet().getGridletID(),
            gridletReply.getRequest().getGridlet().getGridletID(),
            gridletReply.getRequest().getGridlet().getGridletStatus());
    this.write(msg);
    return gridletReply;
  }
Пример #2
0
  protected GISReply requestToGIS() {
    int SIZE = 500;
    double evsend_time = 0;
    GISRequest request = new GISRequest(this.get_id(), this.get_id());
    int requestID = request.getRequestID();
    int reqrepID = request.getReqrepID();
    super.send(
        super.output,
        GridSimTags.SCHEDULE_NOW,
        Tags.GIS_REQUEST,
        new IO_data(request, SIZE, super.getEntityId("GISService")));
    evsend_time = GridSim.clock();
    String msg =
        String.format("%1$f %2$d %3$s --> GAP GIS_REQUEST", evsend_time, reqrepID, this.get_name());
    this.write(msg);

    Sim_event ev = new Sim_event();
    Predicate predicate = new Predicate(Tags.GIS_REPLY);
    super.sim_get_next(predicate, ev); // only look for this type of ack
    GISReply reply = GISReply.get_data(ev);
    Assert.assertEquals(requestID, reply.getRequestID());
    Assert.assertEquals(Tags.GIS_REQUEST, reply.getRequestTAG());
    Assert.assertEquals(Tags.GIS_REPLY, ev.get_tag());
    double evrecv_time = GridSim.clock();
    msg =
        String.format(
            "%1$f %2$d %3$s <-- GAP GIS_REPLY\n",
            evrecv_time, reqrepID, this.get_name(), reply.getGIS());
    this.write(msg);
    return reply;
  }
Пример #3
0
  public AgentReply hasGridletsAgent(AgentRequest request, boolean trace) {
    int requestID = request.getRequestID();
    int reqrepID = request.getReqrepID();
    double evsend_time = 0;
    int agentType = request.getDst_entityType();
    int SIZE = 500;
    super.send(
        super.output,
        GridSimTags.SCHEDULE_NOW,
        Tags.HASGRIDLETS_REQUEST,
        new IO_data(request, SIZE, request.getDst_agentID()));
    evsend_time = GridSim.clock();
    String msg =
        String.format(
            "%1$f %2$d %3$s --> AM_%4$s::HASGRIDLETS_REQUEST %6$s (%7$s AID %9$d) %5$s AM_%8$s",
            evsend_time,
            reqrepID,
            this.get_name(),
            super.getEntityName(request.getDst_resID()),
            EntityTypes.toString(request.getDst_entityType()),
            Tags.toString(Tags.HASGRIDLETS_REQUEST),
            super.getEntityName(request.getDst_agentID()),
            super.getEntityName(request.getDst_moveToresID()),
            request.getDst_AID());
    if (trace) {
      this.write(msg);
    }

    Sim_type_p ptag = new Sim_type_p(Tags.HASGRIDLETS_REPLY);
    Sim_event ev = new Sim_event();
    super.sim_get_next(ptag, ev); // only look for this type of ack
    AgentReply agentReply = AgentReply.get_data(ev);
    if (agentReply == null) {
      Assert.fail();
    }
    Assert.assertEquals(requestID, agentReply.getRequestID());
    Assert.assertEquals(Tags.HASGRIDLETS_REQUEST, agentReply.getRequestTAG());
    Assert.assertEquals(ev.get_tag(), Tags.HASGRIDLETS_REPLY);

    double evrecv_time = GridSim.clock();
    msg =
        String.format(
            "%1$f %2$d %3$s <-- AM_%4$s::%7$s %8$s (%6$s AID %10$d) %5$s AM_%9$s",
            evrecv_time,
            reqrepID,
            this.get_name(),
            super.getEntityName(agentReply.getRequest().getDst_resID()),
            EntityTypes.toString(agentType),
            super.getEntityName(request.getDst_agentID()),
            agentReply.isOk(),
            Tags.toString(Tags.HASGRIDLETS_REPLY),
            super.getEntityName(request.getDst_moveToresID()),
            request.getDst_AID());
    if (trace) {
      this.write(msg);
    }
    return agentReply;
  }
Пример #4
0
  /** Reads jobs from data_set file and sends them to the Scheduler entity dynamically over time. */
  public void body() {
    super.gridSimHold(10.0); // hold by 10 second

    while (current_gl < total_jobs) {

      Sim_event ev = new Sim_event();
      sim_get_next(ev);

      if (ev.get_tag() == AleaSimTags.EVENT_WAKE) {

        ComplexGridlet gl = readGridlet(current_gl);
        current_gl++;
        if (gl == null && current_gl < total_jobs) {
          super.sim_schedule(this.getEntityId(this.getEntityName()), 0.0, AleaSimTags.EVENT_WAKE);
          continue;
        } else if (gl == null && current_gl >= total_jobs) {
          continue;
        }
        // to synchronize job arrival wrt. the data set.
        double delay = Math.max(0.0, (gl.getArrival_time() - super.clock()));
        // some time is needed to transfer this job to the scheduler, i.e., delay should be delay =
        // delay - transfer_time. Fix this in the future.
        // System.out.println("Sending: "+gl.getGridletID());
        last_delay = delay;
        super.sim_schedule(
            this.getEntityId("Alea_3.0_scheduler"), delay, AleaSimTags.GRIDLET_INFO, gl);

        delay = Math.max(0.0, (gl.getArrival_time() - super.clock()));
        if (current_gl < total_jobs) {
          // use delay - next job will be loaded after the simulation time is equal to the previous
          // job arrival.
          super.sim_schedule(this.getEntityId(this.getEntityName()), delay, AleaSimTags.EVENT_WAKE);
        }

        continue;
      }
    }
    System.out.println("Shuting down - last gridlet = " + current_gl + " of " + total_jobs);
    super.sim_schedule(
        this.getEntityId("Alea_3.0_scheduler"),
        Math.round(last_delay + 2),
        AleaSimTags.SUBMISSION_DONE,
        new Integer(current_gl));
    Sim_event ev = new Sim_event();
    sim_get_next(ev);

    if (ev.get_tag() == GridSimTags.END_OF_SIMULATION) {
      System.out.println(
          "Shuting down the "
              + data_set
              + "_PWALoader... with: "
              + fail
              + " failed or skipped jobs");
    }
    shutdownUserEntity();
    super.terminateIOEntities();
  }
Пример #5
0
  public AgentReply testTestService() {
    double evsend_time = 0;
    int SIZE = 500;
    AgentRequest request = null;
    request =
        new AgentRequest(
            this.get_id(),
            this.get_id(),
            null,
            this.getVirtualOrganization().getPlatform().getGridElement().get_id(),
            Sim_system.get_entity_id("TestService"),
            EntityTypes.AGENT_ZOMBIE,
            SIZE,
            this.getVirtualOrganization().getPlatform().getGridElement().get_id(),
            EntityTypes.NOBODY);
    int requestID = request.getRequestID();
    int reqrepID = request.getReqrepID();
    super.send(
        super.output,
        GridSimTags.SCHEDULE_NOW,
        Tags.TEST_SERVICE_REQ,
        new IO_data(request, SIZE, Sim_system.get_entity_id("TestService")));
    evsend_time = GridSim.clock();

    String msg =
        String.format(
            "%1$f %2$d %3$s --> %4$s", evsend_time, reqrepID, this.get_name(), "TestService");
    this.write(msg);

    Sim_type_p ptag = new Sim_type_p(Tags.TEST_SERVICE_REP);
    Sim_event ev = new Sim_event();
    super.sim_get_next(ptag, ev); // only look for this type of ack
    AgentReply reply = AgentReply.get_data(ev);

    Assert.assertEquals(requestID, reply.getRequestID());
    Assert.assertEquals(Tags.TEST_SERVICE_REQ, reply.getRequestTAG());
    Assert.assertEquals(Tags.TEST_SERVICE_REP, ev.get_tag());

    double evrecv_time = GridSim.clock();

    msg =
        String.format(
            "%1$f %2$d %3$s <-- %4$s", evrecv_time, reqrepID, this.get_name(), "TestService");
    this.write(msg);

    return reply;
  }
Пример #6
0
 protected void processEvent(Sim_event ev) {
   int tag = ev.get_tag();
   switch (tag) {
     default:
       this.processOtherEvent(ev);
       break;
   }
 }
Пример #7
0
  public GridletReply submitGridletToAgent(int dst_agentID, int dst_resID, Gridlet gridlet) {
    GridletRequest request =
        new GridletRequest(this.get_id(), this.get_id(), dst_agentID, dst_resID, gridlet);
    int requestID = request.getRequestID();
    int reqrepID = request.getReqrepID();
    super.send(
        super.output,
        GridSimTags.SCHEDULE_NOW,
        Tags.GRIDLET_SUBMIT_REQ,
        new IO_data(request, gridlet.getGridletFileSize(), request.getDst_agentID()));

    Sim_type_p ptag = new Sim_type_p(Tags.GRIDLET_SUBMIT_REP);
    Sim_event ev = new Sim_event();
    super.sim_get_next(ptag, ev); // only look for this type of ack
    GridletReply reply = GridletReply.get_data(ev);

    Assert.assertEquals(requestID, reply.getRequestID());
    Assert.assertEquals(Tags.GRIDLET_SUBMIT_REQ, reply.getRequestTAG());
    Assert.assertEquals(Tags.GRIDLET_SUBMIT_REP, ev.get_tag());
    double evrecv_time = GridSim.clock();
    if (reply.isOk()) {
      String msg =
          String.format(
              "%1$f %2$d %3$s <-- GOT GRIDLET_REPLY for Gridlet %4$d of Gridlet %5$d with result TRUE on AM_%6$s",
              evrecv_time,
              reqrepID,
              this.get_name(),
              reply.getReceivedGridlet().getGridletID(),
              reply.getRequest().getGridlet().getGridletID(),
              super.getEntityName(reply.getRequest().getDst_resID()));
      this.write(msg);
    } else {
      String msg =
          String.format(
              "%1$f %2$d %3$s <-- GOT GRIDLET_REPLY for Gridlet %4$d of Gridlet %5$d with result FALSE on AM_%6$s",
              evrecv_time,
              reqrepID,
              this.get_name(),
              reply.getReceivedGridlet().getGridletID(),
              reply.getRequest().getGridlet().getGridletID(),
              super.getEntityName(reply.getRequest().getDst_resID()));
      this.write(msg);
    }
    return reply;
  }
Пример #8
0
  protected ServicesListReply requestServicesList() {
    int SIZE = 500;
    double evsend_time = 0;
    ServicesListRequest request = new ServicesListRequest(this.get_id(), this.get_id());
    int requestID = request.getRequestID();
    int reqrepID = request.getReqrepID();
    super.send(
        super.output,
        GridSimTags.SCHEDULE_NOW,
        Tags.AP_SERVICES_LIST_REQ,
        new IO_data(request, SIZE, this.getVirtualOrganization().getPlatform().get_id()));
    evsend_time = GridSim.clock();
    String msg =
        String.format(
            "%1$f %2$d %3$s --> %4$s SERVICES_LIST_REQUEST",
            evsend_time,
            reqrepID,
            this.get_name(),
            this.getVirtualOrganization().getPlatform().get_name());
    this.write(msg);

    Sim_event ev = new Sim_event();
    Predicate predicate = new Predicate(Tags.AP_SERVICES_LIST_REP);
    super.sim_get_next(predicate, ev); // only look for this type of ack
    ServicesListReply reply = ServicesListReply.get_data(ev);
    Assert.assertEquals(requestID, reply.getRequestID());
    Assert.assertEquals(Tags.AP_SERVICES_LIST_REQ, reply.getRequestTAG());
    Assert.assertEquals(Tags.AP_SERVICES_LIST_REP, ev.get_tag());
    double evrecv_time = GridSim.clock();
    msg =
        String.format(
            "%1$f %2$d %3$s <-- %4$s SERVICES_LIST_REPLY %5$s",
            evrecv_time,
            reqrepID,
            this.get_name(),
            this.getVirtualOrganization().getPlatform().get_name(),
            reply.getServicesList());
    this.write(msg);
    return reply;
  }
Пример #9
0
  protected PingReply requestPing(int src_id, int dst_id) {
    int SIZE = 500;
    double evsend_time = 0;
    PingRequest request = new PingRequest(this.get_id(), this.get_id(), src_id, dst_id);
    int requestID = request.getRequestID();
    int reqrepID = request.getReqrepID();
    super.send(
        super.output, GridSimTags.SCHEDULE_NOW, Tags.PING_REQ, new IO_data(request, SIZE, src_id));
    evsend_time = GridSim.clock();
    String msg =
        String.format(
            "%1$f %2$d %3$s --> AM_%4$s PING_REQUEST AM_%5$s",
            evsend_time,
            reqrepID,
            this.get_name(),
            super.getEntityName(src_id),
            super.getEntityName(dst_id));
    this.write(msg);

    Sim_event ev = new Sim_event();
    Predicate predicate = new Predicate(Tags.PING_REP);
    super.sim_get_next(predicate, ev); // only look for this type of ack
    PingReply reply = PingReply.get_data(ev);
    Assert.assertEquals(requestID, reply.getRequestID());
    Assert.assertEquals(Tags.PING_REQ, reply.getRequestTAG());
    Assert.assertEquals(Tags.PING_REP, ev.get_tag());
    double evrecv_time = GridSim.clock();
    msg =
        String.format(
            "%1$f %2$d %3$s <-- AM_%4$s PING_REQUEST AM_%5$s",
            evrecv_time,
            reqrepID,
            this.get_name(),
            super.getEntityName(src_id),
            super.getEntityName(dst_id));
    this.write(msg);
    return reply;
  }
Пример #10
0
  AgentReply requestToAgent(AgentRequest request, int tag) {
    int requestID = request.getRequestID();
    int reqrepID = request.getReqrepID();
    double evsend_time = 0;
    int agentType = request.getDst_entityType();
    int SIZE;
    if (tag == Tags.AGENT_RUN_REQ) {
      SIZE = request.getDst_agentSize();
    } else {
      SIZE = 500;
    }
    if ((tag == Tags.AGENT_RUN_REQ)
        || (tag == Tags.AGENT_KILL_REQ)
        || (tag == Tags.AGENT_KILLAWAIT_REQ)
        || (tag == Tags.AGENT_PAUSE_REQ)
        || (tag == Tags.AGENT_RESUME_REQ)) {
      super.send(
          super.output,
          GridSimTags.SCHEDULE_NOW,
          tag,
          new IO_data(request, SIZE, request.getDst_resID()));
    } else {
      super.send(
          super.output,
          GridSimTags.SCHEDULE_NOW,
          tag,
          new IO_data(request, SIZE, request.getDst_agentID()));
    }
    evsend_time = GridSim.clock();
    String msg =
        String.format(
            "%1$f %2$d %3$s --> AM_%4$s::REQUEST %6$s (%7$s AID %9$d) %5$s AM_%8$s",
            evsend_time,
            reqrepID,
            this.get_name(),
            super.getEntityName(request.getDst_resID()),
            EntityTypes.toString(request.getDst_entityType()),
            Tags.toString(tag),
            super.getEntityName(request.getDst_agentID()),
            super.getEntityName(request.getDst_moveToresID()),
            request.getDst_AID());
    this.write(msg);

    Sim_type_p ptag = new Sim_type_p(tag + 1);
    Sim_event ev = new Sim_event();
    super.sim_get_next(ptag, ev); // only look for this type of ack
    AgentReply agentReply = AgentReply.get_data(ev);

    if (agentReply != null) {
      Assert.assertEquals(requestID, agentReply.getRequestID());
      Assert.assertEquals(tag, agentReply.getRequestTAG());
      Assert.assertEquals(ev.get_tag(), tag + 1);

      double evrecv_time = GridSim.clock();
      msg =
          String.format(
              "%1$f %2$d %3$s <-- AM_%4$s::%7$s %8$s (%6$s AID %10$d) %5$s AM_%9$s",
              evrecv_time,
              reqrepID,
              this.get_name(),
              super.getEntityName(agentReply.getRequest().getDst_resID()),
              EntityTypes.toString(agentType),
              super.getEntityName(request.getDst_agentID()),
              agentReply.isOk(),
              Tags.toString(tag),
              super.getEntityName(request.getDst_moveToresID()),
              request.getDst_AID());
      this.write(msg);
    }
    return agentReply;
  }
Пример #11
0
  public void body() {
    ArrayList<String> oppnetTasks = null;
    Help helpObject = null;

    boolean admitted = false;
    boolean Done = false;
    boolean Released = false;
    boolean sent = false;
    Node Inviting_Node = null;
    boolean validated = false;
    boolean joined = false;
    boolean canForward = false;
    boolean member = false;
    boolean admit = false;

    Helper Candidate_Helper = null;

    // Step 2.1: Node listens to incoming messages
    Sim_event ev = new Sim_event();
    ev = this.NODE_listen();
    if (ev.get_data() != null) {
      sim_trace(
          1,
          "Step 2.1 Done: "
              + this.get_name()
              + ", "
              + this.get_id()
              + " received a message from a node with id "
              + ev.get_src());

      // Step 2.2: Node processes the message (Node_processMsg)
      this.NODE_processMsg(this.msgPayloadReadtime);
      sim_trace(1, "msgpayloadReadtime from helper " + this.msgPayloadReadtime);
      validated = this.NODE_validate(ev);
      if (validated) {

        sim_trace(
            1,
            "Step 2.2 Done: "
                + this.get_name()
                + ", "
                + this.get_id()
                + " processes the message and it is a help request from "
                + Sim_system.get_entity(ev.get_src()).get_name()
                + ", "
                + Sim_system.get_entity(ev.get_src()).get_id());
        Inviting_Node = (Node) Sim_system.get_entity(ev.get_src());

        // Step 2.3: Node accepts invitation if it can join oppnet or is willing to join oppnet
        joined =
            this.NODE_joinOppnet(
                this.category,
                this.helperWorkloadRatio,
                Inviting_Node,
                this.ctrlMsgDelTimeThroughLinkToParent);

        if (joined) {
          sim_trace(
              1,
              "Step 2.3 Done: "
                  + this.get_name()
                  + ", "
                  + this.get_id()
                  + " accepted invitation of "
                  + Inviting_Node.get_name()
                  + ", "
                  + Inviting_Node.get_id());

          // Step 2.4: Node listens to admission notification
          ev = new Sim_event();
          ev = this.NODE_listen();
          if (ev.get_data() != null) {
            sim_trace(
                1,
                "Step 2.4 Done: "
                    + this.get_name()
                    + ", "
                    + this.get_id()
                    + " received a message from a node with id "
                    + ev.get_src());

            // Step 2.5: Node process the message (Node_processMsg)
            this.NODE_processMsg(this.msgPayloadReadtime);
            sim_process(this.msgPayloadReadtime);
            // Step 2.5a: Node_validate
            if (ev.get_data().equals("Admitted")) {
              sim_trace(
                  1,
                  "Step 2.5a Done: "
                      + this.get_name()
                      + ", "
                      + this.get_id()
                      + " processes the message and it is admission notification from  "
                      + Sim_system.get_entity(ev.get_src()).get_name()
                      + ", "
                      + Sim_system.get_entity(ev.get_src()).get_id());
              admitted = true;
              Inviting_Node = (Node) Sim_system.get_entity(ev.get_src());
            }
          }
        } // if(joined)
      } // end if(validated)
    } // end if(ev.get_data()!=null))
    boolean received_helpObject = false;
    boolean received_oppnetTasks = false;

    if (admitted) {

      // Step 2.6: Node listen to help object and oppnet tasks from inviting node (Node_listen)
      while ((!received_helpObject) || (!received_oppnetTasks)) {
        ev = new Sim_event();
        ev = this.NODE_listen();
        if (ev.get_data() != null) {
          sim_trace(
              1,
              "Step 2.6: "
                  + this.get_name()
                  + ", "
                  + this.get_id()
                  + " received a message from a node with id "
                  + ev.get_src());
          // Step 2.7: Node processes the message (Node_processMsg)
          this.NODE_processMsg(this.msgPayloadReadtime);

          if (!received_helpObject && ((ev.get_tag() == 19) || (ev.get_tag() == 220))) {
            sim_trace(
                1,
                "Step 2.7: "
                    + this.get_name()
                    + ", "
                    + this.get_id()
                    + " processes the message and it is the help object from "
                    + Sim_system.get_entity(ev.get_src()).get_name()
                    + ","
                    + ev.get_src());
            helpObject = (Help) ev.get_data();
            received_helpObject = true;
          }
          if (!received_oppnetTasks && ((ev.get_tag() == 110) || (ev.get_tag() == 221))) {
            sim_trace(
                1,
                "Step 2.8: "
                    + this.get_name()
                    + ", "
                    + this.get_id()
                    + " processes the message and it is the oppnet tasks from "
                    + Sim_system.get_entity(ev.get_src()).get_name()
                    + ","
                    + ev.get_src());
            oppnetTasks = (ArrayList) ev.get_data();
            received_oppnetTasks = true;
          }
        }
      }

      // Step 2.9: Node checks which of the oppnet tasks it can perform (Node_selectTask) and
      // (Node_runApp)
      ArrayList<String> DeviceTasks = new ArrayList<String>();

      Done = this.NODE_selectTask(this, this.DeviceApps, oppnetTasks, helpObject, pr);
      // Done =  this.NODE_runApp(this.get_id(), this.get_name(), DeviceTasks, this.pr, helpObject);
      //  Done =  this.NODE_runApp(this, this.get_id(), this.get_name(), DeviceTasks, this.pr,
      // helpObject);

      // Step 2.10: Node check if the task done is the goal
      if (Done) {
        sim_trace(
            1, "Step 2.10: " + this.get_name() + ", " + this.get_id() + " is done with the goal");
        Released =
            this.NODE_reqRelease(
                this.get_id(),
                this.get_name(),
                Inviting_Node,
                this.ctrlMsgDelTimeThroughLinkToParent,
                "Done..ReqRelease");
      }

      if (!Done) {
        // Step 2.11: Helper did not do the goal.. so It scans for
        sim_trace(
            1,
            "Step 2.11: "
                + this.get_name()
                + ", "
                + this.get_id()
                + " I could not do the goal,, I will forward");
        CandidateHelpers = this.NODE_scan(this, pr, 100);

        sim_trace(
            1,
            "Step 2.12 Done: "
                + this.get_name()
                + ", "
                + this.get_id()
                + " is done scanning for helpers in range and found the following:");
        double startTime = Math.floor(Sim_system.sim_clock() * 100) / 100;

        if (CandidateHelpers.size() == 0) {
          sim_trace(1, "None");
          sim_trace(
              1,
              "Step 2.13: "
                  + this.get_name()
                  + ", "
                  + this.get_id()
                  + " Could not find grand kids");
          Released =
              this.NODE_reqRelease(
                  this.get_id(),
                  this.get_name(),
                  Inviting_Node,
                  this.ctrlMsgDelTimeThroughLinkToParent,
                  "NoGrandKids..ReqRelease");
          sent = true;
        } else {
          for (int z = 0; z < CandidateHelpers.size(); z++)
            sim_trace(
                1,
                this.get_name()
                    + ", "
                    + this.get_id()
                    + ", found "
                    + CandidateHelpers.get(z).get_name()
                    + ", ID = "
                    + CandidateHelpers.get(z).get_id());
        } // end else

        int i = 0;
        while (i < CandidateHelpers.size()) {
          // Step 2.14: Node discovers services in candidate helpers(Node_discover)
          canForward = this.NODE_discover(CandidateHelpers.get(i));

          if (canForward) {
            Candidate_Helper = CandidateHelpers.get(i);
            sim_trace(
                1,
                "Step 2.14 Done: "
                    + this.get_name()
                    + " ,"
                    + this.get_id()
                    + " discovered forwarding services in "
                    + Candidate_Helper.get_name()
                    + ", "
                    + Candidate_Helper.get_id());

            // Step 2.15: Node checks if the candidate helper is already a member of Oppnet
            // (Node_isMember)

            member = this.NODE_isMember(pr.oppnet, Candidate_Helper);
            if (member) {
              sim_trace(
                  1,
                  "Step 2.15 Done:"
                      + Candidate_Helper.get_name()
                      + ", "
                      + Candidate_Helper.get_id()
                      + " is already a member of oppnet");
            } else {
              sim_trace(
                  1,
                  "Step 2.15 Done:"
                      + Candidate_Helper.get_name()
                      + ", "
                      + Candidate_Helper.get_id()
                      + " is not a member of oppnet");

              // Step 2.16: Node sends a request for help to candidate helper (Node_regHelp)
              this.NODE_reqHelp(Candidate_Helper);
              this.numOfRequestedHelpersPerNode++;
              sim_trace(
                  1,
                  "Step 2.16 Done: "
                      + this.get_name()
                      + ", "
                      + this.get_id()
                      + " sent a request for help to "
                      + Candidate_Helper.get_name()
                      + ", "
                      + Candidate_Helper.get_id());
            } // end else
          } // end if(canForward)

          // Step 2.17: Node listens to invitation acceptance from candidate helper (Node_listen)
          ev = new Sim_event();
          ev = this.NODE_listen();
          if (ev.get_data() != null) {

            sim_trace(
                1,
                "Step 2.17 Done: "
                    + this.get_name()
                    + ", "
                    + this.get_id()
                    + " received a message from a node with id "
                    + ev.get_src());

            // Step 2.18a: Node evaluate the the node that accepted the invitation (Node_evalAdmit)
            this.NODE_processMsg(this.msgPayloadReadtime);
            admit = this.NODE_evalAdmit(ev, Candidate_Helper);

            if (ev.get_data().equals("Released")) {
              sim_trace(
                  1,
                  "Step 2.18a Done: "
                      + this.get_name()
                      + ", "
                      + this.get_id()
                      + " evaluated the message and source and it is released notification from "
                      + Inviting_Node.get_name()
                      + ", "
                      + Inviting_Node.get_id());
              Released = true;
              break;
            }
            if (ev.get_data().equals("Done..ReqRelease")) {
              sim_trace(
                  1,
                  "Step 2.18a Done: "
                      + this.get_name()
                      + ", "
                      + this.get_id()
                      + " evaluated the message and source and it is Done notification from "
                      + Sim_system.get_entity(ev.get_src()).get_name()
                      + ", "
                      + Sim_system.get_entity(ev.get_src()).get_id());
              Done = true;
              Released =
                  this.NODE_reqRelease(
                      this.get_id(),
                      this.get_name(),
                      Inviting_Node,
                      this.ctrlMsgDelTimeThroughLinkToParent,
                      "Done..ReqRelease");
              if (Released) break;
            }
            if (admit) {
              this.numOfJoindHelpersPerNode++;
              this.AdmittedHelpers.add(Candidate_Helper);
              pr.oppnet = this.NODE_addNode(pr.oppnet, Candidate_Helper);
              sim_trace(
                  1,
                  "Step 2.19a Done: "
                      + this.get_name()
                      + ", "
                      + this.get_id()
                      + " added "
                      + Candidate_Helper.get_name()
                      + ", "
                      + Candidate_Helper.get_id()
                      + " to oppnet");
              //  sim_trace(1, "Helper Integration Time = "+
              // Math.floor(Sim_system.sim_clock()*100)/100);
              double endTime = Math.floor(Sim_system.sim_clock() * 100) / 100;

              this.hlprIntegTime.add((endTime - startTime));

              // Step 2.20: Node sends help object to admitted helper (Node_report)
              this.NODE_report(Candidate_Helper, this.task2Runtime, 220, helpObject);
              sim_trace(
                  1,
                  "Step 2.20 Done: "
                      + this.get_name()
                      + ", "
                      + this.get_id()
                      + " sent help object to "
                      + Candidate_Helper.get_name()
                      + ", "
                      + Candidate_Helper.get_id());
              this.performedUrgent = true;
              this.tasksRunTimes.add(this.task2Runtime);

              // Step 2.21: Node sends oppnet tasks to admitted helper (Node_report)
              this.NODE_sendData(Candidate_Helper, this.task3Runtime, 221, oppnetTasks);
              sim_trace(
                  1,
                  "Step 2.21 Done: "
                      + this.get_name()
                      + ", "
                      + this.get_id()
                      + " sent oppnet tasks to "
                      + Candidate_Helper.get_name()
                      + ", "
                      + Candidate_Helper.get_id());
              this.tasksRunTimes.add(this.task3Runtime);

              break; // break once a single helper is integrated since it is a single helper mode
            } // end if(admit)
          } // end if(ev.get_data() != null)

          i++;
        } // end while(i<CandidateHelpers.size())

        if (!Released && !Done) {

          // Step 2.22a helper listens to Done or not Done from admitted helper or release from
          // inviting node
          int AH = 0;
          ev = new Sim_event();
          ev = this.NODE_listen();
          while (ev.get_data() != null) {
            sim_trace(
                1,
                "Step 2.22a Done: "
                    + this.get_name()
                    + " received a message from a node with id "
                    + ev.get_src());

            // Step 2.22b node process the message

            this.NODE_processMsg(this.msgPayloadReadtime);
            if (ev.get_data().equals("Done..ReqRelease")) {
              sim_trace(
                  1,
                  "Step 2.22b Done: "
                      + this.get_name()
                      + ","
                      + this.get_id()
                      + " evaluated the message and source and it is DONE notification from "
                      + Sim_system.get_entity(ev.get_src()).get_name()
                      + ", "
                      + Sim_system.get_entity(ev.get_src()).get_id());
              Done = true;

              // Step 2.23:Helper sends to inviting node that its admitted helpers done the job
              Released =
                  this.NODE_reqRelease(
                      this.get_id(),
                      this.get_name(),
                      Inviting_Node,
                      this.ctrlMsgDelTimeThroughLinkToParent,
                      "Done..ReqRelease");
              if (Released) break;
            } else if (ev.get_data().equals("NoGrandKids..ReqRelease")) {
              sim_trace(
                  1,
                  "Step 2.23 Done: "
                      + this.get_name()
                      + ","
                      + this.get_id()
                      + " evaluated the message and source and it is NoGrandKids notification from "
                      + Sim_system.get_entity(ev.get_src()).get_name()
                      + ", "
                      + Sim_system.get_entity(ev.get_src()).get_id());
              AH++;

              if (AH >= AdmittedHelpers.size() && (!Done) && (!Released) && (!sent)) {
                System.out.println(
                    this.get_name()
                        + ","
                        + this.get_id()
                        + " AH = "
                        + AH
                        + " admittedHelpers= "
                        + AdmittedHelpers.size());
                Released =
                    this.NODE_reqRelease(
                        this.get_id(),
                        this.get_name(),
                        Inviting_Node,
                        this.ctrlMsgDelTimeThroughLinkToParent,
                        "NoGrandKids..ReqRelease");

                if (Released) break;
              }
            } else if (ev.get_data().equals("Released")) {
              sim_trace(
                  1,
                  "Step 2.24 Done: "
                      + this.get_name()
                      + ","
                      + this.get_id()
                      + " evaluated the message and source and it is Released notification from "
                      + Sim_system.get_entity(ev.get_src()).get_name()
                      + ", "
                      + Sim_system.get_entity(ev.get_src()).get_id());
              Released = true;
              break;
            }
            ev = new Sim_event();
            ev = this.NODE_listen();
          } // end while(ev.get_data()!=null)
        } // end if (!released)

        // Step 2.25: release all children
        int w = 0;
        while (w < AdmittedHelpers.size()) {
          this.NODE_release(
              AdmittedHelpers.get(w), AdmittedHelpers.get(w).ctrlMsgDelTimeThroughLinkToParent);
          sim_trace(
              1,
              "Step 2.25 Done: "
                  + this.get_name()
                  + ", "
                  + this.get_id()
                  + " sent Released notification to "
                  + AdmittedHelpers.get(w).get_name()
                  + ", "
                  + AdmittedHelpers.get(w).get_id());

          pr.oppnet = this.NODE_remNode(AdmittedHelpers.get(w), pr.oppnet);
          sim_trace(
              1,
              "Step 2.26 Done: "
                  + this.get_name()
                  + ", "
                  + this.get_id()
                  + " removed "
                  + AdmittedHelpers.get(w).get_name()
                  + ", "
                  + AdmittedHelpers.get(w).get_id()
                  + " from oppnet");

          w++;
        }
      } // end if (!Done)
    } // if (admitted)

    SimOutput so = new SimOutput();
    String filename;
    PrintWriter oppnetFileWriter;

    if (this.AdmittedHelpers.size() > 0) {
      filename = "HelperIntegTime.txt";
      oppnetFileWriter = null;
      this.sumHelperItegTimePerInvNodePerIter = so.calculate_Sum(this.hlprIntegTime);
      so.outputFile1(
          this.hlprIntegTime.size(),
          true,
          filename,
          oppnetFileWriter,
          "Sum Helper Integ Time Per Node Per Iter",
          this.sumHelperItegTimePerInvNodePerIter,
          this.get_name(),
          this.get_id());

      //////////////////////////////////////////////////////////////////////////////////////////////////////////

      filename = "NumRequestedHelpers.txt";
      oppnetFileWriter = null;
      so.outputFile(
          true,
          filename,
          oppnetFileWriter,
          "Number of Requested Helpers Per Node Per Iter",
          this.numOfRequestedHelpersPerNode,
          this.get_name(),
          this.get_id());
      //////////////////////////////////////////////////////////////////////////////////////////////////////////

      filename = "NumJoinedHelpers.txt";
      oppnetFileWriter = null;
      so.outputFile(
          true,
          filename,
          oppnetFileWriter,
          "Number of Joined Helpers Per Node Per Iter",
          this.numOfJoindHelpersPerNode,
          this.get_name(),
          this.get_id());
      ///////////////////////////////////////////////////////////////////////////////////////////////////////////
      filename = "NumRefusedHelpers.txt";
      oppnetFileWriter = null;
      so.outputFile(
          true,
          filename,
          oppnetFileWriter,
          "Number of Refused Helpers Per Node Per Iter",
          (this.numOfRequestedHelpersPerNode - this.numOfJoindHelpersPerNode),
          this.get_name(),
          this.get_id());
      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
      filename = "NumAdmittedHelpers.txt";
      oppnetFileWriter = null;
      so.outputFile(
          true,
          filename,
          oppnetFileWriter,
          "Number of Admitted Helpers Per Node Per Iter",
          (this.AdmittedHelpers.size()),
          this.get_name(),
          this.get_id());
      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    }
    if (admitted) {
      filename = "HelperUnhurriedTask.txt";
      File f = new File(filename);

      oppnetFileWriter = null;
      int value;
      if (this.performedUnhurried) value = 1;
      else value = 0;
      so.outputFile(
          true,
          filename,
          oppnetFileWriter,
          "Performed Unhurried Task",
          value,
          this.get_name(),
          this.get_id());
      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

      filename = "HelperUrgentTask.txt";
      File f2 = new File(filename);
      oppnetFileWriter = null;
      if (this.performedUrgent) value = 1;
      else value = 0;
      so.outputFile(
          true,
          filename,
          oppnetFileWriter,
          "Performed Urgent Task",
          value,
          this.get_name(),
          this.get_id());

      /////////////////////////////////////////////////////////////////////////////////////////////////////////

      this.sumTasksRunTimes = so.calculate_Sum(this.tasksRunTimes);

      filename = "TasksRuntimes.txt";
      // File file1 = new File(filename);
      oppnetFileWriter = null;
      so.outputFile1(
          this.tasksRunTimes.size(),
          true,
          filename,
          oppnetFileWriter,
          "Sum Task Runtimes Per Node Per Iter",
          this.sumTasksRunTimes,
          this.get_name(),
          this.get_id());
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

  } // end body