29 TAliEnFind::TAliEnFind(
const TString &basePath,
const TString &fileName,
30 const TString &anchor,
const Bool_t archSubst,
const TString &treeName,
31 const TString ®exp,
const TString &query) :
32 fBasePath(basePath), fFileName(fileName), fTreeName(treeName),
33 fRegexpRaw(regexp), fAnchor(anchor), fQuery(query), fArchSubst(archSubst),
34 fRegexp(0), fSearchId(
""), fGridResult(0)
36 if (fArchSubst) fAnchor =
"";
37 if (!fRegexpRaw.IsNull())
38 fRegexp =
new TPMERegexp(regexp);
44 TAliEnFind::TAliEnFind(
const TAliEnFind &src) : TObject()
46 fBasePath = src.fBasePath;
47 fFileName = src.fFileName;
48 fAnchor = src.fAnchor;
49 fArchSubst = src.fArchSubst;
51 fTreeName = src.fTreeName;
52 fRegexpRaw = src.fRegexpRaw;
55 fRegexp =
new TPMERegexp( *(src.fRegexp) );
65 TAliEnFind &TAliEnFind::operator=(
const TAliEnFind &rhs)
68 fBasePath = rhs.fBasePath;
69 fFileName = rhs.fFileName;
70 fAnchor = rhs.fAnchor;
71 fArchSubst = rhs.fArchSubst;
73 fTreeName = rhs.fTreeName;
75 SetRegexp(rhs.fRegexpRaw);
78 InvalidateGridResult();
87 TAliEnFind::~TAliEnFind()
89 if (fRegexp)
delete fRegexp;
90 if (fGridResult)
delete fGridResult;
96 TGridResult *TAliEnFind::GetGridResult(Bool_t forceNewQuery)
98 if (fGridResult && !forceNewQuery) {
100 Info(
"GetGridResult",
"Returning cached AliEn find results");
103 else if (gDebug >= 1) {
104 Info(
"GetGridResult",
"Querying AliEn file catalog");
107 InvalidateGridResult();
110 TGrid::Connect(
"alien:");
111 if (!gGrid)
return NULL;
115 Info(
"GetGridResult",
"AliEn find %s %s [regexp=%s] [archsubst=%d]",
116 fBasePath.Data(), fFileName.Data(), fRegexpRaw.Data(), fArchSubst);
119 fGridResult = gGrid->Query(fBasePath.Data(), fFileName.Data());
120 if (!fGridResult)
return NULL;
122 if (fRegexp || fArchSubst || !fAnchor.IsNull() || !fQuery.IsNull()) {
124 TPMERegexp *reArchSubst = NULL;
128 temp.Form(
"/%s$", fFileName.Data());
129 reArchSubst =
new TPMERegexp(temp.Data());
131 substWith.Form(
"/root_archive.zip?%s#%s", fQuery.Data(),
135 substWith.Form(
"/root_archive.zip#%s", fFileName.Data());
139 TIter it(fGridResult);
144 while (( map = dynamic_cast<TMap *>(it.Next()) ) != NULL) {
146 os =
dynamic_cast<TObjString *
>( map->GetValue(
"turl") );
150 if (fRegexp && (fRegexp->Match(tUrl) == 0)) {
152 TObject *exmap = fGridResult->Remove(map);
153 if (exmap)
delete exmap;
158 reArchSubst->Substitute(tUrl, substWith, kFALSE);
159 os->SetString(tUrl.Data());
161 else if (!fAnchor.IsNull()) {
163 if (!fQuery.IsNull()) {
168 tUrl.Append(fAnchor);
169 os->SetString(tUrl.Data());
171 else if (!fQuery.IsNull()) {
175 os->SetString(tUrl.Data());
179 if (reArchSubst)
delete reArchSubst;
187 const char *TAliEnFind::GetSearchId()
189 if (fSearchId.IsNull()) {
191 searchIdStr.Form(
"BasePath=%s FileName=%s Anchor=%s ArchSubst=%d "
192 "TreeName=%s Regexp=%s",
193 fBasePath.Data(), fFileName.Data(), fAnchor.Data(), fArchSubst,
194 fTreeName.Data(), fRegexpRaw.Data());
195 TMD5 *md5 =
new TMD5();
196 md5->Update( (
const UChar_t *)searchIdStr.Data(),
197 (UInt_t)searchIdStr.Length() );
199 fSearchId = md5->AsString();
203 Info(
"GetSearchId",
"Returning search ID %s", fSearchId.Data());
204 return fSearchId.Data();
209 TFileCollection *TAliEnFind::GetCollection(Bool_t forceNewQuery)
211 GetGridResult(forceNewQuery);
212 if (!fGridResult)
return NULL;
214 Int_t nEntries = fGridResult->GetEntries();
215 TFileCollection *fc =
new TFileCollection();
217 for (Int_t i=0; i<nEntries; i++) {
219 Long64_t size = TString(fGridResult->GetKey(i,
"size")).Atoll();
221 TString tUrl = fGridResult->GetKey(i,
"turl");
224 Info(
"GetCollection",
">> %s", tUrl.Data());
227 TFileInfo *fi =
new TFileInfo( tUrl, size, fGridResult->GetKey(i,
"guid"),
228 fGridResult->GetKey(i,
"md5") );
235 fc->SetDefaultTreeName(fTreeName.Data());
244 void TAliEnFind::Print(Option_t* opt)
const
247 Printf(
"BasePath=%s FileName=%s Anchor=%s ArchSubst=%d "
248 "TreeName=%s Regexp=%s (query %s a result)",
249 fBasePath.Data(), fFileName.Data(), fAnchor.Data(), fArchSubst,
250 fTreeName.Data(), fRegexpRaw.Data(), (fGridResult ?
"has" :
"has not"));
255 void TAliEnFind::SetBasePath(
const char *basePath)
257 if (fBasePath.EqualTo(basePath))
return;
258 fBasePath = basePath;
259 InvalidateGridResult();
260 InvalidateSearchId();
265 void TAliEnFind::SetFileName(
const char *fileName)
267 if (fFileName.EqualTo(fileName))
return;
268 fFileName = fileName;
269 InvalidateGridResult();
270 InvalidateSearchId();
275 void TAliEnFind::SetAnchor(
const char *anchor)
277 if (fAnchor.EqualTo(anchor))
return;
279 InvalidateGridResult();
280 InvalidateSearchId();
285 void TAliEnFind::SetTreeName(
const char *treeName)
287 if (fTreeName.EqualTo(treeName))
return;
288 fTreeName = treeName;
289 InvalidateSearchId();
294 void TAliEnFind::SetArchSubst(Bool_t archSubst)
296 if (fArchSubst == archSubst)
return;
297 fArchSubst = archSubst;
298 InvalidateGridResult();
299 InvalidateSearchId();
304 void TAliEnFind::SetRegexp(
const char *regexp)
306 if (fRegexpRaw.EqualTo(regexp))
return;
309 if (fRegexp)
delete fRegexp;
310 if (!fRegexpRaw.IsNull())
311 fRegexp =
new TPMERegexp(regexp);
315 InvalidateGridResult();
316 InvalidateSearchId();
321 void TAliEnFind::InvalidateSearchId()
323 if (!fSearchId.IsNull())
329 void TAliEnFind::InvalidateGridResult()
337 ClassImp(TDataSetManagerAliEn);
341 void TDataSetManagerAliEn::Init(TString cacheDir, TString urlTpl,
342 ULong_t cacheExpire_s)
344 kfNoopRedirUrl =
new TUrl(
"noop://redir");
345 kfNoopUnknownUrl =
new TUrl(
"noop://unknown");
346 kfNoopNoneUrl =
new TUrl(
"noop://none");
348 fCacheExpire_s = cacheExpire_s;
349 fUrlRe =
new TPMERegexp(
"^alien://(.*)$");
352 if (fUrlTpl.Contains(
"<path>")) {
354 fUrlTpl.ReplaceAll(
"<path>",
"$1");
362 dsDirFmt.Form(
"dir:%s perms:open", cacheDir.Data());
363 fCache =
new TDataSetManagerFile(
"_cache_",
"_cache_", dsDirFmt);
365 if (fCache->TestBit(TObject::kInvalidObject)) {
366 Error(
"Init",
"Cannot initialize cache on directory %s", cacheDir.Data());
367 SetBit(TObject::kInvalidObject);
372 ResetBit(TDataSetManager::kAllowRegister);
373 ResetBit(TDataSetManager::kCheckQuota);
376 Info(
"TDataSetManagerAliEn",
"Caching on %s", cacheDir.Data());
377 Info(
"TDataSetManagerAliEn",
"URL schema: %s", urlTpl.Data());
378 Info(
"TDataSetManagerAliEn",
"Cache expires after: %lus", cacheExpire_s);
384 TDataSetManagerAliEn::TDataSetManagerAliEn(
const char *cacheDir,
385 const char *urlTpl, ULong_t cacheExpire_s)
386 : TDataSetManager(
"",
"",
""), fUrlRe(0), fCache(0), fReadFromSE(kFALSE),
387 kfNoopRedirUrl(0), kfNoopUnknownUrl(0), kfNoopNoneUrl(0)
389 Init(cacheDir, urlTpl, cacheExpire_s);
395 TDataSetManagerAliEn::TDataSetManagerAliEn(
const char *,
const char *,
396 const char *cfgStr) : TDataSetManager(
"",
"",
""), fUrlRe(0), fCache(0),
397 fReadFromSE(kFALSE), kfNoopRedirUrl(0), kfNoopUnknownUrl(0), kfNoopNoneUrl(0)
399 TPMERegexp reCache(
"(^| )cache:([^ ]+)( |$)");
400 if (reCache.Match(cfgStr) != 4) {
401 Error(
"TDataSetManagerAliEn",
"No cache directory specified");
402 SetBit(TObject::kInvalidObject);
406 TPMERegexp reUrlTpl(
"(^| )urltemplate:([^ ]+)( |$)");
407 if (reUrlTpl.Match(cfgStr) != 4) {
408 Error(
"TDataSetManagerAliEn",
"No local URL template specified");
409 SetBit(TObject::kInvalidObject);
413 TPMERegexp reCacheExpire(
"(^| )cacheexpiresecs:([0-9]+)( |$)");
414 if (reCacheExpire.Match(cfgStr) != 4) {
415 Error(
"TDataSetManagerAliEn",
"No cache expiration set");
416 SetBit(TObject::kInvalidObject);
420 Init(reCache[2], reUrlTpl[2], (ULong_t)reCacheExpire[2].Atoll());
425 TDataSetManagerAliEn::~TDataSetManagerAliEn()
427 if (fCache)
delete fCache;
428 if (fUrlRe)
delete fUrlRe;
429 if (kfNoopRedirUrl)
delete kfNoopRedirUrl;
430 if (kfNoopUnknownUrl)
delete kfNoopUnknownUrl;
431 if (kfNoopNoneUrl)
delete kfNoopNoneUrl;
437 TList *TDataSetManagerAliEn::GetFindCommandsFromUri(TString &uri,
438 EDataMode &dataMode, Bool_t &forceUpdate)
440 TPMERegexp reKind(
"^(Data;|Sim;|Find;)");
441 if (reKind.Match(uri) != 2) {
442 Error(
"GetFindCommandsFromUri",
"Data, Sim or Find not specified");
447 TPMERegexp reMode(
"(^|;)Mode=([A-Za-z]+)(;|$)");
448 if (reMode.Match(uri) != 4) {
449 dataMode = kDataLocal;
452 if (reMode[2].EqualTo(
"remote", TString::kIgnoreCase))
453 dataMode = kDataRemote;
454 else if (reMode[2].EqualTo(
"local", TString::kIgnoreCase))
455 dataMode = kDataLocal;
456 else if (reMode[2].EqualTo(
"cache", TString::kIgnoreCase))
457 dataMode = kDataCache;
459 Error(
"GetFindCommandsFromUri",
460 "Wrong analysis mode specified: use one of: Mode=remote, local, cache");
465 TList *findCommands = NULL;
467 if (reKind[1].BeginsWith(
"Find")) {
477 if (!ParseCustomFindUri(uri, basePath, fileName, anchor, query, treeName,
479 Error(
"GetFindCommandsFromUri",
"Malformed AliEn find command");
483 findCommands =
new TList();
484 findCommands->SetOwner();
485 findCommands->Add(
new TAliEnFind(basePath, fileName, anchor, kFALSE,
486 treeName, regexp, query) );
490 Bool_t sim = (reKind[1][0] ==
'S');
493 std::vector<Int_t> *runList;
498 if (!ParseOfficialDataUri(uri, sim, lhcPeriod, year, runList, esd,
500 Error(
"GetFindCommandsFromUri",
"Invalid parameters");
505 findCommands =
new TList();
506 findCommands->SetOwner(kTRUE);
511 TGrid::Connect(
"alien:");
526 basePathRun.Form(
"/alice/sim/%s", lhcPeriod.Data());
527 if (!gGrid->Cd(basePathRun.Data())) {
528 basePathRun.Form(
"/alice/sim/%d/%s", year, lhcPeriod.Data());
534 if ((pass[0] >=
'0') && (pass[0] <=
'9')) pass.Prepend(
"pass");
535 basePathRun.Form(
"/alice/data/%d/%s", year, lhcPeriod.Data());
540 std::vector<Int_t> validRuns;
542 TGridResult *validRunDirs = gGrid->Ls( basePathRun.Data() );
543 if (!validRunDirs)
return NULL;
545 TIter nrd(validRunDirs);
548 validRuns.resize( (
size_t)(validRunDirs->GetEntries()) );
550 while (( dir = dynamic_cast<TMap *>(nrd()) ) != NULL) {
551 os =
dynamic_cast<TObjString *
>( dir->GetValue(
"name") );
553 Int_t run = (os->String()).Atoi();
554 if (run > 0) validRuns.push_back(run);
558 for (UInt_t i=0; i<runList->size(); i++) {
561 Bool_t valid = kFALSE;
562 for (UInt_t j=0; j<validRuns.size(); j++) {
563 if (validRuns[j] == (*runList)[i]) {
570 Warning(
"TDataSetManagerAliEn::GetFindCommandsFromUri",
571 "Avoiding unnecessary find on run %d: not found", (*runList)[i]);
575 else if (gDebug >= 1) {
576 Info(
"TDataSetManagerAliEn::GetFindCommandsFromUri",
"Run found: %d", (*runList)[i]);
580 TString basePath, fileName, temp;
584 temp.Form(
"/%06d", runList->at(i));
585 basePath = basePathRun + temp;
588 temp.Form(
"/AOD%03d", aodNum);
589 basePath.Append(temp);
594 temp.Form(
"/%09d/ESDs/%s", runList->at(i), pass.Data());
595 basePath = basePathRun + temp;
597 basePath.Append(
"/*.*");
600 temp.Form(
"/AOD%03d", aodNum);
601 basePath.Append(temp);
609 fileName =
"AliESDs.root";
610 treeName =
"/esdTree";
613 fileName =
"AliAOD.root";
614 treeName =
"/aodTree";
617 findCommands->Add(
new TAliEnFind(basePath, fileName,
"", kTRUE,
627 TPMERegexp reForceUpdate(
"(^|;)ForceUpdate(;|$)");
628 forceUpdate = (reForceUpdate.Match(uri) == 3);
636 Bool_t TDataSetManagerAliEn::ParseCustomFindUri(TString &uri,
637 TString &basePath, TString &fileName, TString &anchor, TString &query,
638 TString &treeName, TString ®exp)
642 TString checkUri = uri(5, uri.Length());
645 TPMERegexp reMode(
"(^|;)(Mode=[A-Za-z]+)(;|$)");
646 if (reMode.Match(uri) == 4)
647 checkUri.ReplaceAll(reMode[2],
"");
648 TPMERegexp reForceUpdate(
"(^|;)(ForceUpdate)(;|$)");
649 if (reForceUpdate.Match(uri) == 4)
650 checkUri.ReplaceAll(reForceUpdate[2],
"");
653 TPMERegexp reBasePath(
"(^|;)(BasePath=([^; ]+))(;|$)");
654 if (reBasePath.Match(uri) != 5) {
655 ::Error(
"TDataSetManagerAliEn::ParseCustomFindUri",
656 "Base path not specified");
659 checkUri.ReplaceAll(reBasePath[2],
"");
660 basePath = reBasePath[3];
663 TPMERegexp reFileName(
"(^|;)(FileName=([^; ]+))(;|$)");
664 if (reFileName.Match(uri) != 5) {
665 ::Error(
"TDataSetManagerAliEn::ParseCustomFindUri",
666 "File name not specified");
669 checkUri.ReplaceAll(reFileName[2],
"");
670 fileName = reFileName[3];
673 TPMERegexp reAnchor(
"(^|;)(Anchor=([^; ]+))(;|$)");
674 if (reAnchor.Match(uri) != 5)
677 checkUri.ReplaceAll(reAnchor[2],
"");
678 anchor = reAnchor[3];
682 TPMERegexp reQuery(
"(^|;)(Query=([^; ]+))(;|$)");
683 if (reQuery.Match(uri) != 5)
686 checkUri.ReplaceAll(reQuery[2],
"");
691 TPMERegexp reTreeName(
"(^|;)(Tree=(/[^; ]+))(;|$)");
692 if (reTreeName.Match(uri) != 5)
695 checkUri.ReplaceAll(reTreeName[2],
"");
696 treeName = reTreeName[3];
700 TPMERegexp reRegexp(
"(^|;)(Regexp=([^; ]+))(;|$)");
701 if (reRegexp.Match(uri) != 5)
704 checkUri.ReplaceAll(reRegexp[2],
"");
705 regexp = reRegexp[3];
709 checkUri.ReplaceAll(
";",
"");
710 checkUri.ReplaceAll(
" ",
"");
711 if (!checkUri.IsNull()) {
712 ::Error(
"TDataSetManagerAliEn::ParseCustomFindUri",
713 "There are unrecognized parameters in the dataset find string");
721 Bool_t TDataSetManagerAliEn::ParseOfficialDataUri(TString &uri, Bool_t sim,
722 TString &period, Int_t &year, std::vector<Int_t> *&runList, Bool_t &esd,
723 Int_t &aodNum, TString &pass)
730 Ssiz_t idx = uri.Index(
";");
731 checkUri = uri(idx, uri.Length());
735 TPMERegexp reMode(
"(^|;)(Mode=[A-Za-z]+)(;|$)");
736 if (reMode.Match(uri) == 4)
737 checkUri.ReplaceAll(reMode[2],
"");
738 TPMERegexp reForceUpdate(
"(^|;)(ForceUpdate)(;|$)");
739 if (reForceUpdate.Match(uri) == 4)
740 checkUri.ReplaceAll(reForceUpdate[2],
"");
746 TPMERegexp rePeriod(
"(^|;)(Period=(LHC([0-9]{2})[^;]*))(;|$)");
747 if (rePeriod.Match(uri) != 6) {
748 ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
749 "LHC period not specified (e.g. Period=LHC10h)");
753 checkUri.ReplaceAll(rePeriod[2],
"");
754 period = rePeriod[3];
755 year = rePeriod[4].Atoi() + 2000;
761 TPMERegexp reFormat(
"(^|;)(Variant=(ESDs?|AOD([0-9]{3})))(;|$)");
762 if (reFormat.Match(uri) != 6) {
763 ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
764 "Data variant (e.g., Variant=ESD or AOD079) not specified");
768 checkUri.ReplaceAll(reFormat[2],
"");
769 if (reFormat[3].BeginsWith(
"ESD")) esd = kTRUE;
772 aodNum = reFormat[4].Atoi();
779 TPMERegexp rePass(
"(^|;)(Pass=([a-zA-Z_0-9-]+))(;|$)");
780 if ((!sim) && (rePass.Match(uri) != 5)) {
781 ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
782 "Pass (e.g., Pass=cpass1_muon) is mandatory on real data");
785 checkUri.ReplaceAll(rePass[2],
"");
792 TPMERegexp reRun(
"(^|;)(Run=([0-9,-]+))(;|$)");
793 if (reRun.Match(uri) != 5) {
794 ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
795 "Run or run range not specified (e.g., Run=139104-139107,139306)");
798 checkUri.ReplaceAll(reRun[2],
"");
799 TString runListStr = reRun[3];
800 runList = ExpandRunSpec(runListStr);
803 checkUri.ReplaceAll(
";",
"");
804 checkUri.ReplaceAll(
" ",
"");
805 if (!checkUri.IsNull()) {
806 ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
807 "There are unrecognized parameters in dataset string");
816 TUrl *TDataSetManagerAliEn::AliEnWhereIs(TUrl *alienUrl, TString &closeSE,
817 Bool_t onlyFromCloseSE) {
831 ::Error(
"TDataSetManagerAliEn::AliEnWhereIs",
"input AliEn URL not given!");
835 if (!gGrid || (strcmp(gGrid->GetGrid(),
"alien") != 0)) {
836 ::Error(
"TDataSetManagerAliEn::AliEnWhereIs",
"no AliEn grid connection available!");
840 TString cmd =
"whereis -r ";
841 cmd.Append(alienUrl->GetFile());
844 resp =
dynamic_cast<TList *
>( gGrid->Command(cmd.Data()) );
846 ::Error(
"TDataSetManagerAliEn::AliEnWhereIs",
"cannot get response from AliEn");
852 TString se, pfnUrl, validPfnUrl;
853 while ( (pfn = dynamic_cast<TMap *>( nextPfn() )) != NULL ) {
855 if ((pfn->GetValue(
"se") == NULL) || (pfn->GetValue(
"pfn") == NULL)) {
859 pfnUrl = pfn->GetValue(
"pfn")->GetName();
860 se = pfn->GetValue(
"se")->GetName();
862 if (se.EqualTo(closeSE, TString::kIgnoreCase)) {
864 validPfnUrl = pfnUrl;
867 else if (!onlyFromCloseSE && validPfnUrl.IsNull()) {
868 validPfnUrl = pfnUrl;
884 if (validPfnUrl.IsNull()) {
886 ::Error(
"TDataSetManagerAliEn::AliEnWhereIs",
"cannot find endpoint URL for %s", alienUrl->GetUrl());
891 TUrl *pfnTUrl =
new TUrl( validPfnUrl.Data() );
894 TString options = alienUrl->GetOptions();
895 TString anchor = alienUrl->GetAnchor();
896 if (!anchor.IsNull()) {
897 options.Append(
"&zip=");
898 options.Append(anchor);
899 pfnTUrl->SetAnchor(anchor.Data());
900 pfnTUrl->SetOptions(options.Data());
908 std::vector<Int_t> *TDataSetManagerAliEn::ExpandRunSpec(TString &runSpec) {
909 std::vector<Int_t> *runNumsPtr =
new std::vector<Int_t>();
910 std::vector<Int_t> &runNums = *runNumsPtr;
912 TObjArray *runs = runSpec.Tokenize(
":,");
917 while ( (runOs = dynamic_cast<TObjString *>(run.Next())) ) {
919 TString runStr = runOs->String();
921 TPMERegexp p(
"^([0-9]+)-([0-9]+)$");
922 if (p.Match(runStr) == 3) {
923 Int_t r1 = p[1].Atoi();
924 Int_t r2 = p[2].Atoi();
933 for (Int_t r=r1; r<=r2; r++) {
934 runNums.push_back(r);
938 runNums.push_back(runStr.Atoi());
945 for (UInt_t i=0; i<runNums.size(); i++) {
946 for (UInt_t j=i+1; j<runNums.size(); j++) {
947 if (runNums[j] < runNums[i]) {
948 runNums[i] = runNums[i] ^ runNums[j];
949 runNums[j] = runNums[i] ^ runNums[j];
950 runNums[i] = runNums[i] ^ runNums[j];
957 std::vector<Int_t>::iterator itr = runNums.begin();
959 while (itr != runNums.end()) {
960 if ((itr == runNums.begin()) || (prevVal != *itr)) {
965 itr = runNums.erase(itr);
976 TFileCollection *TDataSetManagerAliEn::GetDataSet(
const char *uri,
const char *)
978 TFileCollection *fc = NULL;
983 TList *findCmds = GetFindCommandsFromUri(sUri, dataMode, forceUpdate);
984 if (!findCmds)
return NULL;
986 fc =
new TFileCollection();
988 TFileStager *fstg = NULL;
993 while ((af = dynamic_cast<TAliEnFind *>(it.Next())) != NULL) {
995 TString cachedUri = af->GetSearchId();
996 TFileCollection *newFc = NULL;
997 Bool_t saveToCache = kFALSE;
998 Bool_t fillLocality = kFALSE;
1001 Long_t mtime = fCache->GetModTime(cachedUri.Data());
1002 Long_t now = gSystem->Now();
1003 now = now/1000 + 788914800;
1007 Info(
"GetDataSet",
"Ignoring cached query result: forcing update");
1009 else if ((mtime > 0) && (now-mtime > fCacheExpire_s)) {
1011 Info(
"GetDataSet",
"Dataset cache has expired");
1015 Info(
"GetDataSet",
"Getting file collection from cache");
1016 newFc = fCache->GetDataSet(cachedUri.Data());
1022 Info(
"GetDataSet",
"Getting file collection from AliEn");
1024 newFc = af->GetCollection();
1026 Error(
"GetDataSet",
"Cannot get collection from AliEn");
1038 TIter itCache(newFc->GetList());
1040 while ((fi = dynamic_cast<TFileInfo *>(itCache.Next()))) {
1044 seUrl = AliEnWhereIs( fi->GetCurrentUrl(), fUrlTpl, kTRUE );
1048 fi->AddUrl(seUrl->GetUrl(), kTRUE);
1054 fi->AddUrl(kfNoopNoneUrl->GetUrl(), kTRUE);
1059 tUrl = fi->GetCurrentUrl()->GetUrl();
1060 fUrlRe->Substitute(tUrl, fUrlTpl);
1061 fi->AddUrl(tUrl.Data(), kTRUE);
1068 if (dataMode == kDataLocal) {
1069 fillLocality = kTRUE;
1075 Info(
"GetDataSet",
"Not caching data locality information now");
1077 while ((fi = dynamic_cast<TFileInfo *>(itCache.Next())))
1078 fi->AddUrl(kfNoopUnknownUrl->GetUrl(), kTRUE);
1082 saveToCache = kTRUE;
1088 Bool_t hasEndp = kTRUE;
1090 fi =
dynamic_cast<TFileInfo *
>(newFc->GetList()->At(0));
1092 if ( strcmp(fi->GetCurrentUrl()->GetUrl(), kfNoopUnknownUrl->GetUrl()) == 0 ) {
1094 Info(
"GetDataSet",
"No dataset locality information in cache");
1099 if ((dataMode == kDataLocal) && !hasEndp) {
1103 TIter itCache(newFc->GetList());
1104 while ((fi = dynamic_cast<TFileInfo *>(itCache.Next()))) {
1105 fi->RemoveUrl( kfNoopUnknownUrl->GetUrl() );
1108 fillLocality = kTRUE;
1109 saveToCache = kTRUE;
1124 TIter nxtLoc(newFc->GetList());
1125 while (( fi = dynamic_cast<TFileInfo *>(nxtLoc()) )) {
1126 if (fi->FindByUrl( kfNoopNoneUrl->GetUrl() )) {
1127 fi->ResetBit(TFileInfo::kStaged);
1130 fi->SetBit(TFileInfo::kStaged);
1139 fi =
dynamic_cast<TFileInfo *
>(newFc->GetList()->At(0));
1141 Info(
"GetDataSet",
"Filling dataset locality information: "
1142 "it might take time, be patient!");
1146 fstg = TFileStager::Open(fi->GetCurrentUrl()->GetUrl());
1149 Error(
"GetDataSet",
"Can't create file stager");
1156 Int_t rv = fstg->LocateCollection(newFc, kTRUE);
1158 Error(
"GetDataSet",
"Endpoint lookup returned an error");
1165 else if (gDebug >= 1) {
1166 Info(
"GetDataSet",
"Lookup successful for %d file(s)", rv);
1177 TString group, user, name;
1178 fCache->ParseUri(cachedUri, &group, &user, &name);
1179 if (fCache->WriteDataSet(group, user, name, newFc) == 0) {
1181 Warning(
"GetDataSet",
"Could not cache retrieved information");
1187 Info(
"GetDataSet",
"Dataset information currently cached follows");
1188 newFc->Print(
"filter:SsCc");
1194 TIter itCache(newFc->GetList());
1196 while ((fi = dynamic_cast<TFileInfo *>(itCache.Next()))) {
1203 if (dataMode == kDataRemote) {
1205 fi->SetBit(TFileInfo::kStaged);
1207 nDeleteUrls = fi->GetNUrls() - 1;
1208 for (Int_t i=0; i<nDeleteUrls; i++) {
1212 else if (dataMode == kDataCache) {
1214 fi->SetBit(TFileInfo::kStaged);
1216 nDeleteUrls = fi->GetNUrls() - 2;
1217 for (Int_t i=0; i<nDeleteUrls; i++) {
1224 fi->RemoveUrl( kfNoopUnknownUrl->GetUrl() );
1225 fi->RemoveUrl( kfNoopNoneUrl->GetUrl() );
1226 fi->RemoveUrl( kfNoopRedirUrl->GetUrl() );
1231 TFileInfo *newFi =
new TFileInfo(*fi);
1237 if (!fc->GetDefaultTreeName())
1238 fc->SetDefaultTreeName(newFc->GetDefaultTreeName());
1245 if (fstg)
delete fstg;
1253 Bool_t TDataSetManagerAliEn::ExistsDataSet(
const char *uri)
1255 TFileCollection *fc = GetDataSet(uri);
1256 Bool_t existsNonEmpty = (fc && (fc->GetNFiles() > 0));
1258 return existsNonEmpty;
1263 Int_t TDataSetManagerAliEn::RegisterDataSet(
const char *, TFileCollection *,
1266 MayNotUse(
"RegisterDataSet");
1272 TMap *TDataSetManagerAliEn::GetDataSets(
const char *, UInt_t)
1274 MayNotUse(
"GetDataSets");
1280 void TDataSetManagerAliEn::ShowDataSets(
const char *,
const char *)
1282 MayNotUse(
"ShowDataSets");
1287 Bool_t TDataSetManagerAliEn::RemoveDataSet(
const char *)
1289 MayNotUse(
"RemoveDataSet");
1295 Int_t TDataSetManagerAliEn::ScanDataSet(
const char *, UInt_t)
1297 MayNotUse(
"ScanDataSet");
1303 Int_t TDataSetManagerAliEn::ShowCache(
const char *)
1305 MayNotUse(
"ShowCache");
1311 Int_t TDataSetManagerAliEn::ClearCache(
const char *)
1313 MayNotUse(
"ClearCache");