diff --git a/src/XrdCks/XrdCksConfig.cc b/src/XrdCks/XrdCksConfig.cc index 6512c7a6206..bcd4694bc76 100644 --- a/src/XrdCks/XrdCksConfig.cc +++ b/src/XrdCks/XrdCksConfig.cc @@ -168,7 +168,7 @@ int XrdCksConfig::Manager(const char *Path, const char *Parms) Output: 0 upon success or !0 upon failure. */ -int XrdCksConfig::ParseLib(XrdOucStream &Config) +int XrdCksConfig::ParseLib(XrdOucStream &Config, int &libType) { static const int nameSize = XrdCksData::NameSize; static const int pathSize = MAXPATHLEN; @@ -203,7 +203,10 @@ int XrdCksConfig::ParseLib(XrdOucStream &Config) // Check if this is for the manager // - if (*buff == '*' && *(buff+1) == ' ') return Manager(buff+2, parms); + if ((*buff == '*' || *buff == '=') && *(buff+1) == ' ') + {libType = (*buff == '*' ? -1 : 1); + return Manager(buff+2, parms); + } else libType = 0; // Add this digest to the list of digests // diff --git a/src/XrdCks/XrdCksConfig.hh b/src/XrdCks/XrdCksConfig.hh index c40701a8ee8..960fbcff24f 100644 --- a/src/XrdCks/XrdCksConfig.hh +++ b/src/XrdCks/XrdCksConfig.hh @@ -52,7 +52,7 @@ int Manager(const char *Path, const char *Parms); const char *ManLib() {return CksLib;} -int ParseLib(XrdOucStream &Config); +int ParseLib(XrdOucStream &Config, int &libType); XrdCksConfig(const char *cFN, XrdSysError *Eroute, int &aOK, XrdVersionInfo &vInfo); diff --git a/src/XrdOfs/XrdOfs.cc b/src/XrdOfs/XrdOfs.cc index c6a63b195b9..cde428840bb 100644 --- a/src/XrdOfs/XrdOfs.cc +++ b/src/XrdOfs/XrdOfs.cc @@ -161,6 +161,8 @@ XrdOfs::XrdOfs() // Cks = 0; CksPfn = true; + CksPfn = true; + CksRdr = true; } /******************************************************************************/ @@ -1360,7 +1362,7 @@ int XrdOfs::chksum( csFunc Func, // In // If we are a menager then we need to redirect the client to where the file is // - if (Finder && Finder->isRemote() + if (CksRdr && Finder && Finder->isRemote() && (rc = Finder->Locate(einfo, Path, SFS_O_RDONLY, &cksEnv))) return fsError(einfo, rc); diff --git a/src/XrdOfs/XrdOfs.hh b/src/XrdOfs/XrdOfs.hh index a52989e264a..64ec62b442c 100644 --- a/src/XrdOfs/XrdOfs.hh +++ b/src/XrdOfs/XrdOfs.hh @@ -376,6 +376,7 @@ short poscAuto; // 1 -> Automatic persist on close char ossRW; // The oss r/w capability bool CksPfn; // Checksum needs a pfn +bool CksRdr; // Checksum may be redirected (i.e. not local) XrdOfsConfigPI *ofsConfig; // Plugin configurator XrdCks *Cks; // Checksum manager char Reserved[3]; // Reserved for future checksum stuff diff --git a/src/XrdOfs/XrdOfsConfig.cc b/src/XrdOfs/XrdOfsConfig.cc index 9fe32c6e662..0b7cce3e643 100644 --- a/src/XrdOfs/XrdOfsConfig.cc +++ b/src/XrdOfs/XrdOfsConfig.cc @@ -264,6 +264,7 @@ int XrdOfs::Configure(XrdSysError &Eroute, XrdOucEnv *EnvInfo) { else {ofsConfig->Plugin(XrdOfsOss); ofsConfig->Plugin(Cks); CksPfn = !ofsConfig->OssCks(); + CksRdr = !ofsConfig->LclCks(); if (Options & Authorize) {ofsConfig->Plugin(Authorization); XrdOfsTPC::Init(Authorization); diff --git a/src/XrdOfs/XrdOfsConfigPI.cc b/src/XrdOfs/XrdOfsConfigPI.cc index 2118752e176..5a94f76fa20 100644 --- a/src/XrdOfs/XrdOfsConfigPI.cc +++ b/src/XrdOfs/XrdOfsConfigPI.cc @@ -89,7 +89,7 @@ XrdOfsConfigPI::XrdOfsConfigPI(const char *cfn, XrdOucStream *cfgP, : autPI(0), cksPI(0), cmsPI(0), ossPI(0), urVer(verP), Config(cfgP), Eroute(errP), CksConfig(0), ConfigFN(cfn), CksAlg(0), CksRdsz(0), ossXAttr(false), ossCksio(false), - Loaded(false), LoadOK(false) + Loaded(false), LoadOK(false), cksLcl(false) { int rc; @@ -276,7 +276,10 @@ bool XrdOfsConfigPI::Parse(TheLib what) break; case theAutLib: break; case theCksLib: if (CksConfig) - {if (CksConfig->ParseLib(*Config)) return false; + {int libType; + if (CksConfig->ParseLib(*Config, libType)) + return false; + if (libType) cksLcl = libType == 1; RepLib(theCksLib, CksConfig->ManLib(), nullParms); return true; } diff --git a/src/XrdOfs/XrdOfsConfigPI.hh b/src/XrdOfs/XrdOfsConfigPI.hh index 1c301f7c766..10728b7c8fb 100644 --- a/src/XrdOfs/XrdOfsConfigPI.hh +++ b/src/XrdOfs/XrdOfsConfigPI.hh @@ -140,6 +140,14 @@ static XrdOfsConfigPI *New(const char *cfn, XrdOucStream *cfgP, XrdSysError *errP, XrdVersionInfo *verP=0); +//----------------------------------------------------------------------------- +//! Check if the checksum plugin runs on tghe local node irrespective of type. +//! +//! @return True if the plugin runs on the local node, false otherwise. +//----------------------------------------------------------------------------- + +bool LclCks() {return cksLcl;} + //----------------------------------------------------------------------------- //! Check if the checksum plugin uses the oss plugin. //! @@ -237,5 +245,6 @@ bool ossXAttr; bool ossCksio; bool Loaded; bool LoadOK; +bool cksLcl; }; #endif