Project
Loading...
Searching...
No Matches
DataInputDirector.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11#ifndef O2_FRAMEWORK_DATAINPUTDIRECTOR_H_
12#define O2_FRAMEWORK_DATAINPUTDIRECTOR_H_
13
14#include "TFile.h"
15
19
20#include <arrow/filesystem/filesystem.h>
21#include <arrow/dataset/dataset.h>
22
23#include <regex>
24#include <stdexcept>
25#include <vector>
26#include "rapidjson/fwd.h"
27
29{
30class Monitoring;
31}
32
33namespace o2::framework
34{
35
36class AODReadError : public std::runtime_error
37{
38 public:
39 enum class Kind {
40 InvalidTimeframe, // skip the timeframe
41 FileOpen, // skip the file, its timeframes are unknown
42 };
43
44 AODReadError(Kind kind, std::string const& what) : std::runtime_error(what), mKind(kind) {}
45 Kind getKind() const { return mKind; }
46
47 private:
48 Kind mKind;
49};
50
52 std::string fileName;
54 std::vector<uint64_t> listOfTimeFrameNumbers;
55 std::vector<bool> alreadyRead;
56 uint64_t invalidReadSkipped = 0;
57};
58
59FileNameHolder makeFileNameHolder(std::string fileName);
60
62 o2::monitoring::Monitoring* monitoring = nullptr;
64 std::string parentFileReplacement = "";
65 std::vector<std::pair<std::string, int>> parentLevelToOrigin = {};
66 // Optional registry of pre-opened TFiles (keyed by name) used to bypass
67 // TFile::Open for testing with in-memory TMemFile instances.
68 std::vector<std::pair<std::string, TFile*>> openFiles = {};
69
70 int levelForOrigin(std::string_view origin) const
71 {
72 for (auto& [o, level] : parentLevelToOrigin) {
73 if (o == origin) {
74 return level;
75 }
76 }
77 return -1;
78 }
79};
80
82{
86
87 public:
88 std::string tablename = "";
89 std::string treename = "";
90 std::shared_ptr<data_matcher::DataDescriptorMatcher> matcher;
91
92 DataInputDescriptor(bool alienSupport, int level, DataInputDirectorContext& context);
94
95 void printOut() const;
96
97 // setters
98 void setInputfilesFile(std::string dffn) { minputfilesFile = dffn; }
99 void setInputfilesFile(std::string* dffnptr) { minputfilesFilePtr = dffnptr; }
100 void setFilenamesRegex(std::string fn) { mFilenameRegex = fn; }
101 void setFilenamesRegex(std::string* fnptr) { mFilenameRegexPtr = fnptr; }
102
103 void setDefaultInputfiles(std::vector<FileNameHolder> difnptr) { mdefaultFilenamesPtr = difnptr; }
104
106 int fillInputfiles();
107 bool setFile(int counter, int wantedParentLevel, std::string_view wantedOrigin);
108
109 // getters
110 std::string getInputfilesFilename() const;
111 std::string getFilenamesRegexString() const;
112 std::regex getFilenamesRegex();
113 int getNumberInputfiles() { return mfilenames.size(); }
114 int getNumberTimeFrames() const { return mtotalNumberTimeFrames; }
115 int findDFNumber(int file, std::string dfName);
116
117 uint64_t getTimeFrameNumber(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin);
118 arrow::dataset::FileSource getFileFolder(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin);
119 // Start tracking the file/DF pairs participating in one output timeframe.
120 void beginTimeFrame();
121 // Commit or discard a timeframe, then close retained parents and report statistics.
122 void finishTimeFrame(bool skipped = false);
123 // Open the current file to populate the parent map, then return the parent descriptor and
124 // the TF index within it that corresponds to numTF at this level. Returns {nullptr, -1} on failure.
125 std::pair<std::shared_ptr<DataInputDescriptor>, int> navigateToLevel(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin);
126 std::shared_ptr<DataInputDescriptor> getParentFile(int counter, int numTF, std::string treename, int wantedParentLevel, std::string_view wantedOrigin);
129
130 bool readTree(DataAllocator& outputs, header::DataHeader dh, int counter, int numTF, std::string treename, size_t& totalSizeCompressed, size_t& totalSizeUncompressed);
131
132 void printFileOpening();
133 void printFileStatistics();
134 void closeInputFile();
135 bool isAlienSupportOn() { return mAlienSupport; }
136
137 private:
138 void recordTimeFrameRead(int counter, int numTF);
139 void releaseParentFile();
140 void reportFileStatistics(int counter, std::string monitoringInfo);
141
143 std::string minputfilesFile;
144 std::string* minputfilesFilePtr = nullptr;
145 std::string mFilenameRegex;
146 std::string* mFilenameRegexPtr = nullptr;
147 std::vector<FileNameHolder> mfilenames;
148 std::vector<FileNameHolder> mdefaultFilenamesPtr;
149 std::shared_ptr<arrow::fs::FileSystem> mCurrentFilesystem;
150 int mCurrentFileID = -1;
151 // File-local DF indices visited during the current output timeframe.
152 std::vector<std::pair<int, int>> mTimeFrameReads;
153 bool mAlienSupport = false;
154
155 DataInputDirectorContext& mContext;
156 TMap* mParentFileMap = nullptr;
157 std::shared_ptr<DataInputDescriptor> mParentFile = nullptr;
158 std::vector<std::shared_ptr<DataInputDescriptor>> mRetainedParents;
159 bool mTimeFrameActive = false;
160 std::vector<std::pair<int, std::string>> mPendingFileStatistics;
161 int mLevel = 0; // level of parent files
162
163 int mtotalNumberTimeFrames = 0;
164
165 uint64_t mIOTime = 0;
166 uint64_t mCurrentFileStartedAt = 0;
167};
168
170{
174
175 public:
176 DataInputDirector(std::vector<std::string> inputFiles, DataInputDirectorContext&& context);
178
179 void reset();
180 void printOut();
181 bool atEnd(int counter);
182
183 // setters
184 void setInputfilesFile(std::string iffn) { minputfilesFile = iffn; }
185 void setFilenamesRegex(std::string dfn) { mFilenameRegex = dfn; }
186 bool readJson(std::string const& fnjson);
187 void closeInputFiles();
188
189 // getters
191 int getNumberInputDescriptors() { return mdataInputDescriptors.size(); }
193
194 bool readTree(DataAllocator& outputs, header::DataHeader dh, int counter, int numTF, size_t& totalSizeCompressed, size_t& totalSizeUncompressed, bool wasAOD);
195 uint64_t getTimeFrameNumber(header::DataHeader dh, int counter, int numTF);
196 arrow::dataset::FileSource getFileFolder(header::DataHeader dh, int counter, int numTF);
197 // Start tracking the file/DF pairs participating in one output timeframe.
198 void beginTimeFrame();
199 // Commit or discard a timeframe, then close retained parents and report statistics.
200 void finishTimeFrame(bool skipped = false);
202
205
207
208 private:
210 std::string minputfilesFile;
211 std::string* const minputfilesFilePtr = &minputfilesFile;
212 std::string mFilenameRegex;
213 std::string* const mFilenameRegexPtr = &mFilenameRegex;
214 std::shared_ptr<DataInputDescriptor> mdefaultDataInputDescriptor = nullptr;
215 std::vector<FileNameHolder> mdefaultInputFiles;
216 std::vector<DataInputDescriptor> mdataInputDescriptors;
217
218 bool mDebugMode = false;
219 bool mAlienSupport = false;
220
221 bool readJsonDocument(rapidjson::Document* doc);
222 bool isValid();
223};
224
225} // namespace o2::framework
226
227#endif // O2_FRAMEWORK_DATAINPUTDIRECTOR_H_
header::DataOrigin origin
o2::monitoring::Monitoring Monitoring
AODReadError(Kind kind, std::string const &what)
uint64_t getTimeFrameNumber(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin)
std::shared_ptr< DataInputDescriptor > getParentFile(int counter, int numTF, std::string treename, int wantedParentLevel, std::string_view wantedOrigin)
bool readTree(DataAllocator &outputs, header::DataHeader dh, int counter, int numTF, std::string treename, size_t &totalSizeCompressed, size_t &totalSizeUncompressed)
arrow::dataset::FileSource getFileFolder(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin)
void setDefaultInputfiles(std::vector< FileNameHolder > difnptr)
std::shared_ptr< data_matcher::DataDescriptorMatcher > matcher
void setInputfilesFile(std::string dffn)
void setInputfilesFile(std::string *dffnptr)
void setFilenamesRegex(std::string *fnptr)
void addFileNameHolder(FileNameHolder fn)
void finishTimeFrame(bool skipped=false)
bool setFile(int counter, int wantedParentLevel, std::string_view wantedOrigin)
int findDFNumber(int file, std::string dfName)
DataInputDescriptor(DataInputDescriptor const &)=default
std::pair< std::shared_ptr< DataInputDescriptor >, int > navigateToLevel(int counter, int numTF, int wantedParentLevel, std::string_view wantedOrigin)
DataInputDescriptor * getDataInputDescriptor(header::DataHeader dh)
arrow::dataset::FileSource getFileFolder(header::DataHeader dh, int counter, int numTF)
void setInputfilesFile(std::string iffn)
int getTimeFramesInFile(header::DataHeader dh, int counter)
uint64_t getTimeFrameNumber(header::DataHeader dh, int counter, int numTF)
int getLevelForOrigin(header::DataOrigin origin) const
void setFilenamesRegex(std::string dfn)
void finishTimeFrame(bool skipped=false)
bool readJson(std::string const &fnjson)
bool readTree(DataAllocator &outputs, header::DataHeader dh, int counter, int numTF, size_t &totalSizeCompressed, size_t &totalSizeUncompressed, bool wasAOD)
GLint level
Definition glcorearb.h:275
GLuint counter
Definition glcorearb.h:3987
Defining ITS Vertex explicitly as messageable.
Definition Cartesian.h:288
RuntimeErrorRef runtime_error(const char *)
FileNameHolder makeFileNameHolder(std::string fileName)
o2::monitoring::Monitoring * monitoring
std::vector< std::pair< std::string, int > > parentLevelToOrigin
std::vector< std::pair< std::string, TFile * > > openFiles
int levelForOrigin(std::string_view origin) const
std::vector< uint64_t > listOfTimeFrameNumbers
the main header struct
Definition DataHeader.h:623