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>
111 T*
getSpecific(std::string
const&
path,
long timestamp = -1,
MD metaData =
MD(), std::map<std::string, std::string>* headers =
nullptr)
114 mMetaData = metaData;
115 auto obj = getForTimeStamp<T>(
path, timestamp);
123 template <
typename T>
130 template <
typename T>
133 return getForTimeStamp<T>(
path, mTimestamp);
165 return (mCheckObjValidityEnabled && mCache[
path].
isValid(timestamp)) || mCache[
path].isCacheValid(timestamp);
202 std::pair<int64_t, int64_t>
getRunDuration(
int runnumber,
bool fatal =
true);
209 void report(
bool longrep =
false);
215 void reportFatal(std::string_view s);
218 std::unordered_map<std::string, CachedObject> mCache;
222 bool mCanDefault =
false;
223 bool mCachingEnabled =
true;
224 bool mCheckObjValidityEnabled =
false;
225 bool mFatalWhenNull =
true;
226 long mCreatedNotAfter = 0;
227 long mCreatedNotBefore = 0;
229 size_t mFetchedSize = 0;
234 ClassDefNV(CCDBManagerInstance, 1);
243 auto start = std::chrono::system_clock::now();
249 if (mFatalWhenNull) {
250 reportFatal(std::string(
"Got nullptr from CCDB for path ") +
path + std::string(
" and timestamp ") +
std::to_string(timestamp));
255 auto sh = mHeaders.find(
"fileSize");
256 if (sh != mHeaders.end()) {
257 size_t s = atol(sh->second.c_str());
262 auto& cached = mCache[
path];
264 if ((!
isOnline() && cached.isCacheValid(timestamp)) || (mCheckObjValidityEnabled && cached.isValid(timestamp))) {
265 return reinterpret_cast<T*
>(cached.noCleanupPtr ? cached.noCleanupPtr : cached.objPtr.get());
273 if constexpr (std::is_same<TGeoManager, T>::value || std::is_base_of<o2::conf::ConfigurableParam, T>::value) {
275 cached.noCleanupPtr =
ptr;
277 cached.objPtr.reset(
ptr);
279 cached.uuid = mHeaders[
"ETag"];
282 if (mHeaders.find(
"Valid-From") != mHeaders.end()) {
283 cached.startvalidity = std::stol(mHeaders[
"Valid-From"]);
287 cached.startvalidity = 0;
289 if (mHeaders.find(
"Valid-Until") != mHeaders.end()) {
290 cached.endvalidity = std::stol(mHeaders[
"Valid-Until"]);
292 cached.endvalidity = std::numeric_limits<long>::max();
294 cached.cacheValidFrom = timestamp;
295 }
catch (std::exception
const& e) {
296 reportFatal(
"Failed to read validity from CCDB response (Valid-From : " + mHeaders[
"Valid-From"] + std::string(
" Valid-Until: ") + mHeaders[
"Valid-Until"] + std::string(
")"));
298 auto sh = mHeaders.find(
"fileSize");
299 if (sh != mHeaders.end()) {
300 size_t s = atol(sh->second.c_str());
302 cached.minSize = std::min(s, cached.minSize);
303 cached.maxSize = std::max(s, cached.minSize);
305 }
else if (mHeaders.count(
"Error")) {
310 ptr =
reinterpret_cast<T*
>(cached.noCleanupPtr ? cached.noCleanupPtr : cached.objPtr.get());
311 if (mHeaders.find(
"Cache-Valid-Until") != mHeaders.end()) {
312 cached.cacheValidUntil = std::stol(mHeaders[
"Cache-Valid-Until"]);
314 cached.cacheValidUntil = -1;
318 if (mFatalWhenNull) {
319 reportFatal(std::string(
"Got nullptr from CCDB for path ") +
path + std::string(
" and timestamp ") +
std::to_string(timestamp));
324 auto end = std::chrono::system_clock::now();
325 mTimerMS += std::chrono::duration_cast<std::chrono::milliseconds>(
end -
start).count();
333 mMetaData = metaData;
334 return getSpecificForRun<T>(
path, runNumber, metaData);
341 if (
start < 0 || stop < 0) {
342 if (mFatalWhenNull) {
343 reportFatal(std::string(
"Failed to get run duration for run ") +
std::to_string(runNumber) + std::string(
" from CCDB"));
347 return getSpecific<T>(
path,
start / 2 + stop / 2, metaData);
364 const char* t = getenv(
"ALICEO2_CCDB_CONDITION_NOT_AFTER");
366 auto timeaslong = strtol(t,
nullptr, 10);
367 if (timeaslong != 0L) {
368 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()
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)
T * getForTimeStamp(std::string const &path, long timestamp)
retrieve an object of type T from CCDB as stored under path and timestamp
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
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)
bool isValid(std::string alias)
static DeploymentMode deploymentMode()
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"