Files
scandocs/uni/masterarbeit/source/moversight/ms/MembershipService.h
2014-06-30 13:58:10 +02:00

214 lines
7.7 KiB
C++

/*
* File: MembershipService.h
* Author: jgaebler
*
* Created on July 23, 2010, 2:11 PM
*/
#pragma once
#ifndef MEMBERSHIPSERVICE_H
#define MEMBERSHIPSERVICE_H
#include "Invitation.h"
#include "InvitationList.h"
#include "MemberRegister.h"
#include "msg/JoinAnnounce.h"
#include "msg/JoinConfirm.h"
#include "msg/JoinRequest.h"
#include "msg/JoinAbort.h"
#include "msg/LeaveAnnounce.h"
#include "msg/RosterMessage.h"
#include "timer/InvitationTimerQueue.h"
#include "app/PeerDescription.h"
#include "common/Defines.h"
#include "common/MoversightService.h"
#include "common/transport/TransportAddress.h"
#include "common/container/PeerIDList.h"
#include "common/timer/ReferenceMonitorTimer.h"
#include "timer/LeaveAnnounceTimer.h"
namespace ubeeme {
namespace moversight {
class JoinAbortToInviterTimer;
class JoinAbortToInviteeTimer;
class JoinAnnounceTimer;
class LeaveAnnounceTimer;
class Moversight;
class PeerReconnectAnnounce;
/**
* @class MembershipService
* @author Jan Gäbler
* @ingroup Moversight
* @brief Provides the membership service for the moversight protocol.
*/
class MembershipService : public MoversightService {
friend class MSTimer;
friend class JoinAbortToInviteeTimer;
friend class JoinAbortToInviterTimer;
friend class JoinAnnounceTimer;
friend class PeerPendingTimer;
friend class MSMessageFactory;
friend class MobilitySupport;
friend class MemberRegister;
public:
MembershipService(Dispatcher & m);
virtual ~MembershipService();
virtual void initialise();
virtual void finalise();
void invitePeer(const TransportAddress & ta, const PeerDescription & pDesc);
void cancelInvitation(const TransportAddress & ta, const std::string & reason);
void responseInvitation(const Invitation & inv, const bool & ack, const std::string & message, const PeerDescription & pDesc, const PeerResources & resources);
void leaveGroup();
void peerFailed(PeerID pId);
void handleJoinRequest(JoinRequest* msg);
void handleJoinConfirm(JoinConfirm * msg);
void handleJoinAbort(JoinAbort * msg);
void handleRosterMessage(RosterMessage * msg);
void handleJoinAnnounce(JoinAnnounce & msg);
void handleLeaveAnnounce(LeaveAnnounce & msg);
void handlePeerReconnectAnnounce(PeerReconnectAnnounce & msg);
void handleJoinAbortToInviterTimer(JoinAbortToInviterTimer * timer);
void handleJoinAbortToInviteeTimer(JoinAbortToInviteeTimer * timer);
void handleJoinAnnounceTimer(JoinAnnounceTimer * timer);
void handleLeaveAnnounceTimer(LeaveAnnounceTimer * timer);
void setPeersPending(const PeerIDList & pList);
ClusterID findPeer( const PeerID & pID);
Peer & getPeer(const PeerID pID);
const Peer & getPeer(const PeerID pID) const;
size_t getNumberOfPeers() const;
size_t getNumberOfClusters() const;
PeerIDList getClusterPeerIDList(const PeerID & pId) const;
PeerIDList getClusterPeerIDListSlavesOnly(const ClusterID cID) const;
const PeerList getPeerList() const;
const PeerIDList getPeerIDList();
const PeerIDList getMasterPeerIDList();
PeerIDList getClusterAndMasterPeerIDList(const Peer & self);
Peer & getLocalPeer();
const Peer & getLocalPeer() const;
PeerID getLocalID() const;
const TransportAddress & getLocalAddress() const;
void setLocalPeerState(const PeerState & ps);
void setLocalState(const State & s);
void setLocalPeerDescription(const PeerDescription & pD);
ClusterID getLocalClusterID() const;
bool contains( const TransportAddress& ta);
bool contains(PeerID pID);
bool contains(Peer & peer);
bool isLocalPeerMaster() const;
void setupGroupFromRoster(Roster & roster, PeerID localPeerID);
Roster getRosterFromGroup();
MemberRegister & getCurrentMemberRegister();
MemberRegister & getLastMemberRegister();
MemberRegister const & getLastMemberRegister() const;
MemberRegister const & getCurrentMemberRegister() const;
void saveLastMemberRegister();
void saveLastMemberRegister(MemberRegister oldMR);
void setupGroupFromMemberRegister(MemberRegister & memReg, PeerID newPeerID);
MembershipService & operator=(const MembershipService & other);
void movePeer(PeerID pId, ClusterID destClusterId);
void movePeer(Peer & p, ClusterID destClusterId);
virtual ViewID getViewID() const;
virtual ViewID getLastViewID() const;
void placeRejoiningPeer(Peer & peer, MemberRegister & originalMR);
/**
* Event Handling
*/
virtual void handleEvent( const ConnectionLostEvent & e);
virtual void handleEvent( const PendingPeersEvent & e);
void setLocalPeerResources(const PeerResources & pres);
const PeerResources & getLocalPeerResources() const;
private:
PeerState & getLocalPeerState();
InvitationID initCurrentInvitationID();
InvitationID getNextInvitationID();
void createLocalPeer(const PeerDescription & pD);
void createAndStartJoinAbortToInviteeTimer(const Invitation & invitation);
void createAndStartJoinAbortToInviterTimer(const Invitation & invitation);
void createAndStartJoinAnnounceTimer(const Invitation & invitation, const PeerDescription & pDesc, const PeerResources & resources);
void createAndStartLeaveAnnounceTimer(const PeerIDList & leavingPeerIdList);
void stopAndDeleteAllTimers();
void stopAndDeleteInvitationTimer(const Invitation & inv);
void stopAndDeleteLeaveAnnounceTimer(const VirtualLogicalTime & reference);
void removeLeftPeersFromTimerQueues(const PeerIDList & leftPeers);
bool isMasterOf(const PeerID pId) const;
bool isSetDisjoinedAllowed() const;
bool isGroupClosePossible() const;
void closeGroup();
bool isMember(const TransportAddress & ta) const;
void sendJoinRequest(const Invitation & inv);
void sendJoinConfirm(const Invitation & inv, const std::string & message, const PeerDescription & pDesc, const PeerResources & resources);
void sendJoinAbort(const Invitation & inv, const TransportAddress & destinationTa, const std::string & jaMessage);
void sendJoinAnnounce(const Invitation & inv, const PeerDescription & pDesc, const PeerResources & resources);
void sendLeaveAnnounceMessage(const PeerID & pId);
void sendLeaveAnnounceMessage(const PeerIDList & leavingPeers, const VirtualLogicalTime & referenceTime);
void setLocalPeer(PeerID pId);
void resetLocalPeer();
void removePeer(const PeerID & pId);
InvitationID currentInvitationID;
MemberRegister mr;
MemberRegister lastmr;
InvitationList invitationList;
InvitationTimerQueue invitationTimerQueue;
ReferenceTimerQueue<VirtualLogicalTime, LeaveAnnounceTimer * > timerQueue;
PeerID myPeerID;
ClusterID myClusterID;
Peer dummyPeer;
};
}
}
#endif /* MEMBERSHIPSERVICE_H */