00001 /* 00002 * XrdClRedirectorRegister.hh 00003 * 00004 * Created on: May 23, 2016 00005 * Author: simonm 00006 */ 00007 00008 #ifndef SRC_XRDCL_XRDCLREDIRECTORREGISTRY_HH_ 00009 #define SRC_XRDCL_XRDCLREDIRECTORREGISTRY_HH_ 00010 00011 #include "XrdCl/XrdClXRootDResponses.hh" 00012 #include "XrdCl/XrdClURL.hh" 00013 #include "XrdCl/XrdClJobManager.hh" 00014 #include "XrdSys/XrdSysPthread.hh" 00015 00016 #include <string> 00017 #include <map> 00018 00019 namespace XrdCl 00020 { 00021 00022 class Message; 00023 class IncomingMsgHandler; 00024 class OutgoingMsgHandler; 00025 00026 //-------------------------------------------------------------------------------- 00028 //-------------------------------------------------------------------------------- 00029 class RedirectJob: public Job 00030 { 00031 public: 00032 //------------------------------------------------------------------------ 00034 //------------------------------------------------------------------------ 00035 RedirectJob( IncomingMsgHandler *handler ) : pHandler( handler ) 00036 { 00037 } 00038 00039 //------------------------------------------------------------------------ 00041 //------------------------------------------------------------------------ 00042 virtual ~RedirectJob() 00043 { 00044 } 00045 00046 //------------------------------------------------------------------------ 00048 //------------------------------------------------------------------------ 00049 virtual void Run( void *arg ); 00050 00051 private: 00052 IncomingMsgHandler *pHandler; 00053 }; 00054 00055 //-------------------------------------------------------------------------------- 00057 //-------------------------------------------------------------------------------- 00058 class VirtualRedirector 00059 { 00060 public: 00061 //---------------------------------------------------------------------------- 00063 //---------------------------------------------------------------------------- 00064 virtual ~VirtualRedirector(){} 00065 00066 //---------------------------------------------------------------------------- 00071 //---------------------------------------------------------------------------- 00072 virtual XRootDStatus HandleRequest( const Message *msg, 00073 IncomingMsgHandler *handler ) = 0; 00074 00075 //---------------------------------------------------------------------------- 00077 //---------------------------------------------------------------------------- 00078 virtual XRootDStatus Load( ResponseHandler *userHandler ) = 0; 00079 00080 //---------------------------------------------------------------------------- 00082 //---------------------------------------------------------------------------- 00083 virtual std::string GetTargetName() const = 0; 00084 00085 //---------------------------------------------------------------------------- 00088 //---------------------------------------------------------------------------- 00089 virtual std::string GetCheckSum( const std::string &type ) const = 0; 00090 00091 //---------------------------------------------------------------------------- 00094 //---------------------------------------------------------------------------- 00095 virtual long long GetSize() const = 0; 00096 00097 //---------------------------------------------------------------------------- 00099 //---------------------------------------------------------------------------- 00100 virtual const std::vector<std::string>& GetReplicas() = 0; 00101 00102 //---------------------------------------------------------------------------- 00104 //---------------------------------------------------------------------------- 00105 virtual int Count( Message *req ) const = 0; 00106 }; 00107 00108 //-------------------------------------------------------------------------------- 00110 //-------------------------------------------------------------------------------- 00111 class RedirectorRegistry 00112 { 00113 00114 public: 00115 00116 //---------------------------------------------------------------------------- 00118 //---------------------------------------------------------------------------- 00119 static RedirectorRegistry& Instance(); 00120 00121 //---------------------------------------------------------------------------- 00123 //---------------------------------------------------------------------------- 00124 ~RedirectorRegistry(); 00125 00126 //---------------------------------------------------------------------------- 00128 //---------------------------------------------------------------------------- 00129 XRootDStatus Register( const URL &url ); 00130 00131 //---------------------------------------------------------------------------- 00133 //---------------------------------------------------------------------------- 00134 XRootDStatus RegisterAndWait( const URL &url ); 00135 00136 //---------------------------------------------------------------------------- 00138 //---------------------------------------------------------------------------- 00139 VirtualRedirector* Get( const URL &url ) const; 00140 00141 //---------------------------------------------------------------------------- 00143 //---------------------------------------------------------------------------- 00144 void Release( const URL &url ); 00145 00146 private: 00147 00148 typedef std::map< std::string, std::pair<VirtualRedirector*, size_t> > RedirectorMap; 00149 00150 //---------------------------------------------------------------------------- 00152 //---------------------------------------------------------------------------- 00153 XRootDStatus RegisterImpl( const URL &url, ResponseHandler *handler ); 00154 00155 //---------------------------------------------------------------------------- 00160 //---------------------------------------------------------------------------- 00161 static URL ConvertLocalfile( const URL &url ); 00162 00163 //---------------------------------------------------------------------------- 00164 // Constructor (private!). 00165 //---------------------------------------------------------------------------- 00166 RedirectorRegistry() {} 00167 00168 //---------------------------------------------------------------------------- 00169 // Copy constructor (private!). 00170 //---------------------------------------------------------------------------- 00171 RedirectorRegistry( const RedirectorRegistry & ); 00172 00173 //---------------------------------------------------------------------------- 00174 // Assignment operator (private!). 00175 //---------------------------------------------------------------------------- 00176 RedirectorRegistry& operator=( const RedirectorRegistry & ); 00177 00178 RedirectorMap pRegistry; 00179 00180 mutable XrdSysMutex pMutex; 00181 }; 00182 00183 } /* namespace XrdCl */ 00184 00185 #endif /* SRC_XRDCL_XRDCLREDIRECTORREGISTRY_HH_ */