58 #include <XrdClient/XrdClient.hh>
62 #include <XProtocol/XProtocol.hh>
69 Bool_t TXNetFile::fgInitDone = kFALSE;
70 Bool_t TXNetFile::fgRootdBC = kTRUE;
71 TFileStager *TXNetFile::fgFileStager = 0;
113 TXNetFile::TXNetFile(
const char *url, Option_t *option,
const char* ftitle,
114 Int_t compress, Int_t netopt, Bool_t parallelopen,
115 const char *logicalurl) :
116 TNetFile((logicalurl ? logicalurl : url), ftitle, compress, kFALSE)
118 TUrl urlnoanchor(url);
120 EnvPutInt(NAME_DEBUG, gEnv->GetValue(
"XNet.Debug", 0));
123 if (!fgInitDone || strstr(urlnoanchor.GetOptions(),
"checkenv")) {
128 if (gEnv->GetValue(
"XNet.PrintTAG",0) == 1)
129 Info(
"TXNetFile",
"(eXtended TNetFile) %s",
130 gROOT->GetVersion());
134 urlnoanchor.SetAnchor(
"");
137 fInitMtx = (
void *)
new XrdSysRecMutex();
139 if (gMonitoringWriter) {
142 fOpenPhases =
new TList;
143 fOpenPhases->SetOwner();
146 gMonitoringWriter->SendFileOpenProgress(
this, fOpenPhases,
"xrdopen", kFALSE);
150 CreateXClient(urlnoanchor.GetUrl(), option, netopt, parallelopen);
156 TXNetFile::~TXNetFile()
162 XrdSysRecMutex *mtx = (XrdSysRecMutex *)fInitMtx;
170 void TXNetFile::FormUrl(TUrl uu, TString &uus)
176 if (strlen(uu.GetUser()) > 0) {
182 if (strlen(uu.GetHost()) > 0) {
187 if (uu.GetPort() > 0) {
199 Int_t TXNetFile::ParseOptions(
const char *opts,
200 Int_t &cachesz, Int_t &readaheadsz,
201 Int_t &rmpolicy, Int_t &mxredir, Int_t &rastrategy, Int_t &readtrimblksz)
203 static const char *keys[6] = {
"cachesz=",
"readaheadsz=",
"rmpolicy=",
204 "mxredir=",
"readaheadstrategy=",
"readtrimblksz=" };
209 for (i = 0; i < (
sizeof(keys)/
sizeof(keys[0])); i++) {
210 Int_t j = s.Index(keys[i]);
212 TString val(s(j+strlen(keys[i]), s.Length()));
215 while (k < val.Length())
216 if (!TString(val(k++)).IsDigit())
218 if (k < val.Length())
223 cachesz = val.Atoi();
225 readaheadsz = val.Atoi();
227 rmpolicy = val.Atoi();
229 mxredir = val.Atoi();
231 rastrategy = val.Atoi();
233 readtrimblksz = val.Atoi();
240 Info(
"ParseCacheOptions",
"found: cachesz = %d, readaheadsz = %d, "
241 "rmpolicy = %d, mxredir = %d, rastrategy = %d, readtrimblksz = %d",
242 cachesz, readaheadsz, rmpolicy, mxredir, rastrategy, readtrimblksz);
251 void TXNetFile::CreateXClient(
const char *url, Option_t *option, Int_t netopt,
254 Int_t cachesz = -1, readaheadsz = -1, rmpolicy = -1, mxredir = -1, np = 0;
255 Int_t readaheadstrategy = -1, readtrimblksz = -1;
261 gSystem->Setenv(
"XRDCLIENTMAXWAIT", Form(
"%d",TFile::GetOpenTimeout()));
263 if (GetOnlyStaged()) {
265 if (!fgFileStager || !(fgFileStager->Matches(url))) {
266 SafeDelete(fgFileStager);
267 fgFileStager = TFileStager::Open(url);
270 if (!(fgFileStager->IsStaged(url))) {
271 ::Warning(
"TXNetFile",
"<%s> is not staged - StageOnly flag is set!",url);
281 if (gEnv->GetValue(
"XNet.ForceParallelOpen", 0))
282 parallelopen = kTRUE;
283 fAsyncOpenStatus = (parallelopen) ? kAOSInProgress : fAsyncOpenStatus ;
289 fClient =
new XrdClient(url);
291 fAsyncOpenStatus = (parallelopen) ? kAOSFailure : fAsyncOpenStatus ;
292 Error(
"CreateXClient",
"fatal error: new object creation failed -"
293 " out of system resources.");
299 np = ParseOptions(TUrl(url).GetOptions(),
300 cachesz, readaheadsz, rmpolicy, mxredir,
301 readaheadstrategy, readtrimblksz);
305 if (fClient->GetClientConn()) {
307 Info(
"CreateXClient",
"setting maxredir = %d", mxredir);
308 fClient->GetClientConn()->SetMaxRedirCnt(mxredir);
315 Info(
"CreateXClient",
"setting cachesz = %d, readaheadsz = %d, "
317 cachesz, readaheadsz, rmpolicy);
318 fClient->SetCacheParameters(cachesz, readaheadsz, rmpolicy);
320 if (readaheadstrategy >= 0) {
322 Info(
"CreateXClient",
"setting readaheadstrategy = %d", readaheadstrategy);
323 fClient->SetReadAheadStrategy(readaheadstrategy);
326 if (readtrimblksz >= 0) {
328 Info(
"CreateXClient",
"setting readtrimblksz = %d", readtrimblksz);
329 fClient->SetBlockReadTrimming(readtrimblksz);
336 if (!Open(option, parallelopen)) {
337 if (!fClient->IsOpen_wait()) {
339 Info(
"CreateXClient",
"remote file could not be open");
342 isRootd = (fClient->GetClientConn()->GetServerType() == kSTRootd);
347 Int_t sd = fClient->GetClientConn()->GetOpenSockFD();
351 TSocket *s =
new TSocket(sd);
353 s->SetOption(kNoBlock, 0);
356 Int_t rproto = GetRootdProtocol(s);
358 Error(
"CreateXClient",
"getting rootd server protocol");
363 s->SetRemoteProtocol(rproto);
364 TUrl uut((fClient->GetClientConn()
365 ->GetCurrentUrl()).GetUrl().c_str());
370 Info(
"CreateXClient",
" url: %s",uu.Data());
371 s->SetUrl(uu.Data());
372 s->SetService(
"rootd");
373 s->SetServType(TSocket::kROOTD);
383 TNetFile::Create(s, option, netopt);
388 TNetFile::Create(uu.Data(), option, netopt);
393 Error(
"CreateXClient",
"rootd: underlying socket undefined");
398 Info(
"CreateXClient",
"rootd: fall back not enabled - closing");
402 Error(
"CreateXClient",
"open attempt failed on %s", fUrl.GetUrl());
421 Int_t TXNetFile::GetRootdProtocol(TSocket *s)
426 Int_t len =
sizeof(cproto);
427 memcpy((
char *)&cproto,
428 Form(
" %d", TSocket::GetClientProtocol()),len);
429 Int_t ns = s->SendRaw(&cproto, len);
431 ::Error(
"TXNetFile::GetRootdProtocol",
432 "sending %d bytes to rootd server [%s:%d]",
433 len, (s->GetInetAddress()).GetHostName(), s->GetPort());
440 Int_t nr = s->RecvRaw(ibuf, len);
442 ::Error(
"TXNetFile::GetRootdProtocol",
443 "reading %d bytes from rootd server [%s:%d]",
444 len, (s->GetInetAddress()).GetHostName(), s->GetPort());
447 Int_t kind = net2host(ibuf[0]);
448 if (kind == kROOTD_PROTOCOL) {
449 rproto = net2host(ibuf[1]);
451 kind = net2host(ibuf[1]);
452 if (kind == kROOTD_PROTOCOL) {
453 len =
sizeof(rproto);
454 nr = s->RecvRaw(&rproto, len);
456 ::Error(
"TXNetFile::GetRootdProtocol",
457 "reading %d bytes from rootd server [%s:%d]",
458 len, (s->GetInetAddress()).GetHostName(), s->GetPort());
461 rproto = net2host(rproto);
465 ::Info(
"TXNetFile::GetRootdProtocol",
466 "remote rootd: buf1: %d, buf2: %d rproto: %d",
467 net2host(ibuf[0]),net2host(ibuf[1]),rproto);
476 Bool_t TXNetFile::Open(Option_t *option, Bool_t doitparallel)
480 kXR_unt16 openOpt = 0;
481 memset(&openOpt, 0,
sizeof(openOpt));
482 TString opt = option;
487 if (opt.BeginsWith(
"-") || opt.BeginsWith(
"F") || (opt ==
"+READ")) {
489 openOpt |= kXR_force;
493 Bool_t read = (opt ==
"READ");
496 Bool_t create = (opt ==
"CREATE" || opt ==
"NEW");
499 Bool_t recreate = (opt ==
"RECREATE");
502 Bool_t update = (opt ==
"UPDATE");
505 if (!create && !recreate && !update && !read) {
512 if (create || update || recreate)
518 if (gSystem->AccessPathName(fUrl.GetUrl(), kFileExists)) {
523 if (gSystem->AccessPathName(fUrl.GetUrl(), kWritePermission)) {
524 Error(
"Open",
"no write permission, could not open file %s",
526 fAsyncOpenStatus = (doitparallel) ? kAOSFailure : fAsyncOpenStatus ;
529 openOpt |= kXR_open_updt;
538 openOpt |= kXR_delete;
542 Bool_t mkpath = (gEnv->GetValue(
"XNet.Mkpath", 0) == 1) ? kTRUE : kFALSE;
543 char *p = (
char*)strstr(fUrl.GetOptions(),
"mkpath=");
545 mkpath = (*(p + strlen(
"mkpath=")) ==
'1') ? kTRUE : kFALSE;
547 openOpt |= kXR_mkpath;
550 openOpt |= kXR_open_read;
554 kXR_unt16 openMode = kXR_or | kXR_gr | kXR_ur | kXR_uw;
558 if (!fClient->Open(openMode, openOpt, doitparallel)) {
560 Info(
"Open",
"remote file could not be open");
561 fAsyncOpenStatus = (doitparallel) ? kAOSFailure : fAsyncOpenStatus ;
572 if (TFile::IsZombie()) {
591 Bool_t TXNetFile::ReadBuffer(
char *buffer, Int_t bufferLength)
594 Error(
"ReadBuffer",
"ReadBuffer is not possible because object"
595 " is in 'zombie' state");
601 Info(
"ReadBuffer",
"Calling TNetFile::ReadBuffer");
602 return TNetFile::ReadBuffer(buffer, bufferLength);
606 Error(
"ReadBuffer",
"The remote file is not open");
610 Bool_t result = kFALSE;
623 if (GetCacheRead() && GetCacheRead()->IsEnablePrefetching()) {
624 st = ReadBufferViaCache(buffer, bufferLength);
626 fOffset -= bufferLength;
631 if (GetCacheRead() && GetCacheRead()->IsAsyncReading()) {
632 st = ReadBufferViaCache(0, bufferLength);
634 fOffset -= bufferLength;
636 if (GetCacheRead()) {
637 st = ReadBufferViaCache(buffer, bufferLength);
645 if (gPerfStats) start = TTimeStamp();
648 Int_t nr = fClient->Read(buffer, fOffset, bufferLength);
650 if (nr != bufferLength) {
651 Error(
"ReadBuffer",
"error reading all requested bytes, got %d of %d",
657 Info(
"ReadBuffer",
"%d bytes of data read from offset"
658 " %lld (%d requested)", nr, fOffset, bufferLength);
660 fOffset += bufferLength;
665 SetFileBytesRead(GetFileBytesRead() + nr);
666 SetFileReadCalls(GetFileReadCalls() + 1);
673 gPerfStats->FileReadEvent(
this, bufferLength, start);
675 if (gMonitoringWriter)
676 gMonitoringWriter->SendFileReadProgress(
this);
685 Bool_t TXNetFile::ReadBuffer(
char *buffer, Long64_t pos, Int_t bufferLength)
687 return TNetFile::ReadBuffer(buffer, pos, bufferLength);
696 Bool_t TXNetFile::ReadBufferAsync(Long64_t offs, Int_t bufferLength)
699 Error(
"ReadBuffer",
"ReadBuffer is not possible because object"
700 " is in 'zombie' state");
706 Error(
"ReadBufferAsync",
"Not supported for rootd");
711 Error(
"ReadBuffer",
"The remote file is not open");
716 if (gPerfStats) start = TTimeStamp();
718 Bool_t result = kFALSE;
723 SynchronizeCacheSize();
729 XReqErrorType nr = fClient->Read_Async(offs+fArchiveOffset, bufferLength);
734 fBytesRead += bufferLength;
737 SetFileBytesRead(GetFileBytesRead() + bufferLength);
738 SetFileReadCalls(GetFileReadCalls() + 1);
740 fgBytesRead += bufferLength;
745 gPerfStats->FileReadEvent(
this, bufferLength, start);
748 Info(
"ReadBufferAsync",
"%d bytes of data read request from offset"
749 " %lld", bufferLength, offs);
763 Bool_t TXNetFile::ReadBuffers(
char *buf, Long64_t *pos, Int_t *len, Int_t nbuf)
766 Error(
"ReadBuffers",
"ReadBuffers is not possible because object"
767 " is in 'zombie' state");
773 Info(
"ReadBuffers",
"Calling TNetFile::ReadBuffers");
774 return TNetFile::ReadBuffers(buf, pos, len, nbuf);
778 Error(
"ReadBuffers",
"The remote file is not open");
783 if (gPerfStats) start = TTimeStamp();
785 if (fArchiveOffset) {
786 for (Int_t i = 0; i < nbuf; i++)
787 pos[i] += fArchiveOffset;
790 Long64_t expected_nr = 0;
791 for (Int_t i = 0; i < nbuf; i++) {
792 expected_nr += len[i];
800 if (!nbuf) ResetCache();
801 SynchronizeCacheSize();
805 Long64_t nr = fClient->ReadV(buf, pos, len, nbuf);
808 Info(
"ReadBuffers",
"response from ReadV(%d) nr: %lld", nbuf, nr);
810 if (nr == expected_nr) {
813 Info(
"ReadBuffers",
"%lld bytes of data read from a list of %d buffers",
816 if (GetCacheRead() && GetCacheRead()->GetBufferSize() < nr)
817 Info(
"ReadBuffers",
"%lld bytes of data read with a smaller (%d) TFileCacheRead buffer size?",
818 nr, GetCacheRead()->GetBufferSize());
825 SetFileBytesRead(GetFileBytesRead() + nr);
826 SetFileReadCalls(GetFileReadCalls() + 1);
834 gPerfStats->FileReadEvent(
this, (Int_t)nr, start);
837 if (gMonitoringWriter)
838 gMonitoringWriter->SendFileReadProgress(
this);
844 Info(
"ReadBuffers",
"XrdClient->ReadV failed, executing TFile::ReadBuffers");
850 return TFile::ReadBuffers(buf, pos, len, nbuf);
860 Bool_t TXNetFile::WriteBuffer(
const char *buffer, Int_t bufferLength)
863 Error(
"WriteBuffer",
"WriteBuffer is not possible because object"
864 " is in 'zombie' state");
870 Info(
"WriteBuffer",
"file not writable");
876 Info(
"WriteBuffer",
"Calling TNetFile::WriteBuffer");
877 return TNetFile::WriteBuffer(buffer, bufferLength );
881 Error(
"WriteBuffer",
"The remote file is not open");
886 if ((st = WriteBufferViaCache(buffer, bufferLength))) {
893 if (!fClient->Write(buffer, fOffset, bufferLength)) {
896 "error writing %d bytes of data wrote to offset %lld",
897 bufferLength , fOffset);
902 Info(
"WriteBuffer",
" %d bytes of data wrote to offset"
903 " %lld", bufferLength , fOffset);
905 fOffset += bufferLength;
906 fBytesWrite += bufferLength;
908 SetFileBytesWritten(GetFileBytesWritten() + bufferLength);
910 fgBytesWrite += bufferLength;
920 void TXNetFile::Init(Bool_t create)
925 Info(
"Init",
"TFile::Init already called once");
931 Info(
"Init",
"rootd: calling directly TFile::Init");
932 return TNetFile::Init(create);
937 XrdSysMutexHelper m((XrdSysRecMutex *)fInitMtx);
941 if (fClient->IsOpen_wait()) {
944 if (gMonitoringWriter)
945 gMonitoringWriter->SendFileOpenProgress(
this, fOpenPhases,
"rootinit", kFALSE);
948 bool usecachesave = fClient->UseCache(0);
954 fClient->UseCache(usecachesave);
957 if (gMonitoringWriter)
958 gMonitoringWriter->SendFileOpenProgress(
this, fOpenPhases,
"endopen", kTRUE);
962 if (fClient->GetClientConn() && fClient->GetClientConn()->fRedirOpaque.length() <= 0) {
963 fEndpointUrl = fClient->GetClientConn()->GetCurrentUrl().GetUrl().c_str();
966 if (fEndpointUrl.GetPort() != fUrl.GetPort() ||
967 strcmp(fEndpointUrl.GetHostFQDN(), fUrl.GetHostFQDN()))
968 SetBit(TFile::kRedirected);
972 Info(
"Init",
"open request failed!");
983 Bool_t TXNetFile::IsOpen()
const
987 Info(
"IsOpen",
"Calling TNetFile::IsOpen");
988 return TNetFile::IsOpen();
995 return ((fClient && fInitDone) ? fClient->IsOpen() : kFALSE);
1001 TFile::EAsyncOpenStatus TXNetFile::GetAsyncOpenStatus()
1003 if (fAsyncOpenStatus != TFile::kAOSNotAsync) {
1004 if (fClient->IsOpen_inprogress()) {
1005 return TFile::kAOSInProgress;
1007 if (fClient->IsOpen())
1008 return TFile::kAOSSuccess;
1010 return TFile::kAOSFailure;
1015 return TFile::kAOSNotAsync;
1022 Int_t TXNetFile::ReOpen(
const Option_t *Mode)
1026 Info(
"ReOpen",
"Calling TNetFile::ReOpen");
1027 return TNetFile::ReOpen(Mode);
1030 return TFile::ReOpen(Mode);
1037 void TXNetFile::Close(
const Option_t *opt)
1041 Info(
"Close",
"Calling TNetFile::Close");
1042 TNetFile::Close(opt);
1046 if (!fClient)
return;
1061 void TXNetFile::Flush()
1064 Error(
"Flush",
"Flush is not possible because object is"
1065 " in 'zombie' state");
1071 Info(
"Flush",
"file not writable - do nothing");
1077 Info(
"Flush",
"Calling TNetFile::Flush");
1083 Error(
"Flush",
"The remote file is not open");
1093 Info(
"Flush",
"XrdClient::Sync called.");
1099 Int_t TXNetFile::SysStat(Int_t fd, Long_t *
id, Long64_t *size, Long_t *flags,
1103 Error(
"SysStat",
"SysStat is not possible because object is"
1104 " in 'zombie' state");
1111 Info(
"SysStat",
"calling TNetFile::SysStat");
1112 return TNetFile::SysStat(fd,
id, size, flags, modtime);
1117 struct XrdClientStatInfo stinfo;
1118 if (fClient && fClient->Stat(&stinfo)) {
1119 *
id = (Long_t)(stinfo.id);
1120 *size = (Long64_t)(stinfo.size);
1121 *flags = (Long_t)(stinfo.flags);
1122 *modtime = (Long_t)(stinfo.modtime);
1124 Info(
"SysStat",
"got stats = %ld %lld %ld %ld",
1125 *
id, *size, *flags, *modtime);
1129 if (!IsOpen()) Info(
"SysStat",
"could not stat remote file. Not opened.");
1131 Info(
"SysStat",
"could not stat remote file");
1146 Int_t TXNetFile::SysClose(Int_t fd)
1149 Error(
"SysClose",
"SysClose is not possible because object is"
1150 " in 'zombie' state");
1156 Info(
"SysClose",
"Calling TNetFile::SysClose");
1157 return TNetFile::SysClose(fd);
1170 Int_t TXNetFile::SysOpen(
const char* pathname, Int_t flags, UInt_t mode)
1174 Info(
"SysOpen",
"Calling TNetFile::SysOpen");
1175 return TNetFile::SysOpen(pathname, flags, mode);
1181 CreateXClient(fUrl.GetUrl(), fOption, fNetopt, kFALSE);
1187 Open(fOption.Data(), kFALSE);
1201 void TXNetFile::SetEnv()
1204 TString allowRE = gEnv->GetValue(
"XNet.RedirDomainAllowRE",
"");
1205 if (allowRE.Length() > 0)
1206 EnvPutString(NAME_REDIRDOMAINALLOW_RE, allowRE.Data());
1209 TString denyRE = gEnv->GetValue(
"XNet.RedirDomainDenyRE",
"");
1210 if (denyRE.Length() > 0)
1211 EnvPutString(NAME_REDIRDOMAINDENY_RE, denyRE.Data());
1214 TString allowCO = gEnv->GetValue(
"XNet.ConnectDomainAllowRE",
"");
1215 if (allowCO.Length() > 0)
1216 EnvPutString(NAME_CONNECTDOMAINALLOW_RE, allowCO.Data());
1219 TString denyCO = gEnv->GetValue(
"XNet.ConnectDomainDenyRE",
"");
1220 if (denyCO.Length() > 0)
1221 EnvPutString(NAME_CONNECTDOMAINDENY_RE, denyCO.Data());
1224 Int_t connTO = gEnv->GetValue(
"XNet.ConnectTimeout",
1225 DFLT_CONNECTTIMEOUT);
1226 EnvPutInt(NAME_CONNECTTIMEOUT, connTO);
1229 Int_t recoTO = gEnv->GetValue(
"XNet.ReconnectWait",
1230 DFLT_RECONNECTWAIT);
1231 if (recoTO == DFLT_RECONNECTWAIT) {
1233 recoTO = gEnv->GetValue(
"XNet.ReconnectTimeout",
1234 DFLT_RECONNECTWAIT);
1236 EnvPutInt(NAME_RECONNECTWAIT, recoTO);
1239 Int_t requTO = gEnv->GetValue(
"XNet.RequestTimeout",
1240 DFLT_REQUESTTIMEOUT);
1241 EnvPutInt(NAME_REQUESTTIMEOUT, requTO);
1244 Int_t maxRedir = gEnv->GetValue(
"XNet.MaxRedirectCount",
1245 DFLT_MAXREDIRECTCOUNT);
1246 EnvPutInt(NAME_MAXREDIRECTCOUNT, maxRedir);
1250 Int_t rAheadsiz = gEnv->GetValue(
"XNet.ReadAheadSize",
1251 DFLT_READAHEADSIZE);
1252 EnvPutInt(NAME_READAHEADSIZE, rAheadsiz);
1256 Int_t rCachesiz = gEnv->GetValue(
"XNet.ReadCacheSize",
1257 DFLT_READCACHESIZE);
1259 EnvPutInt(NAME_READCACHESIZE, rCachesiz);
1262 Int_t maxRetries = gEnv->GetValue(
"XNet.FirstConnectMaxCnt",
1263 DFLT_FIRSTCONNECTMAXCNT);
1264 EnvPutInt(NAME_FIRSTCONNECTMAXCNT, maxRetries);
1267 Int_t parStreamsCnt = gEnv->GetValue(
"XNet.ParStreamsPerPhyConn",
1268 DFLT_MULTISTREAMCNT);
1269 EnvPutInt(NAME_MULTISTREAMCNT, parStreamsCnt);
1272 Int_t tcpWindowSize = gEnv->GetValue(
"XNet.DfltTcpWindowSize",
1273 DFLT_DFLTTCPWINDOWSIZE);
1274 EnvPutInt(NAME_DFLTTCPWINDOWSIZE, tcpWindowSize);
1277 Int_t transactionTimeout = gEnv->GetValue(
"XNet.TransactionTimeout",
1278 DFLT_TRANSACTIONTIMEOUT);
1279 EnvPutInt(NAME_TRANSACTIONTIMEOUT, transactionTimeout);
1283 fgRootdBC = gEnv->GetValue(
"XNet.RootdFallback", 1);
1284 EnvPutInt(NAME_KEEPSOCKOPENIFNOTXRD, fgRootdBC);
1287 TString socks4Host = gEnv->GetValue(
"XNet.SOCKS4Host",
"");
1288 Int_t socks4Port = gEnv->GetValue(
"XNet.SOCKS4Port",-1);
1289 if (socks4Port > 0) {
1290 if (socks4Host.IsNull())
1292 socks4Host =
"127.0.0.1";
1293 EnvPutString(NAME_SOCKS4HOST, socks4Host.Data());
1294 EnvPutInt(NAME_SOCKS4PORT, socks4Port);
1297 const char *cenv = 0;
1300 TString autolog = gEnv->GetValue(
"XSec.Pwd.AutoLogin",
"1");
1301 if (autolog.Length() > 0 &&
1302 (!(cenv = gSystem->Getenv(
"XrdSecPWDAUTOLOG")) || strlen(cenv) <= 0))
1303 gSystem->Setenv(
"XrdSecPWDAUTOLOG",autolog.Data());
1307 netrc.Form(
"%s/.rootnetrc",gSystem->HomeDirectory());
1308 gSystem->Setenv(
"XrdSecNETRC", netrc.Data());
1310 TString alogfile = gEnv->GetValue(
"XSec.Pwd.ALogFile",
"");
1311 if (alogfile.Length() > 0)
1312 gSystem->Setenv(
"XrdSecPWDALOGFILE",alogfile.Data());
1314 TString verisrv = gEnv->GetValue(
"XSec.Pwd.VerifySrv",
"1");
1315 if (verisrv.Length() > 0 &&
1316 (!(cenv = gSystem->Getenv(
"XrdSecPWDVERIFYSRV")) || strlen(cenv) <= 0))
1317 gSystem->Setenv(
"XrdSecPWDVERIFYSRV",verisrv.Data());
1319 TString srvpuk = gEnv->GetValue(
"XSec.Pwd.ServerPuk",
"");
1320 if (srvpuk.Length() > 0)
1321 gSystem->Setenv(
"XrdSecPWDSRVPUK",srvpuk.Data());
1324 TString cadir = gEnv->GetValue(
"XSec.GSI.CAdir",
"");
1325 if (cadir.Length() > 0)
1326 gSystem->Setenv(
"XrdSecGSICADIR",cadir.Data());
1328 TString crldir = gEnv->GetValue(
"XSec.GSI.CRLdir",
"");
1329 if (crldir.Length() > 0)
1330 gSystem->Setenv(
"XrdSecGSICRLDIR",crldir.Data());
1332 TString crlext = gEnv->GetValue(
"XSec.GSI.CRLextension",
"");
1333 if (crlext.Length() > 0)
1334 gSystem->Setenv(
"XrdSecGSICRLEXT",crlext.Data());
1336 TString ucert = gEnv->GetValue(
"XSec.GSI.UserCert",
"");
1337 if (ucert.Length() > 0)
1338 gSystem->Setenv(
"XrdSecGSIUSERCERT",ucert.Data());
1340 TString ukey = gEnv->GetValue(
"XSec.GSI.UserKey",
"");
1341 if (ukey.Length() > 0)
1342 gSystem->Setenv(
"XrdSecGSIUSERKEY",ukey.Data());
1344 TString upxy = gEnv->GetValue(
"XSec.GSI.UserProxy",
"");
1345 if (upxy.Length() > 0)
1346 gSystem->Setenv(
"XrdSecGSIUSERPROXY",upxy.Data());
1348 TString valid = gEnv->GetValue(
"XSec.GSI.ProxyValid",
"");
1349 if (valid.Length() > 0)
1350 gSystem->Setenv(
"XrdSecGSIPROXYVALID",valid.Data());
1352 TString deplen = gEnv->GetValue(
"XSec.GSI.ProxyForward",
"0");
1353 if (deplen.Length() > 0 &&
1354 (!(cenv = gSystem->Getenv(
"XrdSecGSIPROXYDEPLEN")) || strlen(cenv) <= 0))
1355 gSystem->Setenv(
"XrdSecGSIPROXYDEPLEN",deplen.Data());
1357 TString pxybits = gEnv->GetValue(
"XSec.GSI.ProxyKeyBits",
"");
1358 if (pxybits.Length() > 0)
1359 gSystem->Setenv(
"XrdSecGSIPROXYKEYBITS",pxybits.Data());
1361 TString crlcheck = gEnv->GetValue(
"XSec.GSI.CheckCRL",
"1");
1362 if (crlcheck.Length() > 0 &&
1363 (!(cenv = gSystem->Getenv(
"XrdSecGSICRLCHECK")) || strlen(cenv) <= 0))
1364 gSystem->Setenv(
"XrdSecGSICRLCHECK",crlcheck.Data());
1366 TString delegpxy = gEnv->GetValue(
"XSec.GSI.DelegProxy",
"0");
1367 if (delegpxy.Length() > 0 &&
1368 (!(cenv = gSystem->Getenv(
"XrdSecGSIDELEGPROXY")) || strlen(cenv) <= 0))
1369 gSystem->Setenv(
"XrdSecGSIDELEGPROXY",delegpxy.Data());
1371 TString signpxy = gEnv->GetValue(
"XSec.GSI.SignProxy",
"1");
1372 if (signpxy.Length() > 0 &&
1373 (!(cenv = gSystem->Getenv(
"XrdSecGSISIGNPROXY")) || strlen(cenv) <= 0))
1374 gSystem->Setenv(
"XrdSecGSISIGNPROXY",signpxy.Data());
1377 gSystem->IgnoreSignal(kSigPipe);
1384 void TXNetFile::SynchronizeCacheSize()
1386 if (fClient == 0)
return;
1388 fClient->UseCache(TRUE);
1390 Long64_t bytessubmitted, byteshit, misscount, readreqcnt;
1391 Float_t missrate, bytesusefulness;
1393 if (fClient->GetCacheInfo(size, bytessubmitted,
1394 byteshit, misscount,
1395 missrate, readreqcnt,
1396 bytesusefulness) ) {
1399 TFileCacheRead *cacheRead = GetCacheRead();
1401 newbsz = GetBufferSize() / 2 * 3;
1402 newbsz = std::max(newbsz, size);
1410 fClient->SetCacheParameters(newbsz, 0, XrdClientReadCache::kRmBlk_FIFO);
1416 void TXNetFile::ResetCache()
1419 fClient->RemoveAllDataFromCache();
1425 Int_t TXNetFile::GetBytesToPrefetch()
const
1428 Long64_t bytessubmitted, byteshit, misscount, readreqcnt;
1429 Float_t missrate, bytesusefulness;
1431 if (fClient && fClient->GetCacheInfo(size, bytessubmitted,
1432 byteshit, misscount,
1433 missrate, readreqcnt,
1436 return ((bytes < 0) ? 0 : bytes);
1442 void TXNetFile::Print(Option_t *option)
const
1444 Printf(
"TXNetFile caching information:");
1447 Long64_t bytessubmitted, byteshit, misscount, readreqcnt;
1448 Float_t missrate, bytesusefulness;
1450 if (fClient && fClient->GetCacheInfo(size, bytessubmitted,
1451 byteshit, misscount,
1452 missrate, readreqcnt,
1454 Printf(
" Max size: %d", size);
1455 Printf(
" Bytes submitted: %lld", bytessubmitted);
1456 Printf(
" Bytes hit (estimation): %lld", byteshit);
1457 Printf(
" Miss count: %lld", misscount);
1458 Printf(
" Miss rate: %f", missrate);
1459 Printf(
" Read requests count: %lld", readreqcnt);
1460 Printf(
" Bytes usefulness: %f\n", bytesusefulness);
1462 Printf(
" -- No Xrd client instance allocated --\n");
1464 TFile::Print(option);