#ifndef XRC_SID_H #define XRC_SID_H /******************************************************************************/ /* */ /* X r d C l i e n t S i d . h h */ /* */ /* Author: Fabrizio Furano (INFN Padova, 2005) */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ ////////////////////////////////////////////////////////////////////////// // // // Utility classes to handle the mapping between xrootd streamids. // // A single streamid can have multiple "parallel" streamids. // // Their use is typically to support the client to submit multiple // // parallel requests (belonging to the same LogConnectionID), // // whose answers are to be processed asynchronously when they arrive. // // // ////////////////////////////////////////////////////////////////////////// #include "XrdOuc/XrdOucRash.hh" #include "XProtocol/XProtocol.hh" #include "XrdClient/XrdClientProtocol.hh" #include "XrdClient/XrdClientVector.hh" #include "XrdSys/XrdSysPthread.hh" struct SidInfo { kXR_unt16 fathersid; ClientRequest outstandingreq; long long reqbyteprogress; time_t sendtime; kXR_unt16 rspstatuscode; kXR_unt32 rsperrno; char *rsperrmsg; }; class XrdClientSid { private: // Used to quickly get info about a sid being used // as a child of another sid. A child sid is used to parallely // interact with a server for the same logical connection using its father sid // Only child sids are inserted here. If a sid is not here but is not free, // then it's a father sid, i.e. normally a sid used for the non async xrootd traffic // Remember: for any child sid, it's mandatory to keep the request // which is outstanding for that stream. This struct can be used to // read data, but also for preparing many files in advance. XrdOucRash childsidnfo; // To quickly get a sid which is not being used // This one has constant time operations if the ops // are performed at the back of the vector // Remember: 0 is NOT a valid sid XrdClientVector freesids; XrdSysMutex fMutex; public: XrdClientSid(); virtual ~XrdClientSid(); // Gets an available sid // From now on it will be no more available. // A retval of 0 means that there are no more available sids kXR_unt16 GetNewSid(); // Gets an available sid for a request which is to be outstanding // This means that this sid will be inserted into the Rash // The request gets inserted the new sid in the right place // Also the one passed as parameter gets the new sid, as should be expected kXR_unt16 GetNewSid(kXR_unt16 sid, ClientRequest *req); // Releases a sid. // It is re-inserted into the available set // Its info is rmeoved from the tree void ReleaseSid(kXR_unt16 sid); // Releases a sid and all its childs void ReleaseSidTree(kXR_unt16 fathersid); // Report the response for an outstanding request // Typically this is used to keep track of the received errors, expecially // for async writes void ReportSidResp(kXR_unt16 sid, kXR_unt16 statuscode, kXR_unt32 errcode, char *errmsg); int GetFailedOutstandingWriteRequests(kXR_unt16 fathersid, XrdClientVector &reqvect); int GetAllOutstandingWriteRequests(kXR_unt16 fathersid, XrdClientVector &reqvect); int GetOutstandingWriteRequestCnt(kXR_unt16 fathersid); // 0 if non existent as a child sid inline struct SidInfo *GetSidInfo(kXR_unt16 sid) { XrdSysMutexHelper l(fMutex); return (childsidnfo.Find(sid)); }; inline bool JoinedSids(kXR_unt16 father, kXR_unt16 child) { XrdSysMutexHelper l(fMutex); struct SidInfo *si = childsidnfo.Find(child); if (!si) return false; return (si->fathersid == father); } // Useful for debugging void PrintoutOutstandingRequests(); }; #endif