Uploaded image for project: 'ROOT'
  1. ROOT
  2. ROOT-10896

IMT Snapshot segfault when TTree switches over multiple files

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed (View Workflow)
    • Priority: Medium
    • Resolution: Fixed
    • Affects Version/s: master
    • Fix Version/s: 6.24/00, 6.22/04
    • Component/s: RDataFrame
    • Labels:
      None
    • Environment:

      ROOT master
      5.4.44-rt26-MANJARO
      gcc 10.1

      Description

      Steps to reproduce:
      1. run tfile_tree_setmaxsize.cpp to create a TTree that spans over 7 files (the program calls TTree::SetMaxTreeSize)
      2. run rdfIMT_tree_setmaxsize.cpp . The program runs with IMT enabled, creates and RDF with the TTree of step 1 and calls Snapshot

      output:

      Fill: Switching to new file: rdfIMT_tree_setmaxsize_1.root
      Fill: Switching to new file: rdfIMT_tree_setmaxsize_2.root
       
       *** Break *** segmentation violation
       
      ...
       
      ===========================================================
      #8  0xfffffffffffffff8 in ?? ()
      #9  0x00005634c0a245c4 in ROOT::Internal::RDF::SnapshotHelperMT<int>::Finalize (this=0x5634c245fb70) at /home/vincenzo/Programs/rootproject/build/debugpy37/include/ROOT/RDF/ActionHelpers.hxx:1494
      #10 0x00005634c0a22f90 in ROOT::Internal::RDF::RActionCRTP<ROOT::Internal::RDF::RAction<ROOT::Internal::RDF::SnapshotHelperMT<int>, ROOT::Detail::RDF::RLoopManager, ROOT::TypeTraits::TypeList<int> > >::Finalize (this=0x5634c245fb20) at /home/vincenzo/Programs/rootproject/build/debugpy37/include/ROOT/RDF/RAction.hxx:176
      #11 0x00007f706e056863 in ROOT::Detail::RDF::RLoopManager::CleanUpNodes (this=0x5634c287d490) at /home/vincenzo/Programs/rootproject/root/tree/dataframe/src/RLoopManager.cxx:503
      #12 0x00007f706e056e81 in ROOT::Detail::RDF::RLoopManager::Run (this=0x5634c287d490) at /home/vincenzo/Programs/rootproject/root/tree/dataframe/src/RLoopManager.cxx:573
      #13 0x00007f706e0490ef in ROOT::RDF::RResultPtr<ROOT::RDataFrame>::TriggerRun (this=0x7fff7c311630) at /home/vincenzo/Programs/rootproject/root/tree/dataframe/inc/ROOT/RResultPtr.hxx:307
      #14 0x00007f706e047276 in ROOT::RDF::RResultPtr<ROOT::RDataFrame>::Get (this=0x7fff7c311630) at /home/vincenzo/Programs/rootproject/root/tree/dataframe/inc/ROOT/RResultPtr.hxx:139
      #15 0x00007f706e044d0a in ROOT::RDF::RResultPtr<ROOT::RDataFrame>::operator* (this=0x7fff7c311630) at /home/vincenzo/Programs/rootproject/root/tree/dataframe/inc/ROOT/RResultPtr.hxx:179
      #16 0x00007f706e03ca81 in ROOT::Internal::RDF::CreateSnapshotRDF (validCols=std::vector of length 1, capacity 1 = {...}, treeName=..., fileName=..., isLazy=false, loopManager=..., actionPtr=std::unique_ptr<ROOT::Internal::RDF::RActionBase> = {...}) at /home/vincenzo/Programs/rootproject/root/tree/dataframe/src/RDFInterfaceUtils.cxx:343
      #17 0x00005634c0a14afd in ROOT::RDF::RInterface<ROOT::Detail::RDF::RLoopManager, void>::SnapshotImpl<int> (this=0x7fff7c311a70, treename=..., filename=..., columnList=std::vector of length 1, capacity 1 = {...}, options=...) at /home/vincenzo/Programs/rootproject/build/debugpy37/include/ROOT/RDF/RInterface.hxx:2422
      #18 0x00005634c0a1343d in ROOT::RDF::RInterface<ROOT::Detail::RDF::RLoopManager, void>::Snapshot<int> (this=0x7fff7c311a70, treename=..., filename=..., columnList=std::vector of length 1, capacity 1 = {...}, options=...) at /home/vincenzo/Programs/rootproject/build/debugpy37/include/ROOT/RDF/RInterface.hxx:463
      #19 0x00005634c0a119fc in main () at rdfIMT_tree_setmaxsize.cpp:16
      ===========================================================
      

      I ran gdb on the program and in SnapshotHelperMT::Finalize the fOutputFiles member is:

      (gdb) p fOutputFiles
      std::vector of length 4, capacity 4 = {std::shared_ptr<ROOT::Experimental::TBufferMergerFile> (empty) = {get() = 0x0}, 
        std::shared_ptr<ROOT::Experimental::TBufferMergerFile> (empty) = {get() = 0x0}, std::shared_ptr<ROOT::Experimental::TBufferMergerFile> (empty) = {get() = 0x0}, 
          std::shared_ptr<ROOT::Experimental::TBufferMergerFile> (use count 1, weak count 1) = {get() = 0x555557308c10}}
      

      But when the method tries to call file->Write() on the last element of the vector it triggers the segfault. The TBufferMergerFile itself is not accessible in this context so I'm a bit confused. Any ideas?
      Cheers,
      Vincenzo

        Attachments

          Activity

            People

            Assignee:
            vpadulan Vincenzo Eduardo Padulano
            Reporter:
            vpadulan Vincenzo Eduardo Padulano
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved: