214 lines
7.7 KiB
C++
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 */
|