XRootD
XrdOfsPrepGPI.cc File Reference
#include <string>
#include <vector>
#include <stdio.h>
#include <unistd.h>
#include "Xrd/XrdJob.hh"
#include "Xrd/XrdScheduler.hh"
#include "XrdOfs/XrdOfsPrepare.hh"
#include "XrdOss/XrdOss.hh"
#include "XrdOuc/XrdOuca2x.hh"
#include "XrdOuc/XrdOucBuffer.hh"
#include "XrdOuc/XrdOucEnv.hh"
#include "XrdOuc/XrdOucErrInfo.hh"
#include "XrdOuc/XrdOucGatherConf.hh"
#include "XrdOuc/XrdOucProg.hh"
#include "XrdOuc/XrdOucStream.hh"
#include "XrdOuc/XrdOucString.hh"
#include "XrdOuc/XrdOucTList.hh"
#include "XrdSec/XrdSecEntity.hh"
#include "XrdSfs/XrdSfsInterface.hh"
#include "XrdSys/XrdSysError.hh"
#include "XrdSys/XrdSysE2T.hh"
#include "XrdSys/XrdSysPthread.hh"
#include "XrdSys/XrdSysTrace.hh"
#include "XrdVersion.hh"
+ Include dependency graph for XrdOfsPrepGPI.cc:

Go to the source code of this file.

Classes

class  XrdOfsPrepGPIReal::PrepGPI
 
class  XrdOfsPrepGPIReal::PrepGRun
 
struct  XrdOfsPrepGPIReal::PrepRequest
 

Namespaces

 XrdOfsPrepGPIReal
 

Macros

#define DEBUG(usr, x)   if (Debug) SYSTRACE(SysTrace.,usr,EPName,0,x)
 
#define EPNAME(x)   const char *EPName=x
 

Functions

XrdOfsPrepareXrdOfsgetPrepare (XrdOfsgetPrepareArguments)
 
 XrdVERSIONINFO (XrdOfsgetPrepare, PrepGPI)
 

Variables

bool XrdOfsPrepGPIReal::addCGI = false
 
XrdOucBuffPoolXrdOfsPrepGPIReal::bPool = 0
 
bool XrdOfsPrepGPIReal::Debug = false
 
XrdSysErrorXrdOfsPrepGPIReal::eLog = 0
 
XrdSysMutex XrdOfsPrepGPIReal::gpiMutex
 
int XrdOfsPrepGPIReal::maxFiles = 48
 
int XrdOfsPrepGPIReal::maxResp = XrdOucEI::Max_Error_Len
 
static const int XrdOfsPrepGPIReal::okAll = 0x1f
 
static const int XrdOfsPrepGPIReal::okCancel = 0x01
 
static const int XrdOfsPrepGPIReal::okEvict = 0x02
 
static const int XrdOfsPrepGPIReal::okPrep = 0x04
 
static const int XrdOfsPrepGPIReal::okQuery = 0x08
 
char XrdOfsPrepGPIReal::okReq = 0
 
static const int XrdOfsPrepGPIReal::okStage = 0x10
 
XrdOssXrdOfsPrepGPIReal::ossP = 0
 
XrdOucProgXrdOfsPrepGPIReal::pgmObj = 0
 
int XrdOfsPrepGPIReal::qryAllow = 8
 
XrdSysCondVar XrdOfsPrepGPIReal::qryCond (0, "prepG query")
 
static const int XrdOfsPrepGPIReal::qryMaxWT = 33
 
int XrdOfsPrepGPIReal::qryWait = 0
 
XrdSchedulerXrdOfsPrepGPIReal::schedP = 0
 
XrdSysTrace XrdOfsPrepGPIReal::SysTrace ("PrepGPI")
 
bool XrdOfsPrepGPIReal::usePFN = false
 

Macro Definition Documentation

◆ DEBUG

#define DEBUG (   usr,
 
)    if (Debug) SYSTRACE(SysTrace.,usr,EPName,0,x)

Definition at line 40 of file XrdOfsPrepGPI.cc.

◆ EPNAME

#define EPNAME (   x)    const char *EPName=x

Definition at line 42 of file XrdOfsPrepGPI.cc.

Function Documentation

◆ XrdOfsgetPrepare()

XrdOfsPrepare* XrdOfsgetPrepare ( XrdOfsgetPrepareArguments  )

Definition at line 821 of file XrdOfsPrepGPI.cc.

822 {
823  XrdOucGatherConf gpiConf("prepgpi.parms", eDest);
824  XrdOucString RunPgm, Token;
825  char *tokP;
826  int maxReq = 4;
827 
828 // Save some of the arguments that we may need later
829 //
830  eLog = eDest;
831  ossP = theOss;
832  schedP = (XrdScheduler *)(envP->GetPtr("XrdScheduler*"));
833 
834 // If parameters specified on the preplib directive, use them. Otherwise,
835 // get them from the config file.
836 //
837  if (!gpiConf.useData(parms)
838  && gpiConf.Gather(confg, XrdOucGatherConf::only_body) < 0) return 0;
839 
840 // Verify we actually have parameters (there is only one line of them).
841 //
842  if (!(tokP = gpiConf.GetLine()) || !*tokP)
843  {eLog->Emsg("PrepGPI", "Parameters not specified.");
844  return 0;
845  }
846 
847 // Parse the parameters, they are space delimited
848 //
849  while((tokP = gpiConf.GetToken()))
850  {Token = tokP;
851  if (Token == "-admit")
852  {if (!(tokP = gpiConf.GetToken()) || *tokP == '-')
853  {eLog->Emsg("PrepGPI", "-admit argument not specified.");
854  return 0;
855  }
856  XrdOucString Args(tokP);
857  int argPos = 0;
858  bool argOK = false;
859  while((argPos = Args.tokenize(Token, argPos, ',')) != -1)
860  { if (Token == "cancel") okReq |= okCancel;
861  else if (Token == "evict") okReq |= okEvict;
862  else if (Token == "prep") okReq |= okPrep;
863  else if (Token == "query") okReq |= okQuery;
864  else if (Token == "stage") okReq |= okStage;
865  else if (Token == "all") okReq |= okAll;
866  else {eLog->Emsg("PrepGPI", "Invalid -admit request -",
867  Token.c_str());
868  return 0;
869  }
870  argOK = true;
871  }
872  if (!argOK)
873  {eLog->Emsg("PrepGPI", "invalid -admit request list");
874  return 0;
875  }
876  }
877  else if (Token == "-cgi") addCGI= true;
878  else if (Token == "-debug") Debug = true;
879  else if (Token == "-maxfiles")
880  {if (!(tokP = gpiConf.GetToken()) || *tokP == '-')
881  {eLog->Emsg("PrepGPI", "-maxfiles argument not specified.");
882  return 0;
883  }
884  if (XrdOuca2x::a2i(*eLog, "PrepPGI -maxfiles", tokP,
885  &maxFiles, 1, 1024)) return 0;
886  }
887  else if (Token == "-maxquery")
888  {if (!(tokP = gpiConf.GetToken()) || *tokP == '-')
889  {eLog->Emsg("PrepGPI", "-maxquery argument not specified.");
890  return 0;
891  }
892  if (XrdOuca2x::a2i(*eLog, "PrepPGI -maxquery", tokP,
893  &qryAllow, 1, 64)) return 0;
894  }
895  else if (Token == "-maxreq")
896  {if (!(tokP = gpiConf.GetToken()) || *tokP == '-')
897  {eLog->Emsg("PrepGPI", "-maxreq argument not specified.");
898  return 0;
899  }
900  if (XrdOuca2x::a2i(*eLog, "PrepPGI -maxreq", tokP,
901  &maxReq, 1, 64)) return 0;
902  }
903  else if (Token == "-maxresp")
904  {if (!(tokP = gpiConf.GetToken()) || *tokP == '-')
905  {eLog->Emsg("PrepGPI", "-maxresp argument not specified.");
906  return 0;
907  }
908  long long rspsz;
909  if (XrdOuca2x::a2sz(*eLog, "PrepPGI -maxresp", tokP,
910  &rspsz, 2048, 16777216)) return 0;
911  maxResp = static_cast<int>(rspsz);
912  }
913  else if (Token == "-pfn") usePFN = true;
914  else if (Token == "-run")
915  {if (!(tokP = gpiConf.GetToken()) || *tokP == '-')
916  {eLog->Emsg("PrepGPI", "-run argument not specified.");
917  return 0;
918  }
919  RunPgm = tokP;
920  }
921  else {eLog->Emsg("PrepGPI", "Invalid option -", Token.c_str());
922  return 0;
923  }
924  }
925 
926 // Make sure at least one request was enabled
927 //
928  if (!(okReq & okAll))
929  {eLog->Emsg("PrepGPI", "'-admit' was not specified.");
930  return 0;
931  }
932 
933 // Make sure the prepare program was specified
934 //
935  if (!RunPgm.length())
936  {eLog->Emsg("PrepGPI", "prepare program not specified.");
937  return 0;
938  }
939 
940 // Create a buffer pool for query responses if we need to
941 //
942  if (maxResp > (int)XrdOucEI::Max_Error_Len)
944 
945 // Set final debug flags
946 //
947  if (!Debug) Debug = getenv("XRDDEBUG") != 0;
949 
950 // Obtain an instance of the program object for this command. Note that
951 // all grun object will share this program as it's thread safe in the
952 // context in which we will use it (i.e. read/only).
953 //
954  pgmObj = new XrdOucProg(eLog, 0); // EFD????
955  if (pgmObj->Setup(RunPgm.c_str()))
956  {delete pgmObj;
957  eLog->Emsg("PrepGPI", "Unable to use prepare program", RunPgm.c_str());
958  return 0;
959  }
960 
961 // Create as many run object as we need
962 //
963  PrepGRun *gRun;
964  while(maxReq--)
965  {gRun = new PrepGRun(*pgmObj);
966  gRun->next = PrepGRun::Q;
967  PrepGRun::Q = gRun;
968  }
969 
970 // Create one additional such object for queries to pass to the plugin
971 //
972  gRun = new PrepGRun(*pgmObj);
973 
974 // Return an instance of the prepare plugin
975 //
976  return new PrepGPI(*gRun);
977 }
static XrdSysError eDest(0,"crypto_")
void * GetPtr(const char *varname)
Definition: XrdOucEnv.cc:281
@ only_body
Only directive bodies as a string blob.
int Setup(const char *prog, XrdSysError *errP=0, int(*Proc)(XrdOucStream *, char **, int)=0)
Definition: XrdOucProg.cc:296
const char * c_str() const
int length() const
static int a2i(XrdSysError &, const char *emsg, const char *item, int *val, int minv=-1, int maxv=-1)
Definition: XrdOuca2x.cc:45
static int a2sz(XrdSysError &, const char *emsg, const char *item, long long *val, long long minv=-1, long long maxv=-1)
Definition: XrdOuca2x.cc:257
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
Definition: XrdSysError.cc:95
XrdSysLogger * logger(XrdSysLogger *lp=0)
Definition: XrdSysError.hh:141
void SetLogger(XrdSysLogger *logp)
Definition: XrdSysTrace.cc:65
XrdOucBuffPool * bPool
XrdSysTrace SysTrace("PrepGPI")
static const int okCancel
XrdOucProg * pgmObj
XrdSysError * eLog
static const int okEvict
XrdScheduler * schedP
static const int okQuery
static const int okStage
static const int okAll
static const int okPrep
XrdOucEnv * envP
Definition: XrdPss.cc:109
static const size_t Max_Error_Len

References XrdOuca2x::a2i(), XrdOuca2x::a2sz(), XrdOfsPrepGPIReal::addCGI, XrdOfsPrepGPIReal::bPool, XrdOucString::c_str(), XrdOfsPrepGPIReal::Debug, eDest, XrdOfsPrepGPIReal::eLog, XrdSysError::Emsg(), XrdProxy::envP, XrdOucGatherConf::Gather(), XrdOucGatherConf::GetLine(), XrdOucEnv::GetPtr(), XrdOucGatherConf::GetToken(), XrdOucString::length(), XrdSysError::logger(), XrdOucEI::Max_Error_Len, XrdOfsPrepGPIReal::maxFiles, XrdOfsPrepGPIReal::maxResp, XrdOfsPrepGPIReal::PrepGRun::next, XrdOfsPrepGPIReal::okAll, XrdOfsPrepGPIReal::okCancel, XrdOfsPrepGPIReal::okEvict, XrdOfsPrepGPIReal::okPrep, XrdOfsPrepGPIReal::okQuery, XrdOfsPrepGPIReal::okReq, XrdOfsPrepGPIReal::okStage, XrdOucGatherConf::only_body, XrdOfsPrepGPIReal::ossP, XrdOfsPrepGPIReal::pgmObj, XrdOfsPrepGPIReal::qryAllow, XrdOfsPrepGPIReal::schedP, XrdSysTrace::SetLogger(), XrdOucProg::Setup(), XrdOfsPrepGPIReal::SysTrace, XrdOucString::tokenize(), XrdOucGatherConf::useData(), and XrdOfsPrepGPIReal::usePFN.

+ Here is the call graph for this function:

◆ XrdVERSIONINFO()

XrdVERSIONINFO ( XrdOfsgetPrepare  ,
PrepGPI   
)