/* * File: PartitionApplication.cc * Author: gschneid * * Created on October 22, 2012, 11:09 AM */ #include "PartitionApplication.h" #include "Dispatcher.h" #include "Moversight.h" #include "ms/PeerResources.h" #include "common/transport/TransportAddress.h" #include "mt/msg/GroupData.h" #include "ms/Invitation.h" #include "simutils/OmnetppIniUtils.h" #include "StreamMessage.h" #include "ms/events/GroupCreatedEvent.h" #include "ms/events/GroupClosedEvent.h" #include "ms/events/PeerJoinedEvent.h" #include "ms/events/JoinRequestEvent.h" #include "ms/events/JoinConfirmEvent.h" #include "ms/events/JoinRejectedEvent.h" #include "ms/events/JoinAbortedEvent.h" #include "ms/events/RejoinDoneEvent.h" #include "ms/events/RejoinFailedEvent.h" #include "mt/events/PendingPeersEvent.h" #include "ms/events/LocalPeerUpdatedEvent.h" #include "ms/events/PeerLeftEvent.h" #include "simutils/events/StartMeasuringEvent.h" #include "simutils/events/StopMeasuringEvent.h" #include "fd/events/PeerReconnectedEvent.h" #undef DEBUG #define DEBUG(msg) if (module.isPrintDebugAPP()) \ MOV_DEBUG << "APP@"<<(dis->getLocalState()==DISJOINED?"TA_":"");\ if(dis->getLocalState()==DISJOINED){MOV_DEBUG << module.getLocalAddress();}\ else{MOV_DEBUG<< dis->getMembershipService().getLocalID();}MOV_DEBUG<<" "<subscribe(this); dis->subscribe(this); dis->subscribe(this); dis->subscribe(this); dis->subscribe(this); dis->subscribe(this); dis->subscribe(this); dis->subscribe(this); dis->subscribe(this); dis->subscribe(this); dis->subscribe(this); // MeasurementEvent dis->subscribe(this); dis->subscribe(this); } void PartitionApplication::finalise() { } /** * @brief Invites a peer to a the moversight group. * @param ta The transport address of the peer to invite. */ void PartitionApplication::invitePeer(TransportAddress & ta) { std::stringstream buf; buf << "invitePeer - invite peer at address " << ta; DEBUG(buf.str().c_str()); PeerDescription pDesc; dis->invitePeer(ta, pDesc); } /** * @brief Leaves the current group. The peer leafs the current group be * emitting a LeaveAnnounce within the current group. */ void PartitionApplication::leaveGroup() { DEBUG("leaveGroup - peer leave the group"); dis->leaveGroup(); } /** * @brief Sends dummy data to the group to simulate application traffic. */ void PartitionApplication::sendData() { DEBUG("sendData - send 24 byte dummy data to the group"); GroupData data; VectorStatistic vs("sendGroupData"); vs.record(GenericTime::currentTime()); dis->sendMessage(data); }//End /** * @brief Starts the given test case. * @param i The number of the test case to start. */ void PartitionApplication::startTestCase(unsigned int i) { switch (i) { case 0: testCase00(); break; default: break; }//End switch } /** * @brief Executes test case 01 - 6 peers, testcase1 */ void PartitionApplication::testCase00() { DEBUG("partitionApplication tc00"); if (initApp) { createRoster(); initApp = false; module.scheduleTestCase(80); } } /** * @brief Method to create a roster from which the group is set up. */ void PartitionApplication::createRoster() { int numberOfAllPeers = numberOfPeers + numberOfMobilePeers; Roster roster; roster.setNextPeerID(numberOfAllPeers + 1); roster.setViewID(numberOfAllPeers + 1); PeerDescription dummyPDesc; PeerResources dummyPRes; ClusterID cID = 0; if (clusterSize <= 1) { // necessary to make sure if the numberOfPeers is equal or smaller than // the maxPeerCount that only one cluster is created! roster.setViewID(numberOfAllPeers + 1); roster.setNextPeerID(numberOfAllPeers + 1); } for (int i = 1; i <= numberOfAllPeers; i++) { TransportAddress ta = getNewTransportAddress(i); ta.setPort(module.getLocalAddress().getPort()); MemberDescription mDesc(i, ta, JOINED, cID, dummyPDesc, dummyPRes); roster.addMemberDescription(mDesc); if ((i % module.getMaxPeerCount()) == 0) { cID++; }//End if } dis->setupGroupFromRoster(roster, module.getLocalAddress().getHostAddress().get4().getDByte(3)); } /** * @brief Getting a transportAddress for a given index. * @param i The index of the peer a TA is searched for. * @return The created TA. */ TransportAddress PartitionApplication::getNewTransportAddress(int i) { std::stringstream taStream; taStream << "192.168.0." << i; std::string s(taStream.str()); return TransportAddress(IPvXAddress(s.c_str())); } /** * @brief Callback method. This method is called by moversight to signal that the local peer have receive a group data message. * @param dat The received group data. * @param sender The sending peer ID. */ void PartitionApplication::receiveGroupData(const GroupData & dat, const PeerID sender) { std::stringstream buf; buf << "receiveGroupData - receive group data from peer ID " << sender; DEBUG(buf.str().c_str()); VectorStatistic vs("receiveGroupData"); vs.record(GenericTime::currentTime()); } /** * @brief Handle an incoming JoinRequestEvent. * @param e The event. * * The local instance has received an invitation. */ void PartitionApplication::handleEvent(const JoinRequestEvent & e) { DEBUG("invitationReceived - invitation received"); std::stringstream buf; buf << "invitationReceived - invitationID: " << e.getInvitation().getInvitationID() << " inviterID: " << e.getInvitation().getInviterID(); DEBUG(buf.str().c_str()); DEBUG("invitationReceived - accept invitation"); PeerDescription pDesc; PeerResources resources; dis->acceptInvitation(e.getInvitation(), "accept invitation", pDesc, resources); } /** * @brief Handle an incoming JonConfirmEvent. * @param e The event. * * The remote peer has accepted the invitation from the local peer. */ void PartitionApplication::handleEvent(const JoinConfirmEvent & e) { std::stringstream buf; buf << "receiveInvitationResponse - peer at TA: " << e.getInvitation().getInviteeAddress() << " accept invitation " << e.getInvitation().getInvitationID(); buf << " message: " << e.getMessage() << ", peer description: " << e.getDescription().getDescription(); DEBUG(buf.str().c_str()); } /** * @brief Handle an incoming JoinRejectedEvent. * @param e The event. * * The invitation process was aborted. */ void PartitionApplication::handleEvent(const JoinRejectedEvent & e) { std::stringstream buf; buf << "invitationAborted - invitation ID " << e.getInvitation().getInvitationID() << " aborted"; buf << " reason: " << e.getReason(); DEBUG(buf.str().c_str()); } /** * @brief Handle an incoming JoinAbortedEvent. * @param e The event. * * The invitation process could not be executed. */ void PartitionApplication::handleEvent(const JoinAbortedEvent & e) { std::stringstream buf; buf << "invitationAborted - invitation to peer " << e.getTransportAddress() << " aborted"; buf << " reason: " << e.getReason(); DEBUG(buf.str().c_str()); } /** * @brief Handle an incoming GroupCreatedEvent. * @param e The event. */ void PartitionApplication::handleEvent(const GroupCreatedEvent & e) { groupSize = 1; } void PartitionApplication::handleEvent(const PeerJoinedEvent & e) { std::stringstream buf; buf << "peerJoined - peer " << e.getPeerID() << "@TA_" << e.getTransportAddress() << " joined group successfully (" << e.getDescription().getDescription() << ")"; DEBUG(buf.str().c_str()); } /** * @brief Handle an incoming PendingPeersEvent. * @param e The event. * * Some peers are pending. */ void PartitionApplication::handleEvent(const PendingPeersEvent & e) { std::stringstream buf; buf << "peerIsPending - peer " << e.getPeerIDList() << " is pending"; DEBUG(buf.str().c_str()); } /** * @brief Handle an incoming PeerReconnectedEvent. * @param e The event. * * A pending peers has reconnected. */ void PartitionApplication::handleEvent(const PeerReconnectedEvent & e) { std::stringstream buf; buf << "peerReconnected - peer " << e.getPeerID() << " has reconnected"; DEBUG(buf.str().c_str()); } /** * @brief Handle an incoming PeerLeftEvent. * @param e The event. * * A dedicated peer has left the group. */ void PartitionApplication::handleEvent(const PeerLeftEvent & e) { std::stringstream buf; buf << "peerLeft - peer " << e.getPeer().getPeerID() << "@TA_" << e.getPeer().getLocalAddress() << " left the group"; DEBUG(buf.str().c_str()); } /** * @brief Handle an incoming RejoinDoneEvent. * @param e The event. */ void PartitionApplication::handleEvent(const RejoinDoneEvent & e) { dis->signal(new StopMeasuringEvent("REJOIN")); } /** * @brief Handle an incoming RejoinFailedEvent. * @param e The event. */ void PartitionApplication::handleEvent(const RejoinFailedEvent & e) { } /** * @brief Handle an incoming StartMeasuringEvent. * @param e The event. * * Starts the measuring of the given parameter. */ void PartitionApplication::handleEvent(const StartMeasuringEvent & e) { std::string startS = "start" + e.getMeasurement(); VectorStatistic vs(startS.c_str()); if (e.getMeasurement() == "REJOIN") { vs.record(GenericTime::currentTime()); rejoinSucessDuration.startRecord(); } if (e.getMeasurement() == "TG") { vs.record(GenericTime::currentTime()); // leaveDelay.startRecord(); } } /** * @brief Handle an incoming StopMeasuringEvent. * @param e The event. * * Stops the measuring of the given parameter. */ void PartitionApplication::handleEvent(const StopMeasuringEvent & e) { std::string startS = "stop " + e.getMeasurement(); VectorStatistic vs(startS.c_str()); if (e.getMeasurement() == "REJOIN") { vs.record(GenericTime::currentTime()); rejoinSucessDuration.startRecord(); } if (e.getMeasurement() == "TG") { vs.record(GenericTime::currentTime()); leaveDelay.stopRecord(); } } }//End namespace moversight }//End namespace ubeeme