15#ifndef O2_BASICCDBMANAGER_H
16#define O2_BASICCDBMANAGER_H
29#include <unordered_map>
51 std::shared_ptr<void> objPtr;
52 void* noCleanupPtr =
nullptr;
54 long startvalidity = 0;
55 long endvalidity = -1;
56 long cacheValidFrom = 0;
63 std::map<std::string, std::string> cacheOfHeaders;
64 bool isValid(
long ts) {
return ts < endvalidity && ts >= startvalidity; }
65 bool isCacheValid(
long ts)
67 LOGP(
debug,
"isCacheValid : {} : {} : {} --> {}", cacheValidFrom, ts,
cacheValidUntil, ts < cacheValidUntil && ts >= cacheValidFrom);
68 return ts < cacheValidUntil && ts >= cacheValidFrom;
72 noCleanupPtr =
nullptr;
77 cacheOfHeaders.clear();
82 using MD = std::map<std::string, std::string>;
107 template <
typename T>
108 T*
getForTimeStamp(std::string
const&
path,
long timestamp, std::map<std::string, std::string>* headers =
nullptr);
111 template <
typename T>
112 T*
getForRun(std::string
const&
path,
int runNumber,
bool setRunMetadata =
false);
115 template <
typename T>
116 T*
getSpecific(std::string
const&
path,
long timestamp = -1,
MD metaData =
MD(), std::map<std::string, std::string>* headers =
nullptr)
119 mMetaData = metaData;
120 auto obj = getForTimeStamp<T>(
path, timestamp, headers);
125 template <
typename T>
132 template <
typename T>
135 return getForTimeStamp<T>(
path, mTimestamp);
167 return (mCheckObjValidityEnabled && mCache[
path].
isValid(timestamp)) || mCache[
path].isCacheValid(timestamp);
204 std::pair<int64_t, int64_t>
getRunDuration(
int runnumber,
bool fatal =
true);
211 void report(
bool longrep =
false);
217 void reportFatal(std::string_view s);
220 std::unordered_map<std::string, CachedObject> mCache;
224 bool mCanDefault =
false;
225 bool mCachingEnabled =
true;
226 bool mCheckObjValidityEnabled =
false;
227 bool mFatalWhenNull =
true;
228 long mCreatedNotAfter = 0;
229 long mCreatedNotBefore = 0;
231 size_t mFetchedSize = 0;
236 ClassDefNV(CCDBManagerInstance, 1);
245 auto start = std::chrono::system_clock::now();
251 if (mFatalWhenNull) {
252 reportFatal(std::string(
"Got nullptr from CCDB for path ") +
path + std::string(
" and timestamp ") +
std::to_string(timestamp));
257 auto sh = mHeaders.find(
"fileSize");
258 if (sh != mHeaders.end()) {
259 size_t s = atol(sh->second.c_str());
268 auto& cached = mCache[
path];
270 if ((!
isOnline() && cached.isCacheValid(timestamp)) || (mCheckObjValidityEnabled && cached.isValid(timestamp))) {
273 *headers = cached.cacheOfHeaders;
275 return reinterpret_cast<T*
>(cached.noCleanupPtr ? cached.noCleanupPtr : cached.objPtr.get());
281 for (
auto const&
h : mHeaders) {
282 cached.cacheOfHeaders[
h.first] =
h.second;
286 *headers = cached.cacheOfHeaders;
292 if constexpr (std::is_same<TGeoManager, T>::value || std::is_base_of<o2::conf::ConfigurableParam, T>::value) {
294 cached.noCleanupPtr =
ptr;
296 cached.objPtr.reset(
ptr);
298 cached.uuid = mHeaders[
"ETag"];
301 if (mHeaders.find(
"Valid-From") != mHeaders.end()) {
302 cached.startvalidity = std::stol(mHeaders[
"Valid-From"]);
306 cached.startvalidity = 0;
308 if (mHeaders.find(
"Valid-Until") != mHeaders.end()) {
309 cached.endvalidity = std::stol(mHeaders[
"Valid-Until"]);
311 cached.endvalidity = std::numeric_limits<long>::max();
313 cached.cacheValidFrom = timestamp;
314 }
catch (std::exception
const& e) {
315 reportFatal(
"Failed to read validity from CCDB response (Valid-From : " + mHeaders[
"Valid-From"] + std::string(
" Valid-Until: ") + mHeaders[
"Valid-Until"] + std::string(
")"));
317 auto sh = mHeaders.find(
"fileSize");
318 if (sh != mHeaders.end()) {
319 size_t s = atol(sh->second.c_str());
321 cached.minSize = std::min(s, cached.minSize);
322 cached.maxSize = std::max(s, cached.minSize);
324 }
else if (mHeaders.count(
"Error")) {
329 ptr =
reinterpret_cast<T*
>(cached.noCleanupPtr ? cached.noCleanupPtr : cached.objPtr.get());
330 if (mHeaders.find(
"Cache-Valid-Until") != mHeaders.end()) {
331 cached.cacheValidUntil = std::stol(mHeaders[
"Cache-Valid-Until"]);
333 cached.cacheValidUntil = -1;
337 if (mFatalWhenNull) {
338 reportFatal(std::string(
"Got nullptr from CCDB for path ") +
path + std::string(
" and timestamp ") +
std::to_string(timestamp));
343 auto end = std::chrono::system_clock::now();
344 mTimerMS += std::chrono::duration_cast<std::chrono::milliseconds>(
end -
start).count();
359 mMetaData = metaData;
360 return getSpecificForRun<T>(
path, runNumber, metaData);
367 if (
start < 0 || stop < 0) {
368 if (mFatalWhenNull) {
369 reportFatal(std::string(
"Failed to get run duration for run ") +
std::to_string(runNumber) + std::string(
" from CCDB"));
373 return getSpecific<T>(
path,
start / 2 + stop / 2, metaData);
390 const char* t = getenv(
"ALICEO2_CCDB_CONDITION_NOT_AFTER");
392 auto timeaslong = strtol(t,
nullptr, 10);
393 if (timeaslong != 0L) {
394 LOG(info) <<
"CCDB Time-machine constrained detected. Setting condition-not-after constrained to timestamp " << timeaslong;
Definition of the Names Generator class.
Class for time synchronization of RawReader instances.
static std::string getCCDBServer()
static BasicCCDBManager & instance()
T * getSpecificForRun(std::string const &path, int runNumber, MD const &metaData=MD())
retrieve an object of type T from CCDB as stored under path and using the timestamp in the middle of ...
long getTimestamp() const
query timestamp
CCDBManagerInstance(std::string const &path)
void report(bool longrep=false)
void resetCreatedNotBefore()
reset the object upper validity limit
void setCaching(bool v)
disable or enable caching
void clearCache()
clear all entries in the cache
void setTimestamp(long t)
set timestamp cache for all queries
bool isCachedObjectValid(std::string const &path, long timestamp)
Check if an object in cache is valid.
bool isCachingEnabled() const
check if caching is enabled
void setCreatedNotBefore(long v)
set the object upper validity limit
bool isHostReachable() const
void setCreatedNotAfter(long v)
set the object upper validity limit
void resetCreatedNotAfter()
reset the object upper validity limit
size_t getFetchedSize() const
void setLocalObjectValidityChecking(bool v=true)
set the flag to check object validity before CCDB query
bool isOnline() const
detect online processing modes (i.e. CCDB objects may be updated in the lifetime of the manager)
std::map< std::string, std::string > MD
std::pair< int64_t, int64_t > getRunDuration(int runnumber, bool fatal=true)
std::string getSummaryString() const
T * getForRun(std::string const &path, int runNumber, bool setRunMetadata=false)
retrieve an object of type T from CCDB as stored under path and using the timestamp in the middle of ...
long getCreatedNotAfter() const
get the object upper validity limit
bool getFatalWhenNull() const
get the fatalWhenNull state
static std::pair< int64_t, int64_t > getRunDuration(const MD &headers)
std::string const & getURL() const
query current URL
CcdbApi & getCCDBAccessor()
void setURL(const std::string &url)
set a URL to query from
T * getSpecific(std::string const &path, long timestamp=-1, MD metaData=MD(), std::map< std::string, std::string > *headers=nullptr)
retrieve an object of type T from CCDB as stored under path, timestamp and metaData
void clearCache(std::string const &path)
clear particular entry in the cache
T * get(std::string const &path)
retrieve an object of type T from CCDB as stored under path; will use the timestamp member
T * getForTimeStamp(std::string const &path, long timestamp, std::map< std::string, std::string > *headers=nullptr)
retrieve an object of type T from CCDB as stored under path and timestamp. Optional to get the header...
void setFatalWhenNull(bool b)
set the fatal property (when false; nullptr object responses will not abort)
long getCreatedNotBefore() const
get the object upper validity limit
bool isLocalObjectValidityCheckingEnabled() const
check if checks of object validity before CCDB query is enabled
void init(std::string const &hosts)
std::string const & getURL() const
bool isHostReachable() const
std::enable_if<!std::is_base_of< o2::conf::ConfigurableParam, T >::value, T * >::type retrieveFromTFileAny(std::string const &path, std::map< std::string, std::string > const &metadata, long timestamp=-1, std::map< std::string, std::string > *headers=nullptr, std::string const &etag="", const std::string &createdNotAfter="", const std::string &createdNotBefore="") const
static ServiceRegistryRef * globalDeviceRef(ServiceRegistryRef *ref=nullptr)
GLboolean GLboolean GLboolean b
GLsizei const GLchar *const * path
information complementary to a CCDB object (path, metadata, startTimeValidity, endTimeValidity etc)
long getCurrentTimestamp()
returns the timestamp in long corresponding to "now"
std::string to_string(gsl::span< T, Size > span)
bool isValid(std::string alias)
Helper struct to hold statistics about the data processing happening.
static DeploymentMode deploymentMode()
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"