A TTree with a friend TChain doesn't propagate all errors happening in the chain

オープン
#23,936 コメント 5 件 リアクション 0 件 担当者 1 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@vepadulano がすでに取り組んでいます。

2026年11月2日 から。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
活発
技術スタック
cpp
領域
data

調査の方向性

Start with the friend-loading block in TTree::GetEntry (tree/tree/src/TTree.cxx), where the return value of LoadTreeFriend is checked, and with TTree::LoadTreeFriend itself. Build the reproducer root_friend_missing_file_bug.C from the issue, which uses a TChain friend pointing to a missing file. Done means events.GetEntry(0) returns a negative value on that failure, and the return-code convention for missing entries (-2) is kept. The sign and value conventions need a maintainer decision first.

索引モデルが issue の本文から書いたものです。

説明

in:TTree
Check duplicate issues.
  • Checked for duplicates
Description

When a TTree has a friend TChain, the tree's GetEntry() does not return an error if the chain encounters one. This is caused by code in TTree::GetEntry(), which fails to return forward failures signaled by LoadTreeFriend():

   if ( t->LoadTreeFriend(entry,this) >= 0 ) { // Returns < 0 on error
      nb = t->GetEntry(t->GetReadEntry(),getall);
   } else nb = 0; // Error path; I think this should be -1 for `LoadTreeFriend` errors except on missing entries (-2)
}
if (nb < 0) return nb; // Zero is rightfully not an error: it appears when no branch in the friend is enabled

The important point for reproduction is to make LoadTreeFriend fail. With TChain, this is trivially achieved with a file that cannot be loaded or doesn't contain the input tree. With TTree, this is only potentially possible in a very contrived scenario with friends of friends and a custom fNotify.

Reproducer

Run with root -l -q root_friend_missing_file_bug.C.

#include <TChain.h>
#include <TFile.h>
#include <TTree.h>

#include <stdio.h>

void root_friend_missing_file_bug()
{
    // Setup: 1-event main file
    {
        TFile f("main.root", "RECREATE");
        TTree t("events", "events");
        int x = 0;
        t.Branch("x", &x);
        t.Fill();
        f.Write();
    }

    TFile f("main.root", "READ");
    auto &events = *f.Get<TTree>("events"); // Repro also works with a TChain here

    TChain corrections("aux");
    corrections.Add("/ThisFileDoesNotExist.root");
    // Repro also works with branches in corrections
    events.AddFriend(&corrections);

    // The tree returns 4, i.e., doesn't report the missing file.
    printf("events.GetEntry(0)      = %d (failure if <= 0)\n", events.GetEntry(0));

    // The chain does return an error-ish value (0, inconsistent with the TTree API that
    // would return -1, but changing it would be a breaking change).
    printf("corrections.GetEntry(0) = %d (failure if <= 0)\n", corrections.GetEntry(0));
}
ROOT version

6.38.00, but code confirmed identical in master.

   ------------------------------------------------------------------
  | Welcome to ROOT 6.38.00                        https://root.cern |
  | (c) 1995-2025, The ROOT Team; conception: R. Brun, F. Rademakers |
  | Built for linuxx8664gcc on Feb 03 2026, 21:14:06                 |
  | From tags/6-38-00@6-38-00                                        |
  | With g++ (GCC) 15.2.0 std202302                                  |
  | Try '.help'/'.?', '.demo', '.license', '.credits', '.quit'/'.q'  |
   ------------------------------------------------------------------
Installation method

LCG 109

Operating system

lxplus

Additional context

I wanted to identify the origin of errors and handle them appropriately based on their category (unrecoverable tree/file not found vs transient network issues for which a retry can work).

Full disclosure: this bug was found and investigated with the help of AI. I take full responsibility for the report.

主要言語
C++
スター
3.3k
フォーク
1.6k
平均マージ
2日 14時間
マージ済み PR(30日)
222

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

root-project/root のほかの issue

root-project/root の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。