86#define DUMPIT(x,y) XrdSsiUtils::b2x(x,y,hexBuff,sizeof(hexBuff),dotBuff)<<dotBuff
100int Same(
unsigned long long arg1,
unsigned long long arg2) {
return 0;}
103virtual ~nullCallBack() {}
115int XrdSsiFileSess::freeNum = 0;
116int XrdSsiFileSess::freeNew = 0;
117int XrdSsiFileSess::freeMax = 100;
118int XrdSsiFileSess::freeAbs = 200;
120bool XrdSsiFileSess::authDNS =
false;
136 if ((fsP = freeList))
138 freeList = fsP->nextFree;
140 fsP->Init(einfo, user,
true);
143 if (freeMax <= freeAbs && freeNew >= freeMax/2)
144 {freeMax += freeMax/2;
148 fsP =
new XrdSsiFileSess(einfo, user);
178 {eInfo.setErrInfo(0,
"");
186 mBuff = eInfo.getMsgBuff(n);
190 attnResp = (AttnResp *)mBuff;
191 memset(attnResp, 0,
sizeof(AttnResp));
197 attnResp->ioV[1].iov_base = mBuff+offsetof(
struct AttnResp, aHdr);
203 {attnResp->ioV[2].iov_base = (
void *)respP->
mdata;
204 attnResp->ioV[2].iov_len = respP->
mdlen; ioN = 3;
205 attnResp->aHdr.mdLen = htonl(respP->
mdlen);
208 {
char hexBuff[16],dotBuff[4];
209 DEBUG(reqID <<
':' <<gigID <<
' ' <<respP->
mdlen <<
" byte metadata (0x"
219 {attnResp->ioV[ioN].iov_base = (
void *)respP->buff;
220 attnResp->ioV[ioN].iov_len = respP->blen; ioN++;
231 if (!(rqstP = rTab.LookUp(reqID)))
232 {eInfo.setErrInfo(0,
"");
235 attnFinCallBack.setReq(std::move(rqstP));
236 eInfo.setErrCB(&attnFinCallBack);
242 eInfo.setErrCode(ioN);
259 const char *epname =
"close";
263 DEBUG((gigID ? gigID :
"???") <<
" del=" <<viaDel);
268 {
int rCnt = rTab.Num();
269 if (rCnt)
Stats.Bump(
Stats.ReqFinForce, rCnt);
279 {
if (oucBuff) {oucBuff->Recycle(); oucBuff = 0;}
298 static const char *epname =
"fctl";
320 DEBUG(reqID <<
':' <<gigID <<
" query resp status");
324 if (!(rqstP = rTab.LookUp(reqID)))
329 if (rqstP->WantResponse(*eInfo))
330 {
DEBUG(reqID <<
':' <<gigID <<
" resp ready");
337 DEBUG(reqID <<
':' <<gigID <<
" resp not ready");
338 fctlCallBack.setReq(std::move(rqstP));
340 eInfo->setErrCB(&fctlCallBack);
341 eInfo->setErrInfo(
respWT,
"");
350void XrdSsiFileSess::Init(
XrdOucErrInfo &einfo,
const char *user,
bool forReuse)
352 tident = (user ? strdup(user) : strdup(
""));
372bool XrdSsiFileSess::NewRequest(
unsigned int reqid,
386 XrdSsiRRTableItem<XrdSsiFileReq> rqstP = rTab.Add(reqP, reqid);
395 rqstP->Activate(oP, bR, rSz);
416 static const char *epname =
"open";
433 fileResource.Init(path, theEnv, authDNS);
438 {
const char *usr = fileResource.rUser.c_str();
439 if (!(*usr)) gigID = strdup(path);
440 else {
char gBuff[2048];
441 snprintf(gBuff,
sizeof(gBuff),
"%s:%s", usr, path);
442 gigID = strdup(gBuff);
444 DEBUG(gigID <<
" prepared.");
451 eText =
errInfo.Get(eNum).c_str();
453 {eNum = ENOMSG; eText =
"Provider returned invalid prepare response.";}
459 if (!eText || !(*eText))
break;
461 DEBUG(path <<
" --> " <<eText <<
':' <<eNum);
462 eInfo->setErrInfo(eNum, eText);
468 if (!eText || !(*eText)) eText =
"Provider is busy.";
469 DEBUG(path <<
" dly " <<eNum <<
' ' <<eText);
470 if (eNum <= 0) eNum = 1;
471 eInfo->setErrInfo(eNum, eText);
476 if (!eText || !(*eText)) eText =
XrdSysE2T(eNum);
477 DEBUG(path <<
" err " <<eNum <<
' ' <<eText);
478 eInfo->setErrInfo(eNum, eText);
486 Log.Emsg(epname,
"Provider redirect returned no target host name!");
487 eInfo->setErrInfo(ENOMSG,
"Server logic error");
511 static const char *epname =
"read";
515 unsigned int reqID = rInfo.
Id();
520 if (!(rqstP = rTab.LookUp(reqID)))
521 {
if (eofVec.IsSet(reqID))
522 {eofVec.UnSet(reqID);
530 retval = rqstP->Read(noMore, buff, blen);
535 {rTab.DelFinalize(std::move(rqstP));
561 if (freeNum < freeMax)
562 {nextFree = freeList;
576void XrdSsiFileSess::Reset()
581 if (isOpen)
close(
true);
586 if (fsUser) free(fsUser);
587 if (gigID) free(gigID);
598 static const char *epname =
"SendData";
601 unsigned int reqID = rInfo.
Id();
606 if (!(rqstP = rTab.LookUp(reqID)))
611 rc = rqstP->Send(sfDio, size);
616 else rTab.DelFinalize(std::move(rqstP));
634 static const char *epname =
"trunc";
638 unsigned int reqID = rInfo.
Id();
642 if (!(rqstP = rTab.LookUp(reqID)))
643 {
if (eofVec.IsSet(reqID))
644 {eofVec.UnSet(reqID);
657 DEBUG(reqID <<
':' <<gigID <<
" cancelled");
658 rTab.DelFinalize(std::move(rqstP));
684 static const char *epname =
"write";
686 unsigned int reqID = rInfo.
Id();
692 if (inProg)
return writeAdd(buff, blen, reqID);
696 if (rTab.LookUp(reqID))
702 reqPass = reqSize = rInfo.
Size();
704 {
if (reqSize || blen != 1)
707 }
else if (reqSize < 0 || reqSize >
maxRSZ)
717 DEBUG(reqID <<
':' <<gigID <<
" rsz=" <<reqSize <<
" wsz=" <<blen);
722 if (reqSize == blen && xioP)
725 {
if (errno)
Log.Emsg(epname,
"Xio.Claim() failed;",
XrdSysE2T(errno));}
726 else {
if (!NewRequest(reqID, 0, bRef, reqPass))
734 if (!(oucBuff =
BuffPool->Alloc(reqSize)))
739 reqLeft = reqSize - blen;
740 memcpy(oucBuff->Data(), buff, blen);
742 {oucBuff->SetLen(reqSize);
744 if (!NewRequest(reqID, oucBuff, 0, reqPass))
747 }
else oucBuff->SetLen(blen, blen);
772 static const char *epname =
"writeAdd";
782 memcpy(oucBuff->
Data(dlen), buff, blen);
787 DEBUG(rid <<
':' <<gigID <<
" rsz=" <<reqLeft <<
" wsz=" <<blen);
793 {oucBuff->
SetLen(reqSize);
794 if (!NewRequest(rid, oucBuff, 0, reqSize))
799 oucBuff->SetLen(dlen, dlen);
long long XrdSfsFileOffset
class XrdBuffer * XrdSfsXioHandle
const char * XrdSysE2T(int errcode)
void SetLen(int dataL, int dataO=0)
static XrdSsiFileReq * Alloc(XrdOucErrInfo *eP, XrdSsiFileResource *rP, XrdSsiFileSess *fP, const char *sn, const char *id, unsigned int rnum)
int fctl(const int cmd, int alen, const char *args, const XrdSecEntity *client)
int open(const char *fileName, XrdOucEnv &theEnv, XrdSfsFileOpenMode openMode)
int close(bool viaDel=false)
XrdSfsXferSize write(XrdSfsFileOffset fileOffset, const char *buffer, XrdSfsXferSize buffer_size)
bool AttnInfo(XrdOucErrInfo &eInfo, const XrdSsiRespInfo *respP, unsigned int reqID)
XrdSfsXferSize read(XrdSfsFileOffset fileOffset, char *buffer, XrdSfsXferSize buffer_size)
int truncate(XrdSfsFileOffset fileOffset)
XrdOucErrInfo * errInfo()
int SendData(XrdSfsDio *sfDio, XrdSfsFileOffset offset, XrdSfsXferSize size)
static XrdSsiFileSess * Alloc(XrdOucErrInfo &einfo, const char *user)
void Size(unsigned int sz)
static const int MaxDirectXfr
static int Emsg(const char *pfx, int ecode, const char *op, const char *path, XrdOucErrInfo &eDest)
XrdSsiProvider * Provider
XrdOucBuffPool * BuffPool
static const int fullResp
static const int pendResp
int mdlen
Metadata length.
const char * mdata
-> Metadata about response.