49#define TRACELINK dataLink
68const char *XrdXrootdPgrwAio::TraceID =
"PgrwAio";
80static const int maxKeep = 64;
98 {fqFirst = reqP->nextPgrw;
109 reqP->
Init(protP, resp, fP);
129 SendError(ENOMEM,
"insufficient memory");
159void XrdXrootdPgrwAio::CopyF2L()
170 {
if (
isDone || !CopyF2L_Add2Q())
break;
183 {
if (bP != finalRead) bP->
Recycle();
208 if (!
isDone && SendData(aioP) &&
dataLen) {
if (!CopyF2L_Add2Q(aioP))
break;}
216 if (!
isDone) SendData(finalRead,
true);
217 if (finalRead) finalRead->Recycle();
237int XrdXrootdPgrwAio::CopyL2F()
242 int dLen, ioVNum, rc;
253 {
SendError(ENOMEM,
"insufficient memory");
292 struct iovec *ioV = aioP->
iov4Recv(ioVNum);
297 {
if (rc > 0) pendWrite = aioP;
306 if (!CopyL2F(aioP))
return 0;
313 {
if (!
dataLen)
return SendDone();
314 SendError(EIDRM,
"pgWrite encountered an impossible condition");
315 eLog.
Emsg(
"PgrwAio",
"pgWrite logic error for",
331 if (VerCks(bP->
pgrwP))
405 TRACEP(FSAIO,
"pgrw recycle "<<(release ?
"" :
"hold ")
413 if (numFree >= maxKeep)
431 static const int infoLen =
sizeof(
kXR_int64);
432 struct pgReadResponse
443 memset(pgrResp.rsp.bdy.reserved, 0,
sizeof(pgrResp.rsp.bdy.reserved));
449 struct iovec *ioVec = bP->
pgrwP->
iov4Send(iovNum, iovLen,
true);
455 rc =
Response.
Send(pgrResp.rsp, infoLen, ioVec, iovNum, iovLen);
457 pgrResp.rsp.bdy.dlen = 0;
476int XrdXrootdPgrwAio::SendDone()
478 static const int infoLen =
sizeof(
kXR_int64);
490 memset(pgwResp.rsp.bdy.reserved, 0,
sizeof(pgwResp.rsp.bdy.reserved));
511 uint32_t *csVec, *csVP, csVal;
516 struct iovec *ioV = aioP->
iov4Data(ioVNum);
517 csVP = csVec = (uint32_t*)ioV[0].iov_base;
521 for (
int i = 1; i < ioVNum; i +=2)
522 {dLen = ioV[i].iov_len;
523 csVal = ntohl(*csVP); *csVP++ = csVal;
struct ServerResponseBody_Status bdy
XrdSysTrace XrdXrootdTrace
char * ID
Pointer to the client's link identity.
static bool Ver32C(const void *data, size_t count, const uint32_t csval, uint32_t *csbad=0)
static void csCalc(const char *data, off_t offs, size_t count, uint32_t *csval)
virtual XrdSfsXferSize pgRead(XrdSfsFileOffset offset, char *buffer, XrdSfsXferSize rdlen, uint32_t *csvec, uint64_t opts=0)
virtual XrdSfsXferSize pgWrite(XrdSfsFileOffset offset, char *buffer, XrdSfsXferSize wrlen, uint32_t *csvec, uint64_t opts=0)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
virtual void Recycle() override
XrdXrootdAioPgrw *const pgrwP
void Schedule(XrdXrootdAioTask *aioP)
int Setup2Send(off_t offs, int dlen, const char *&eMsg)
struct iovec * iov4Send(int &iovNum, int &iovLen, bool cs2net=false)
struct iovec * iov4Data(int &iovNum)
struct iovec * iov4Recv(int &iovNum)
bool noChkSums(bool reset=true)
static XrdXrootdAioPgrw * Alloc(XrdXrootdAioTask *arp)
int Setup2Recv(off_t offs, int dlen, const char *&eMsg)
bool Validate(XrdXrootdAioBuff *aioP)
XrdXrootdAioBuff * getBuff(bool wait)
void SendError(int rc, const char *eText)
XrdXrootdResponse Response
void Init(XrdXrootdProtocol *protP, XrdXrootdResponse &resp, XrdXrootdFile *fP)
XrdXrootdProtocol * Protocol
void Read(long long offs, int dlen) override
static XrdXrootdPgrwAio * Alloc(XrdXrootdProtocol *protP, XrdXrootdResponse &resp, XrdXrootdFile *fP, XrdXrootdPgwBadCS *bcsP=0)
int Write(long long offs, int dlen) override
void Recycle(bool release) override
const char * boAdd(XrdXrootdFile *fP, kXR_int64 foffs, int dlen=XrdProto::kXR_pgPageSZ)
char * boInfo(int &boLen)
int getData(gdCallBack *gdcbP, const char *dtype, char *buff, int blen)