15#ifndef O2_BASICCDBMANAGER_H
16#define O2_BASICCDBMANAGER_H
26#include <unordered_map>
48 std::shared_ptr<void> objPtr;
49 void* noCleanupPtr =
nullptr;
51 long startvalidity = 0;
52 long endvalidity = -1;
53 long cacheValidFrom = 0;
54 long cacheValidUntil = -1;
55 size_t minSize = -1ULL;
60 bool isValid(
long ts) {
return ts < endvalidity && ts >= startvalidity; }
61 bool isCacheValid(
long ts)
63 LOGP(
debug,
"isCacheValid : {} : {} : {} --> {}", cacheValidFrom, ts, cacheValidUntil, ts < cacheValidUntil && ts >= cacheValidFrom);
64 return ts < cacheValidUntil && ts >= cacheValidFrom;
68 noCleanupPtr =
nullptr;
77 using MD = std::map<std::string, std::string>;
85 void setURL(
const std::string& url);
96 std::string
const&
getURL()
const {
return mCCDBAccessor.
getURL(); }
102 template <
typename T>
106 template <
typename T>
107 T*
getForRun(std::string
const&
path,
int runNumber,
bool setRunMetadata =
false);
110 template <
typename T>
114 mMetaData = metaData;
115 return getForTimeStamp<T>(
path, timestamp);
119 template <
typename T>
126 template <
typename T>
129 return getForTimeStamp<T>(
path, mTimestamp);
158 return (mCheckObjValidityEnabled && mCache[
path].isValid(timestamp)) || mCache[
path].isCacheValid(timestamp);
195 std::pair<int64_t, int64_t>
getRunDuration(
int runnumber,
bool fatal =
true);
202 void report(
bool longrep =
false);
208 void reportFatal(std::string_view s);
211 std::unordered_map<std::string, CachedObject> mCache;
215 bool mCanDefault =
false;
216 bool mCachingEnabled =
true;
217 bool mCheckObjValidityEnabled =
false;
218 bool mFatalWhenNull =
true;
219 long mCreatedNotAfter = 0;
220 long mCreatedNotBefore = 0;
222 size_t mFetchedSize = 0;
227 ClassDefNV(CCDBManagerInstance, 1);
235 auto start = std::chrono::system_clock::now();
241 if (mFatalWhenNull) {
242 reportFatal(std::string(
"Got nullptr from CCDB for path ") +
path + std::string(
" and timestamp ") +
std::to_string(timestamp));
247 auto sh = mHeaders.find(
"fileSize");
248 if (sh != mHeaders.end()) {
249 size_t s = atol(sh->second.c_str());
254 auto& cached = mCache[
path];
256 if ((!
isOnline() && cached.isCacheValid(timestamp)) || (mCheckObjValidityEnabled && cached.isValid(timestamp))) {
257 return reinterpret_cast<T*
>(cached.noCleanupPtr ? cached.noCleanupPtr : cached.objPtr.get());
265 if constexpr (std::is_same<TGeoManager, T>::value || std::is_base_of<o2::conf::ConfigurableParam, T>::value) {
267 cached.noCleanupPtr =
ptr;
269 cached.objPtr.reset(
ptr);
271 cached.uuid = mHeaders[
"ETag"];
274 if (mHeaders.find(
"Valid-From") != mHeaders.end()) {
275 cached.startvalidity = std::stol(mHeaders[
"Valid-From"]);
279 cached.startvalidity = 0;
281 if (mHeaders.find(
"Valid-Until") != mHeaders.end()) {
282 cached.endvalidity = std::stol(mHeaders[
"Valid-Until"]);
284 cached.endvalidity = std::numeric_limits<long>::max();
286 cached.cacheValidFrom = timestamp;
287 }
catch (std::exception
const& e) {
288 reportFatal(
"Failed to read validity from CCDB response (Valid-From : " + mHeaders[
"Valid-From"] + std::string(
" Valid-Until: ") + mHeaders[
"Valid-Until"] + std::string(
")"));
290 auto sh = mHeaders.find(
"fileSize");
291 if (sh != mHeaders.end()) {
292 size_t s = atol(sh->second.c_str());
294 cached.minSize = std::min(s, cached.minSize);
295 cached.maxSize = std::max(s, cached.minSize);
297 }
else if (mHeaders.count(
"Error")) {
302 ptr =
reinterpret_cast<T*
>(cached.noCleanupPtr ? cached.noCleanupPtr : cached.objPtr.get());
303 if (mHeaders.find(
"Cache-Valid-Until") != mHeaders.end()) {
304 cached.cacheValidUntil = std::stol(mHeaders[
"Cache-Valid-Until"]);
306 cached.cacheValidUntil = -1;
311 if (mFatalWhenNull) {
312 reportFatal(std::string(
"Got nullptr from CCDB for path ") +
path + std::string(
" and timestamp ") +
std::to_string(timestamp));
317 auto end = std::chrono::system_clock::now();
318 mTimerMS += std::chrono::duration_cast<std::chrono::milliseconds>(
end -
start).count();
326 mMetaData = metaData;
327 return getSpecificForRun<T>(
path, runNumber, metaData);
334 if (
start < 0 || stop < 0) {
335 if (mFatalWhenNull) {
336 reportFatal(std::string(
"Failed to get run duration for run ") +
std::to_string(runNumber));
340 return getSpecific<T>(
path,
start / 2 + stop / 2, metaData);
357 const char* t = getenv(
"ALICEO2_CCDB_CONDITION_NOT_AFTER");
359 auto timeaslong = strtol(t,
nullptr, 10);
360 if (timeaslong != 0L) {
361 LOG(info) <<
"CCDB Time-machine constrained detected. Setting condition-not-after constrained to timestamp " << timeaslong;
Definition of the Names Generator class.
static std::string getCCDBServer()
static BasicCCDBManager & instance()
long getTimestamp() const
query timestamp
CCDBManagerInstance(std::string const &path)
void report(bool longrep=false)
T * getForTimeStamp(std::string const &path, long timestamp)
retrieve an object of type T from CCDB as stored under path and timestamp
T * getSpecificForRun(std::string const &path, int runNumber, MD metaData=MD())
retrieve an object of type T from CCDB as stored under path and using the timestamp in the middle of ...
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
T * getSpecific(std::string const &path, long timestamp=-1, MD metaData=MD())
retrieve an object of type T from CCDB as stored under path, timestamp and metaData
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
void setURL(const std::string &url)
set a URL to query from
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
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
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)
static DeploymentMode deploymentMode()
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"