xrootd
XrdXrootdAio.hh
Go to the documentation of this file.
1#ifndef __XRDXROOTDAIO__
2#define __XRDXROOTDAIO__
3/******************************************************************************/
4/* */
5/* X r d X r o o t d A i o . h h */
6/* */
7/* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */
8/* All Rights Reserved */
9/* Produced by Andrew Hanushevsky for Stanford University under contract */
10/* DE-AC02-76-SFO0515 with the Department of Energy */
11/* */
12/* This file is part of the XRootD software suite. */
13/* */
14/* XRootD is free software: you can redistribute it and/or modify it under */
15/* the terms of the GNU Lesser General Public License as published by the */
16/* Free Software Foundation, either version 3 of the License, or (at your */
17/* option) any later version. */
18/* */
19/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
20/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
21/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
22/* License for more details. */
23/* */
24/* You should have received a copy of the GNU Lesser General Public License */
25/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
26/* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
27/* */
28/* The copyright holder's institutional names and contributor's names may not */
29/* be used to endorse or promote products derived from this software without */
30/* specific prior written permission of the institution or contributor. */
31/******************************************************************************/
32
33#include "XProtocol/XPtypes.hh"
35#include "XrdSfs/XrdSfsAio.hh"
36#include "Xrd/XrdScheduler.hh"
38
39/******************************************************************************/
40/* X r d X r o o t d A i o */
41/******************************************************************************/
42
43// The XrdXrootdAio object represents a single aio read or write operation. One
44// or more of these are allocated to the XrdXrootdAioReq and passed as upcast
45// arguments to the sfs file object to effect asynchronous I/O.
46
47class XrdBuffer;
48class XrdBuffManager;
49class XrdSysError;
50class XrdXrootdAioReq;
51class XrdXrootdStats;
52
53class XrdXrootdAio : public XrdSfsAio
54{
55friend class XrdXrootdAioReq;
56public:
57 XrdBuffer *buffp; // -> Buffer object
58
59virtual void doneRead();
60
61virtual void doneWrite();
62
63virtual void Recycle();
64
65
68
69private:
70
71static XrdXrootdAio *Alloc(XrdXrootdAioReq *arp, int bsize=0);
73
74static const char *TraceID;
75static XrdBuffManager *BPool; // -> Buffer Manager
76static XrdScheduler *Sched; // -> System Scheduler
77static XrdXrootdStats *SI; // -> System Statistics
78static XrdSysMutex fqMutex; // Locks static data
79static XrdXrootdAio *fqFirst; // -> Object in free queue
80static int maxAio; // Maximum Aio objects we can yet have
81
82 XrdXrootdAio *Next; // Chain pointer
83 XrdXrootdAioReq *aioReq; // -> Associated request object
84};
85
86/******************************************************************************/
87/* X r d X r o o t d A i o R e q */
88/******************************************************************************/
89
90// The XrdXrootdAioReq object represents a complete aio request. It handles
91// the appropriate translation of the synchrnous request to an async one,
92// provides the redrive logic, and handles ending status.
93//
94class XrdLink;
95class XrdXrootdFile;
97
98class XrdXrootdAioReq : public XrdJob
99{
100friend class XrdXrootdAio;
101public:
102
103static XrdXrootdAioReq *Alloc(XrdXrootdProtocol *p, char iot, int numaio=0);
104
105 void DoIt() {if (aioType == 'r') endRead();
106 else endWrite();
107 }
108
110
112 aioDone = aiop->Next; return aiop;
113 }
114
115inline void Push(XrdXrootdAio *newp)
116 {newp->Next = aioDone; aioDone = newp;}
117
118static void Init(int iosize, int maxaiopr, int maxaio=-80);
119
120 int Read();
121
122 void Recycle(int deref=1, XrdXrootdAio *aiop=0);
123
124 int Write(XrdXrootdAio *aiop);
125
126 XrdXrootdAioReq() : XrdJob("aio request") {}
127 ~XrdXrootdAioReq() {} // Never called
128
129private:
130
131 void Clear(XrdLink *lnkp);
132
134 void endRead();
135 void endWrite();
136inline void Lock() {aioMutex.Lock(); isLocked = 1;}
137 void Scuttle(const char *opname);
138 void sendError(char *tident);
139inline void UnLock() {isLocked = 0; aioMutex.UnLock();}
140
141static const char *TraceID;
142static XrdSysError *eDest; // -> Error Object
143static XrdSysMutex rqMutex; // Locks static data
144static XrdXrootdAioReq *rqFirst; // -> Object in free queue
145static int QuantumMin; // aio segment size (Quantum/2)
146static int Quantum; // aio segment size
147static int QuantumMax; // aio segment size (Quantum*2)
148static int maxAioPR; // aio objects per request (max)
149static int maxAioPR2; // aio objects per request (max*2)
150
151 XrdSysMutex aioMutex; // Locks private data
152 XrdXrootdAioReq *Next; // -> Chain pointer
153
154 off_t myOffset; // Next offset (used for read's only)
155 int myIOLen; // Size remaining (read and write end)
156 unsigned int Instance; // Network Link Instance
157 XrdLink *Link; // -> Network link
158 XrdXrootdFile *myFile; // -> Associated file
159
160 XrdXrootdAio *aioDone; // Next aiocb that completed
161 XrdXrootdAio *aioFree; // Next aiocb that we can use
162 int numActive; // Number of aio requests outstanding
163 int aioTotal; // Actual number of disk bytes transferred
164 int aioError; // First errno encounetered
165 char aioType; // 'r' or 'w' or 's'
166 char respDone; // 1 -> Response has been sent
167 char isLocked; // 1 -> Object lock being held
168 char reDrive; // 1 -> Link redrive is needed
169
170 XrdXrootdResponse Response; // Copy of the original response object
171};
172#endif
Definition: XrdBuffer.hh:75
Definition: XrdBuffer.hh:42
Definition: XrdJob.hh:43
Definition: XrdScheduler.hh:45
Definition: XrdSfsAio.hh:58
Definition: XrdSysError.hh:90
Definition: XrdSysPthread.hh:166
void Lock()
Definition: XrdSysPthread.hh:220
void UnLock()
Definition: XrdSysPthread.hh:222
Definition: XrdXrootdAio.hh:99
static int QuantumMax
Definition: XrdXrootdAio.hh:147
unsigned int Instance
Definition: XrdXrootdAio.hh:156
static XrdXrootdAioReq * addBlock()
char respDone
Definition: XrdXrootdAio.hh:166
XrdXrootdAioReq * Next
Definition: XrdXrootdAio.hh:152
void Scuttle(const char *opname)
static XrdSysMutex rqMutex
Definition: XrdXrootdAio.hh:143
off_t myOffset
Definition: XrdXrootdAio.hh:154
static int maxAioPR2
Definition: XrdXrootdAio.hh:149
int aioTotal
Definition: XrdXrootdAio.hh:163
void DoIt()
Definition: XrdXrootdAio.hh:105
int numActive
Definition: XrdXrootdAio.hh:162
int Write(XrdXrootdAio *aiop)
XrdXrootdAio * aioDone
Definition: XrdXrootdAio.hh:160
XrdXrootdAioReq()
Definition: XrdXrootdAio.hh:126
int myIOLen
Definition: XrdXrootdAio.hh:155
XrdXrootdFile * myFile
Definition: XrdXrootdAio.hh:158
static void Init(int iosize, int maxaiopr, int maxaio=-80)
XrdSysMutex aioMutex
Definition: XrdXrootdAio.hh:151
static const char * TraceID
Definition: XrdXrootdAio.hh:141
~XrdXrootdAioReq()
Definition: XrdXrootdAio.hh:127
int aioError
Definition: XrdXrootdAio.hh:164
char aioType
Definition: XrdXrootdAio.hh:165
void UnLock()
Definition: XrdXrootdAio.hh:139
static int Quantum
Definition: XrdXrootdAio.hh:146
static int maxAioPR
Definition: XrdXrootdAio.hh:148
static XrdXrootdAioReq * Alloc(XrdXrootdProtocol *p, char iot, int numaio=0)
void sendError(char *tident)
XrdXrootdAio * getAio()
char isLocked
Definition: XrdXrootdAio.hh:167
XrdXrootdResponse Response
Definition: XrdXrootdAio.hh:170
void Recycle(int deref=1, XrdXrootdAio *aiop=0)
static XrdXrootdAioReq * rqFirst
Definition: XrdXrootdAio.hh:144
char reDrive
Definition: XrdXrootdAio.hh:168
static int QuantumMin
Definition: XrdXrootdAio.hh:145
void Push(XrdXrootdAio *newp)
Definition: XrdXrootdAio.hh:115
XrdLink * Link
Definition: XrdXrootdAio.hh:157
XrdXrootdAio * aioFree
Definition: XrdXrootdAio.hh:161
XrdXrootdAio * Pop()
Definition: XrdXrootdAio.hh:111
void Clear(XrdLink *lnkp)
static XrdSysError * eDest
Definition: XrdXrootdAio.hh:142
void Lock()
Definition: XrdXrootdAio.hh:136
Definition: XrdXrootdAio.hh:54
static int maxAio
Definition: XrdXrootdAio.hh:80
static XrdXrootdAio * addBlock()
static const char * TraceID
Definition: XrdXrootdAio.hh:74
static XrdSysMutex fqMutex
Definition: XrdXrootdAio.hh:78
XrdXrootdAio * Next
Definition: XrdXrootdAio.hh:82
static XrdScheduler * Sched
Definition: XrdXrootdAio.hh:76
virtual void doneWrite()
~XrdXrootdAio()
Definition: XrdXrootdAio.hh:67
XrdXrootdAio()
Definition: XrdXrootdAio.hh:66
XrdBuffer * buffp
Definition: XrdXrootdAio.hh:57
static XrdXrootdStats * SI
Definition: XrdXrootdAio.hh:77
static XrdXrootdAio * fqFirst
Definition: XrdXrootdAio.hh:79
XrdXrootdAioReq * aioReq
Definition: XrdXrootdAio.hh:83
static XrdBuffManager * BPool
Definition: XrdXrootdAio.hh:75
virtual void Recycle()
static XrdXrootdAio * Alloc(XrdXrootdAioReq *arp, int bsize=0)
virtual void doneRead()
Definition: XrdXrootdFile.hh:98
Definition: XrdXrootdProtocol.hh:94
Definition: XrdXrootdResponse.hh:49
Definition: XrdXrootdStats.hh:40