xrootd
XrdClMetalinkRedirector.hh
Go to the documentation of this file.
1 /*
2  * XrdClMetalinkRedirector.hh
3  *
4  * Created on: May 2, 2016
5  * Author: simonm
6  */
7 
8 #ifndef SRC_XRDCL_XRDCLMETALINKREDIRECTOR_HH_
9 #define SRC_XRDCL_XRDCLMETALINKREDIRECTOR_HH_
10 
13 
14 #include <string>
15 #include <list>
16 #include <map>
17 
18 
19 class XrdOucFileInfo;
20 
21 namespace XrdCl
22 {
23 
24 class File;
25 class Message;
26 
27 //----------------------------------------------------------------------------
30 //----------------------------------------------------------------------------
32 {
33  friend class MetalinkOpenHandler;
34  friend class MetalinkReadHandler;
35 
36  public:
37  //----------------------------------------------------------------------------
41  //----------------------------------------------------------------------------
42  MetalinkRedirector( const std::string &url );
43 
44  //----------------------------------------------------------------------------
46  //----------------------------------------------------------------------------
47  virtual ~MetalinkRedirector();
48 
49  //----------------------------------------------------------------------------
51  //----------------------------------------------------------------------------
52  XRootDStatus Load( ResponseHandler *userHandler );
53 
54  //----------------------------------------------------------------------------
58  //----------------------------------------------------------------------------
59  XRootDStatus HandleRequest( const Message *msg, IncomingMsgHandler *handler );
60 
61  //----------------------------------------------------------------------------
63  //----------------------------------------------------------------------------
64  std::string GetTargetName() const
65  {
66  return pTarget;
67  }
68 
69  //----------------------------------------------------------------------------
72  //----------------------------------------------------------------------------
73  std::string GetCheckSum( const std::string &type ) const
74  {
75  std::string t = type != "adler32" ? type : "a32";
76  CksumMap::const_iterator it = pChecksums.find( t );
77  if( it == pChecksums.end() ) return std::string();
78  return type + ":" + it->second;
79  }
80 
81  //----------------------------------------------------------------------------
84  //----------------------------------------------------------------------------
85  std::vector<std::string> GetSupportedCheckSums() const
86  {
87  std::vector<std::string> ret;
88  CksumMap::const_iterator itr = pChecksums.begin();
89  for( ; itr != pChecksums.end(); ++itr )
90  {
91  if( itr->first == "a32" ) ret.push_back( "adler32" );
92  else ret.push_back( itr->first );
93  }
94  return ret;
95  }
96 
97  //----------------------------------------------------------------------------
100  //----------------------------------------------------------------------------
101  long long GetSize() const
102  {
103  return pFileSize;
104  }
105 
106  //----------------------------------------------------------------------------
108  //----------------------------------------------------------------------------
109  const std::vector<std::string>& GetReplicas()
110  {
111  return pReplicas;
112  }
113 
114  //----------------------------------------------------------------------------
116  //----------------------------------------------------------------------------
117  virtual int Count( Message *req ) const;
118 
119  private:
120 
121  //----------------------------------------------------------------------------
126  //----------------------------------------------------------------------------
128 
129  //----------------------------------------------------------------------------
132  //----------------------------------------------------------------------------
133  XRootDStatus Parse( const std::string &metalink );
134 
135  //----------------------------------------------------------------------------
140  //----------------------------------------------------------------------------
141  void FinalizeInitialization( const XRootDStatus &status = XRootDStatus() );
142 
143  //----------------------------------------------------------------------------
145  //----------------------------------------------------------------------------
146  Message* GetResponse( const Message *msg ) const;
147 
148  //----------------------------------------------------------------------------
150  //----------------------------------------------------------------------------
151  Message* GetErrorMsg( const Message *msg, const std::string &errMsg, XErrorCode code ) const;
152 
153  //----------------------------------------------------------------------------
155  //----------------------------------------------------------------------------
156  void InitCksum( XrdOucFileInfo **fileInfos );
157 
158  //----------------------------------------------------------------------------
160  //----------------------------------------------------------------------------
161  void InitReplicas( XrdOucFileInfo **fileInfos );
162 
163  //----------------------------------------------------------------------------
165  //----------------------------------------------------------------------------
166  XRootDStatus GetReplica( const Message *msg, std::string &replica ) const;
167 
168  //----------------------------------------------------------------------------
170  //----------------------------------------------------------------------------
171  XRootDStatus GetCgiInfo( const Message *msg, const std::string &key, std::string &out ) const;
172 
173  typedef std::list< std::pair<const Message*, IncomingMsgHandler*> > RedirectList;
174  typedef std::map<std::string, std::string> CksumMap;
175  typedef std::vector<std::string> ReplicaList;
176 
177  //----------------------------------------------------------------------------
179  //----------------------------------------------------------------------------
180  ReplicaList::const_iterator GetReplica( const Message *msg ) const;
181 
183  std::string pUrl;
187  bool pReady;
189  std::string pTarget;
190  long long pFileSize;
191 
193 
194  static const std::string LocalFile;
195 
196 };
197 
198 } /* namespace XrdCl */
199 
200 #endif /* SRC_XRDCL_XRDCLMETALINKREDIRECTOR_HH_ */
RedirectList pPendingRedirects
Definition: XrdClMetalinkRedirector.hh:182
friend class MetalinkReadHandler
Definition: XrdClMetalinkRedirector.hh:34
XrdSysMutex pMutex
Definition: XrdClMetalinkRedirector.hh:192
XRootDStatus Parse(const std::string &metalink)
XRootDStatus HandleRequestImpl(const Message *msg, IncomingMsgHandler *handler)
The message representation used throughout the system.
Definition: XrdClMessage.hh:29
Message * GetErrorMsg(const Message *msg, const std::string &errMsg, XErrorCode code) const
Generates error response for the given request.
Definition: XrdOucFileInfo.hh:45
std::string pUrl
Definition: XrdClMetalinkRedirector.hh:183
Definition: XrdClMetalinkRedirector.hh:31
An interface for metadata redirectors.
Definition: XrdClRedirectorRegistry.hh:59
std::vector< std::string > ReplicaList
Definition: XrdClMetalinkRedirector.hh:175
XRootDStatus GetCgiInfo(const Message *msg, const std::string &key, std::string &out) const
Extracts an element from URL cgi.
void FinalizeInitialization(const XRootDStatus &status=XRootDStatus())
bool pReady
Definition: XrdClMetalinkRedirector.hh:187
virtual int Count(Message *req) const
Count how many replicas do we have left to try for given request.
std::vector< std::string > GetSupportedCheckSums() const
Definition: XrdClMetalinkRedirector.hh:85
std::list< std::pair< const Message *, IncomingMsgHandler * > > RedirectList
Definition: XrdClMetalinkRedirector.hh:173
File * pFile
Definition: XrdClMetalinkRedirector.hh:184
const std::vector< std::string > & GetReplicas()
Returns a vector with replicas as given in the meatlink file.
Definition: XrdClMetalinkRedirector.hh:109
std::string GetTargetName() const
Gets the file name as specified in the metalink.
Definition: XrdClMetalinkRedirector.hh:64
Definition: XrdSysPthread.hh:165
void InitReplicas(XrdOucFileInfo **fileInfos)
Initializes replica list.
A file.
Definition: XrdClFile.hh:45
XErrorCode
Definition: XProtocol.hh:980
Request status.
Definition: XrdClXRootDResponses.hh:218
Definition: XrdClAnyObject.hh:25
static const std::string LocalFile
Definition: XrdClMetalinkRedirector.hh:194
Message handler.
Definition: XrdClPostMasterInterfaces.hh:71
virtual ~MetalinkRedirector()
Destructor.
CksumMap pChecksums
Definition: XrdClMetalinkRedirector.hh:185
Message * GetResponse(const Message *msg) const
Generates redirect response for the given request.
Handle an async response.
Definition: XrdClXRootDResponses.hh:1040
ReplicaList pReplicas
Definition: XrdClMetalinkRedirector.hh:186
XRootDStatus pStatus
Definition: XrdClMetalinkRedirector.hh:188
friend class MetalinkOpenHandler
Definition: XrdClMetalinkRedirector.hh:33
std::map< std::string, std::string > CksumMap
Definition: XrdClMetalinkRedirector.hh:174
std::string GetCheckSum(const std::string &type) const
Definition: XrdClMetalinkRedirector.hh:73
XRootDStatus Load(ResponseHandler *userHandler)
Initializes the object with the content of the metalink file.
XRootDStatus GetReplica(const Message *msg, std::string &replica) const
Get the next replica for the given message.
std::string pTarget
Definition: XrdClMetalinkRedirector.hh:189
MetalinkRedirector(const std::string &url)
void InitCksum(XrdOucFileInfo **fileInfos)
Initializes checksum map.
long long GetSize() const
Definition: XrdClMetalinkRedirector.hh:101
XRootDStatus HandleRequest(const Message *msg, IncomingMsgHandler *handler)
long long pFileSize
Definition: XrdClMetalinkRedirector.hh:190