From 8b45b07cec964643fe907148ef227ea38758988d Mon Sep 17 00:00:00 2001 From: Rene Brun <Rene.Brun@cern.ch> Date: Mon, 22 Jun 2009 09:05:46 +0000 Subject: [PATCH] From Gerri: Initialize the tree cache only for remote files; solves a long standing crash experienced by ALICE when mixtures of local and remote files were assigned to workers git-svn-id: http://root.cern.ch/svn/root/trunk@29126 27541ba8-7e3a-0410-8455-c3a389f83636 --- proof/proofplayer/inc/TEventIter.h | 5 +++-- proof/proofplayer/src/TEventIter.cxx | 27 +++++++++++++++++++-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/proof/proofplayer/inc/TEventIter.h b/proof/proofplayer/inc/TEventIter.h index 987b88b025c..d372ba78323 100644 --- a/proof/proofplayer/inc/TEventIter.h +++ b/proof/proofplayer/inc/TEventIter.h @@ -141,13 +141,14 @@ private: class TFileTree : public TNamed { public: Bool_t fUsed; + Bool_t fIsLocal; TFile *fFile; TList *fTrees; - TFileTree(const char *name, TFile *f); + TFileTree(const char *name, TFile *f, Bool_t islocal); virtual ~TFileTree(); }; - TTree* Load(TDSetElement *elem); + TTree* Load(TDSetElement *elem, Bool_t &localfile); TTree* GetTrees(TDSetElement *elem); public: TEventIterTree(); diff --git a/proof/proofplayer/src/TEventIter.cxx b/proof/proofplayer/src/TEventIter.cxx index 148b29ee860..1accc1edbe5 100644 --- a/proof/proofplayer/src/TEventIter.cxx +++ b/proof/proofplayer/src/TEventIter.cxx @@ -372,8 +372,8 @@ Long64_t TEventIterObj::GetNextEvent() //------------------------------------------------------------------------ //______________________________________________________________________________ -TEventIterTree::TFileTree::TFileTree(const char *name, TFile *f) - : TNamed(name, ""), fUsed(kFALSE), fFile(f) +TEventIterTree::TFileTree::TFileTree(const char *name, TFile *f, Bool_t islocal) + : TNamed(name, ""), fUsed(kFALSE), fIsLocal(islocal), fFile(f) { // Default ctor. @@ -439,11 +439,12 @@ TTree* TEventIterTree::GetTrees(TDSetElement *elem) while ((ft = (TFileTree *)nxft())) ft->fUsed = kFALSE; - TTree* main = Load(elem); + Bool_t localfile = kFALSE; + TTree* main = Load(elem, localfile); if (main && main != fTree) { // Set the file cache - if (fUseTreeCache) { + if (fUseTreeCache && !localfile) { TFile *curfile = main->GetCurrentFile(); if (!fTreeCache) { main->SetCacheSize(fCacheSize); @@ -452,7 +453,11 @@ TTree* TEventIterTree::GetTrees(TDSetElement *elem) curfile->SetCacheRead(fTreeCache); fTreeCache->UpdateBranches(main, kTRUE); } + } else { + fTreeCache = 0; } + + Bool_t loc = kFALSE; // Also the friends TList *friends = elem->GetListOfFriends(); if (friends) { @@ -461,7 +466,7 @@ TTree* TEventIterTree::GetTrees(TDSetElement *elem) while ((p = (TPair *) nxf())) { TDSetElement *dse = (TDSetElement *) p->Key(); TObjString *str = (TObjString *) p->Value(); - TTree* friendTree = Load(dse); + TTree* friendTree = Load(dse, loc); if (friendTree) { main->AddFriend(friendTree, str->GetName()); } else { @@ -485,7 +490,7 @@ TTree* TEventIterTree::GetTrees(TDSetElement *elem) } //______________________________________________________________________________ -TTree* TEventIterTree::Load(TDSetElement *e) +TTree* TEventIterTree::Load(TDSetElement *e, Bool_t &localfile) { // Load a tree from s TDSetElement @@ -519,8 +524,11 @@ TTree* TEventIterTree::Load(TDSetElement *e) TString fname = gEnv->GetValue("Path.Localroot",""); if (!fname.IsNull()) typ = TFile::GetType(fn, "", &fname); - if (typ != TFile::kLocal) + if (typ != TFile::kLocal) { fname = fn; + } else { + localfile = kTRUE; + } // Open the file f = TFile::Open(fname); @@ -530,8 +538,11 @@ TTree* TEventIterTree::Load(TDSetElement *e) } // Create TFileTree instance in the list - ft = new TFileTree(TUrl(f->GetName()).GetFileAndOptions(), f); + ft = new TFileTree(TUrl(f->GetName()).GetFileAndOptions(), f, localfile); fFileTrees->Add(ft); + } else { + // Fill locality boolean + localfile = (ft) ? ft->fIsLocal : localfile; } // Check if the tree is already loaded -- GitLab