From 5421a21023d57942d8f8965e8714b31ae46e60ff Mon Sep 17 00:00:00 2001 From: ferdymercury Date: Thu, 25 Sep 2025 17:31:16 +0200 Subject: [PATCH 1/4] [test] interfere with TChain reading other tree from first file Closes https://its.cern.ch/jira/browse/ROOT-7973 or rather adds a test for it. It has been solved --- tree/tree/test/TChainRegressions.cxx | 56 +++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/tree/tree/test/TChainRegressions.cxx b/tree/tree/test/TChainRegressions.cxx index 97cdd8a31abab..97720ee746278 100644 --- a/tree/tree/test/TChainRegressions.cxx +++ b/tree/tree/test/TChainRegressions.cxx @@ -9,13 +9,67 @@ class TTreeCache; +// https://its.cern.ch/jira/browse/ROOT-7973 +TEST(TChain, WrongCacheReadTwoTrees) +{ + const auto treename1 = "tree1"; + const auto filename1 = "tchain7973_file1.root"; + const auto filename2 = "tchain7973_file2.root"; + { + TFile f(filename1, "RECREATE"); + TTree t1(treename1, treename1); + int var = 0; + t1.Branch("bInt", &var); + var = 1; + t1.Fill(); + TTree t2(treename2, treename2); + double var2 = 0.0; + t2.Branch("bDouble", &var2); + var2 = 2.0; + t2.Fill(); + f.Write(); + f.Close(); + } + { + TFile f(filename2, "RECREATE"); + TTree t1(treename1, treename1); + int var = 0; + t1.Branch("bInt", &var); + var = 3; + t1.Fill(); + f.Write(); + f.Close(); + } + { + TChain chain(treename1); + chain.AddFile(filename1); + chain.AddFile(filename2); + + // first entry in first file in chain + Long64_t entry = 0; + Long64_t treeEntry = chain.LoadTree(entry); + + // read another tree from the same file + TFile *f1 = chain.GetTree()->GetCurrentFile(); + TTree *tree2 = f1->Get("tree2"); + tree2->GetEntry(0); + + // first entry in second file in chain + Long64_t entry2 = 1; + Long64_t treeEntry2 = chain.LoadTree(entry2); + EXPECT_EQ(treeEntry2, 0); + } + gSystem->Unlink(filename1); + gSystem->Unlink(filename2); +} + // ROOT-10672 TEST(TChain, GetReadCacheBug) { const auto treename = "tree"; const auto filename = "tchain_getreadcachebug.root"; { - TFile f(filename, "recreate"); + TFile f(filename, "RECREATE"); ASSERT_FALSE(f.IsZombie()); TTree t(treename, treename); t.Fill(); From ba3394bb442847333332f09c326bd0738e8864ee Mon Sep 17 00:00:00 2001 From: ferdymercury Date: Thu, 25 Sep 2025 17:37:29 +0200 Subject: [PATCH 2/4] [test] fix compile error missing variable --- tree/tree/test/TChainRegressions.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/tree/tree/test/TChainRegressions.cxx b/tree/tree/test/TChainRegressions.cxx index 97720ee746278..4e41779ef985d 100644 --- a/tree/tree/test/TChainRegressions.cxx +++ b/tree/tree/test/TChainRegressions.cxx @@ -13,6 +13,7 @@ class TTreeCache; TEST(TChain, WrongCacheReadTwoTrees) { const auto treename1 = "tree1"; + const auto treename2 = "tree2"; const auto filename1 = "tchain7973_file1.root"; const auto filename2 = "tchain7973_file2.root"; { From 2d88b74277429d925bd6917f35e487af0655705f Mon Sep 17 00:00:00 2001 From: ferdymercury Date: Thu, 25 Sep 2025 17:45:52 +0200 Subject: [PATCH 3/4] [test] extend checks --- tree/tree/test/TChainRegressions.cxx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tree/tree/test/TChainRegressions.cxx b/tree/tree/test/TChainRegressions.cxx index 4e41779ef985d..6d01e27cc1989 100644 --- a/tree/tree/test/TChainRegressions.cxx +++ b/tree/tree/test/TChainRegressions.cxx @@ -45,20 +45,30 @@ TEST(TChain, WrongCacheReadTwoTrees) TChain chain(treename1); chain.AddFile(filename1); chain.AddFile(filename2); + int var = 0; + chain.SetBranchAddress("bInt", &var); // first entry in first file in chain Long64_t entry = 0; Long64_t treeEntry = chain.LoadTree(entry); + EXPECT_EQ(treeEntry, 0); + EXPECT_NE(chain.GetEntry(entry), 0); + EXPECT_EQ(var, 1); // read another tree from the same file TFile *f1 = chain.GetTree()->GetCurrentFile(); - TTree *tree2 = f1->Get("tree2"); - tree2->GetEntry(0); + TTree *t2 = f1->Get("tree2"); + double var2 = 0.0; + t2.Branch("bDouble", &var2); + EXPECT_NE(t2->GetEntry(0), 0); + EXPECT_NEAR(var2, 2.); // first entry in second file in chain Long64_t entry2 = 1; Long64_t treeEntry2 = chain.LoadTree(entry2); EXPECT_EQ(treeEntry2, 0); + EXPECT_NE(chain.GetEntry(entry2), 0); + EXPECT_EQ(var, 3); } gSystem->Unlink(filename1); gSystem->Unlink(filename2); From a05f89581d6af6ef741e7489c25d0141dfddbb52 Mon Sep 17 00:00:00 2001 From: ferdymercury Date: Thu, 25 Sep 2025 18:41:02 +0200 Subject: [PATCH 4/4] [test] fix compile errors --- tree/tree/test/TChainRegressions.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tree/tree/test/TChainRegressions.cxx b/tree/tree/test/TChainRegressions.cxx index 6d01e27cc1989..2e89c7f4b0d2e 100644 --- a/tree/tree/test/TChainRegressions.cxx +++ b/tree/tree/test/TChainRegressions.cxx @@ -59,9 +59,9 @@ TEST(TChain, WrongCacheReadTwoTrees) TFile *f1 = chain.GetTree()->GetCurrentFile(); TTree *t2 = f1->Get("tree2"); double var2 = 0.0; - t2.Branch("bDouble", &var2); + t2->SetBranchAddress("bDouble", &var2); EXPECT_NE(t2->GetEntry(0), 0); - EXPECT_NEAR(var2, 2.); + EXPECT_FLOAT_EQ(var2, 2.); // first entry in second file in chain Long64_t entry2 = 1;