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;
64 std::map<std::string, std::string> cacheOfHeaders;
65 bool isValid(
long ts) {
return ts < endvalidity && ts >= startvalidity; }
66 bool isCacheValid(
long ts)
68 LOGP(
debug,
"isCacheValid : {} : {} : {} --> {}", cacheValidFrom, ts,
cacheValidUntil, isValid(ts));
73 noCleanupPtr =
nullptr;
78 cacheOfHeaders.clear();
83 using MD = std::map<std::string, std::string>;
108 template <
typename T>
109 T*
getForTimeStamp(std::string
const&
path,
long timestamp, std::map<std::string, std::string>* headers =
nullptr);
112 template <
typename T>
113 T*
getForRun(std::string
const&
path,
int runNumber,
bool setRunMetadata =
false);
116 template <
typename T>
117 T*
getSpecific(std::string
const&
path,
long timestamp = -1,
MD metaData =
MD(), std::map<std::string, std::string>* headers =
nullptr)
120 mMetaData = metaData;
121 auto obj = getForTimeStamp<T>(
path, timestamp, headers);
126 template <
typename T>
133 template <
typename T>
136 return getForTimeStamp<T>(
path, mTimestamp);
168 return (mCheckObjValidityEnabled && mCache[
path].
isValid(timestamp)) || mCache[
path].isCacheValid(timestamp);
205 std::pair<int64_t, int64_t>
getRunDuration(
int runnumber,
bool fatal =
true);
212 void report(
bool longrep =
false);
218 void reportFatal(std::string_view s);
221 std::unordered_map<std::string, CachedObject> mCache;
225 bool mCanDefault =
false;
226 bool mCachingEnabled =
true;
227 bool mCheckObjValidityEnabled =
false;
228 bool mFatalWhenNull =
true;
229 long mCreatedNotAfter = 0;
230 long mCreatedNotBefore = 0;
232 size_t mFetchedSize = 0;
233 size_t mRequestedSize = 0;
238 ClassDefNV(CCDBManagerInstance, 1);
247 auto start = std::chrono::system_clock::now();
253 if (mFatalWhenNull) {
254 reportFatal(std::string(
"Got nullptr from CCDB for path ") +
path + std::string(
" and timestamp ") +
std::to_string(timestamp));
259 auto sh = mHeaders.find(
"fileSize");
260 if (sh != mHeaders.end()) {
261 size_t s = atol(sh->second.c_str());
271 auto& cached = mCache[
path];
273 if ((!
isOnline() && cached.isCacheValid(timestamp)) || (mCheckObjValidityEnabled && cached.isValid(timestamp))) {
276 *headers = cached.cacheOfHeaders;
278 mRequestedSize += cached.size;
279 return reinterpret_cast<T*
>(cached.noCleanupPtr ? cached.noCleanupPtr : cached.objPtr.get());
285 for (
auto const&
h : mHeaders) {
286 cached.cacheOfHeaders[
h.first] =
h.second;
290 *headers = cached.cacheOfHeaders;
296 if constexpr (std::is_same<TGeoManager, T>::value || std::is_base_of<o2::conf::ConfigurableParam, T>::value) {
298 cached.noCleanupPtr =
ptr;
300 cached.objPtr.reset(
ptr);
302 cached.uuid = mHeaders[
"ETag"];
305 if (mHeaders.find(
"Valid-From") != mHeaders.end()) {
306 cached.startvalidity = std::stol(mHeaders[
"Valid-From"]);
310 cached.startvalidity = 0;
312 if (mHeaders.find(
"Valid-Until") != mHeaders.end()) {
313 cached.endvalidity = std::stol(mHeaders[
"Valid-Until"]);
315 cached.endvalidity = std::numeric_limits<long>::max();
317 cached.cacheValidFrom = timestamp;
318 }
catch (std::exception
const& e) {
319 reportFatal(
"Failed to read validity from CCDB response (Valid-From : " + mHeaders[
"Valid-From"] + std::string(
" Valid-Until: ") + mHeaders[
"Valid-Until"] + std::string(
")"));
321 auto sh = mHeaders.find(
"fileSize");
322 if (sh != mHeaders.end()) {
323 size_t s = atol(sh->second.c_str());
327 cached.minSize = std::min(s, cached.minSize);
328 cached.maxSize = std::max(s, cached.minSize);
330 }
else if (mHeaders.count(
"Error")) {
335 ptr =
reinterpret_cast<T*
>(cached.noCleanupPtr ? cached.noCleanupPtr : cached.objPtr.get());
336 if (mHeaders.find(
"Cache-Valid-Until") != mHeaders.end()) {
337 cached.cacheValidUntil = std::stol(mHeaders[
"Cache-Valid-Until"]);
339 cached.cacheValidUntil = -1;
343 if (mFatalWhenNull) {
344 reportFatal(std::string(
"Got nullptr from CCDB for path ") +
path + std::string(
" and timestamp ") +
std::to_string(timestamp));
349 auto end = std::chrono::system_clock::now();
350 mTimerMS += std::chrono::duration_cast<std::chrono::milliseconds>(
end -
start).count();
367 mMetaData = metaData;
368 return getSpecificForRun<T>(
path, runNumber, metaData);
375 if (
start < 0 || stop < 0) {
376 if (mFatalWhenNull) {
377 reportFatal(std::string(
"Failed to get run duration for run ") +
std::to_string(runNumber) + std::string(
" from CCDB"));
381 return getSpecific<T>(
path,
start / 2 + stop / 2, metaData);
398 const char* t = getenv(
"ALICEO2_CCDB_CONDITION_NOT_AFTER");
400 auto timeaslong = strtol(t,
nullptr, 10);
401 if (timeaslong != 0L) {
402 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"
@ CCDB_CACHE_FETCHED_BYTES
@ CCDB_CACHE_REQUESTED_BYTES
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"