00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef __OVERLAY_BOOTSTRAP_H
00040 #define __OVERLAY_BOOTSTRAP_H
00041
00042 #include <string>
00043 #include <sstream>
00044 #include <ctime>
00045 #include <deque>
00046 #include <vector>
00047 #include <algorithm>
00048 #include <boost/thread/mutex.hpp>
00049 #include <boost/foreach.hpp>
00050 #include "ariba/utility/logging/Logging.h"
00051 #include "ariba/utility/types.h"
00052 #include "ariba/utility/system/Timer.h"
00053 #include "ariba/utility/bootstrap/BootstrapManager.h"
00054 #include "ariba/utility/bootstrap/BootstrapInformationCallback.h"
00055 #include "ariba/communication/EndpointDescriptor.h"
00056 #include "ariba/utility/system/SystemEventListener.h"
00057 #include "ariba/utility/system/SystemQueue.h"
00058 #include "ariba/utility/system/SystemEvent.h"
00059 #include "ariba/utility/system/SystemEventType.h"
00060
00061 using std::swap;
00062 using std::deque;
00063 using std::string;
00064 using std::vector;
00065 using std::pair;
00066 using std::ostringstream;
00067 using ariba::utility::SpoVNetID;
00068 using ariba::utility::NodeID;
00069 using ariba::utility::BootstrapManager;
00070 using ariba::utility::BootstrapInformationCallback;
00071 using ariba::communication::EndpointDescriptor;
00072 using ariba::utility::SystemEventType;
00073 using ariba::utility::SystemEvent;
00074 using ariba::utility::SystemQueue;
00075 using ariba::utility::Timer;
00076 using ariba::utility::SystemEventListener;
00077
00078 namespace ariba {
00079 namespace overlay {
00080
00081 class BaseOverlay;
00082
00083 class OverlayBootstrap : public BootstrapInformationCallback, public SystemEventListener {
00084 use_logging_h(OverlayBootstrap);
00085 public:
00086 OverlayBootstrap();
00087 virtual ~OverlayBootstrap();
00088
00089 void start(
00090 BaseOverlay* _overlay,
00091 const SpoVNetID& _spovnetid,
00092 const NodeID& _nodeid,
00093 vector<pair<BootstrapManager::BootstrapType,string> > modules
00094 );
00095 void stop();
00096
00097 void publish( const EndpointDescriptor& _ep );
00098 void revoke();
00099
00100 void recordJoin(const EndpointDescriptor& _ep);
00101 bool haveOverlayConnections();
00102
00103 protected:
00104 virtual void handleSystemEvent(const SystemEvent& event);
00105 virtual void onBootstrapServiceFound(string name, string info1, string info2, string info);
00106
00107 private:
00108 class JoinData {
00109 public:
00110 JoinData() : spovnetid(), nodeid(), endpoint() {
00111 }
00112
00113 JoinData& operator=( const JoinData& rhs) {
00114 spovnetid = rhs.spovnetid;
00115 nodeid = rhs.nodeid;
00116 endpoint = rhs.endpoint;
00117 return *this;
00118 }
00119
00120 SpoVNetID spovnetid;
00121 NodeID nodeid;
00122 EndpointDescriptor endpoint;
00123 };
00124
00125 BootstrapManager& manager;
00126 SpoVNetID spovnetid;
00127 NodeID nodeid;
00128 BaseOverlay* overlay;
00129 string randname;
00130
00131 class WatchdogTimer : public Timer {
00132 public:
00133 WatchdogTimer(OverlayBootstrap* _obj);
00134 void startWatchdog();
00135 void stopWatchdog();
00136 protected:
00137 virtual void eventFunction();
00138 private:
00139 OverlayBootstrap* obj;
00140 };
00141
00142 typedef deque<JoinData> JoinStack;
00143 JoinStack lastJoines;
00144 boost::mutex lastJoinesMutex;
00145 WatchdogTimer watchtimer;
00146 void checkOverlayStatus();
00147
00148
00149 bool haveOverlayConnection;
00150 boost::mutex haveOverlayConnectionMutex;
00151 };
00152
00153 }}
00154
00155 #endif // __OVERLAY_BOOTSTRAP_H