Skip to content

Commit 8005d7a

Browse files
authored
Add parameter to limit the size of the objects sent to the ccdb ([QC-670]) #8013
1 parent 58307e6 commit 8005d7a

File tree

3 files changed

+67
-25
lines changed

3 files changed

+67
-25
lines changed

CCDB/include/CCDB/CcdbApi.h

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,13 @@ class CcdbApi //: public DatabaseInterface
115115
* @param metadata Key-values representing the metadata for this object.
116116
* @param startValidityTimestamp Start of validity. If omitted, current timestamp is used.
117117
* @param endValidityTimestamp End of validity. If omitted, current timestamp + 1 day is used.
118+
* @return 0 -> ok,
119+
* positive number -> curl error (https://curl.se/libcurl/c/libcurl-errors.html),
120+
* -1 : object bigger than maxSize,
121+
* -2 : curl initialization error
118122
*/
119-
void storeAsTFile(const TObject* rootObject, std::string const& path, std::map<std::string, std::string> const& metadata,
120-
long startValidityTimestamp = -1, long endValidityTimestamp = -1) const;
123+
int storeAsTFile(const TObject* rootObject, std::string const& path, std::map<std::string, std::string> const& metadata,
124+
long startValidityTimestamp = -1, long endValidityTimestamp = -1, std::vector<char>::size_type maxSize = 0 /*bytes*/) const;
121125

122126
/**
123127
* Store into the CCDB a TFile containing an object of type T (which needs to have a ROOT dictionary)
@@ -127,19 +131,23 @@ class CcdbApi //: public DatabaseInterface
127131
* @param metadata Key-values representing the metadata for this object.
128132
* @param startValidityTimestamp Start of validity. If omitted, current timestamp is used.
129133
* @param endValidityTimestamp End of validity. If omitted, current timestamp + 1 day is used.
134+
* @return 0 -> ok,
135+
* positive number -> curl error (https://curl.se/libcurl/c/libcurl-errors.html),
136+
* -1 : object bigger than maxSize,
137+
* -2 : curl initialization error
130138
*/
131139
template <typename T>
132-
void storeAsTFileAny(const T* obj, std::string const& path, std::map<std::string, std::string> const& metadata,
133-
long startValidityTimestamp = -1, long endValidityTimestamp = -1) const
140+
int storeAsTFileAny(const T* obj, std::string const& path, std::map<std::string, std::string> const& metadata,
141+
long startValidityTimestamp = -1, long endValidityTimestamp = -1, std::vector<char>::size_type maxSize = 0 /*bytes*/) const
134142
{
135-
storeAsTFile_impl(reinterpret_cast<const void*>(obj), typeid(T), path, metadata, startValidityTimestamp, endValidityTimestamp);
143+
return storeAsTFile_impl(reinterpret_cast<const void*>(obj), typeid(T), path, metadata, startValidityTimestamp, endValidityTimestamp, maxSize);
136144
}
137145

138146
// interface for storing TObject via storeAsTFileAny
139-
void storeAsTFileAny(const TObject* rootobj, std::string const& path, std::map<std::string, std::string> const& metadata,
140-
long startValidityTimestamp = -1, long endValidityTimestamp = -1) const
147+
int storeAsTFileAny(const TObject* rootobj, std::string const& path, std::map<std::string, std::string> const& metadata,
148+
long startValidityTimestamp = -1, long endValidityTimestamp = -1, std::vector<char>::size_type maxSize = 0 /*bytes*/) const
141149
{
142-
storeAsTFile(rootobj, path, metadata, startValidityTimestamp, endValidityTimestamp);
150+
return storeAsTFile(rootobj, path, metadata, startValidityTimestamp, endValidityTimestamp, maxSize);
143151
}
144152

145153
/**
@@ -392,19 +400,31 @@ class CcdbApi //: public DatabaseInterface
392400
public:
393401
/**
394402
* A generic method to store a binary buffer (e.g. an image of the TMemFile)
403+
* @return 0 -> ok,
404+
* positive number -> curl error (https://curl.se/libcurl/c/libcurl-errors.html),
405+
* -1 : object bigger than maxSize,
406+
* -2 : curl initialization error
395407
*/
396-
void storeAsBinaryFile(const char* buffer, size_t size, const std::string& fileName, const std::string& objectType,
397-
const std::string& path, const std::map<std::string, std::string>& metadata,
398-
long startValidityTimestamp, long endValidityTimestamp) const;
408+
int storeAsBinaryFile(const char* buffer, size_t size, const std::string& fileName, const std::string& objectType,
409+
const std::string& path, const std::map<std::string, std::string>& metadata,
410+
long startValidityTimestamp, long endValidityTimestamp, std::vector<char>::size_type maxSize = 0 /*in bytes*/) const;
399411

400412
/**
401413
* A generic helper implementation to store an obj whose type is given by a std::type_info
414+
* @return 0 -> ok,
415+
* positive number -> curl error (https://curl.se/libcurl/c/libcurl-errors.html),
416+
* -1 : object bigger than maxSize,
417+
* -2 : curl initialization error
402418
*/
403-
void storeAsTFile_impl(const void* obj1, std::type_info const& info, std::string const& path, std::map<std::string, std::string> const& metadata,
404-
long startValidityTimestamp = -1, long endValidityTimestamp = -1) const;
419+
int storeAsTFile_impl(const void* obj1, std::type_info const& info, std::string const& path, std::map<std::string, std::string> const& metadata,
420+
long startValidityTimestamp = -1, long endValidityTimestamp = -1, std::vector<char>::size_type maxSize = 0 /*in bytes*/) const;
405421

406422
/**
407423
* A generic helper implementation to query obj whose type is given by a std::type_info
424+
* @return 0 -> ok,
425+
* positive number -> curl error (https://curl.se/libcurl/c/libcurl-errors.html),
426+
* -1 : object bigger than maxSize,
427+
* -2 : curl initialization error
408428
*/
409429
void* retrieveFromTFile(std::type_info const&, std::string const& path, std::map<std::string, std::string> const& metadata,
410430
long timestamp = -1, std::map<std::string, std::string>* headers = nullptr, std::string const& etag = "",

CCDB/src/CcdbApi.cxx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,22 +128,25 @@ std::unique_ptr<std::vector<char>> CcdbApi::createObjectImage(const TObject* roo
128128
return o2::utils::MemFileHelper::createFileImage(*rootObject, tmpFileName, CCDBOBJECT_ENTRY);
129129
}
130130

131-
void CcdbApi::storeAsTFile_impl(const void* obj, std::type_info const& tinfo, std::string const& path,
132-
std::map<std::string, std::string> const& metadata,
133-
long startValidityTimestamp, long endValidityTimestamp) const
131+
int CcdbApi::storeAsTFile_impl(const void* obj, std::type_info const& tinfo, std::string const& path,
132+
std::map<std::string, std::string> const& metadata,
133+
long startValidityTimestamp, long endValidityTimestamp,
134+
std::vector<char>::size_type maxSize) const
134135
{
135136
// We need the TClass for this type; will verify if dictionary exists
136137
CcdbObjectInfo info;
137138
auto img = createObjectImage(obj, tinfo, &info);
138-
storeAsBinaryFile(img->data(), img->size(), info.getFileName(), info.getObjectType(),
139-
path, metadata, startValidityTimestamp, endValidityTimestamp);
139+
return storeAsBinaryFile(img->data(), img->size(), info.getFileName(), info.getObjectType(),
140+
path, metadata, startValidityTimestamp, endValidityTimestamp, maxSize);
140141
}
141142

142-
void CcdbApi::storeAsBinaryFile(const char* buffer, size_t size, const std::string& filename, const std::string& objectType,
143-
const std::string& path, const std::map<std::string, std::string>& metadata,
144-
long startValidityTimestamp, long endValidityTimestamp) const
143+
int CcdbApi::storeAsBinaryFile(const char* buffer, size_t size, const std::string& filename, const std::string& objectType,
144+
const std::string& path, const std::map<std::string, std::string>& metadata,
145+
long startValidityTimestamp, long endValidityTimestamp, std::vector<char>::size_type maxSize) const
145146
{
146-
// Store a binary file
147+
if (maxSize > 0 && size > maxSize) {
148+
return -1;
149+
}
147150

148151
// Prepare URL
149152
long sanitizedStartValidityTimestamp = startValidityTimestamp;
@@ -160,6 +163,7 @@ void CcdbApi::storeAsBinaryFile(const char* buffer, size_t size, const std::stri
160163
// Curl preparation
161164
CURL* curl = nullptr;
162165
curl = curl_easy_init();
166+
int returnValue = 0;
163167

164168
if (curl != nullptr) {
165169
struct curl_httppost* formpost = nullptr;
@@ -196,6 +200,7 @@ void CcdbApi::storeAsBinaryFile(const char* buffer, size_t size, const std::stri
196200
if (res != CURLE_OK) {
197201
fprintf(stderr, "curl_easy_perform() failed: %s\n",
198202
curl_easy_strerror(res));
203+
returnValue = res;
199204
}
200205
}
201206

@@ -208,16 +213,18 @@ void CcdbApi::storeAsBinaryFile(const char* buffer, size_t size, const std::stri
208213
curl_slist_free_all(headerlist);
209214
} else {
210215
cerr << "curl initialization failure" << endl;
216+
returnValue = -2;
211217
}
218+
return returnValue;
212219
}
213220

214-
void CcdbApi::storeAsTFile(const TObject* rootObject, std::string const& path, std::map<std::string, std::string> const& metadata,
215-
long startValidityTimestamp, long endValidityTimestamp) const
221+
int CcdbApi::storeAsTFile(const TObject* rootObject, std::string const& path, std::map<std::string, std::string> const& metadata,
222+
long startValidityTimestamp, long endValidityTimestamp, std::vector<char>::size_type maxSize) const
216223
{
217224
// Prepare file
218225
CcdbObjectInfo info;
219226
auto img = createObjectImage(rootObject, &info);
220-
storeAsBinaryFile(img->data(), img->size(), info.getFileName(), info.getObjectType(), path, metadata, startValidityTimestamp, endValidityTimestamp);
227+
return storeAsBinaryFile(img->data(), img->size(), info.getFileName(), info.getObjectType(), path, metadata, startValidityTimestamp, endValidityTimestamp, maxSize);
221228
}
222229

223230
string CcdbApi::getFullUrlForStorage(CURL* curl, const string& path, const string& objtype,

CCDB/test/testCcdbApi.cxx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,21 @@ BOOST_AUTO_TEST_CASE(store_retrieve_TMemFile_templated_test, *utf::precondition(
200200
}
201201
}
202202

203+
BOOST_AUTO_TEST_CASE(store_max_size_test, *utf::precondition(if_reachable()))
204+
{
205+
test_fixture f;
206+
207+
// try to store a user defined class
208+
// since we don't depend on anything, we are putting an object known to CCDB
209+
o2::ccdb::IdPath path;
210+
path.setPath("HelloWorld");
211+
212+
int result = f.api.storeAsTFileAny(&path, basePath + "CCDBPath", f.metadata); // ok
213+
BOOST_CHECK_EQUAL(result, 0);
214+
result = f.api.storeAsTFileAny(&path, basePath + "CCDBPath", f.metadata, -1, -1, 1 /* bytes */); // we know this will fail
215+
BOOST_CHECK_EQUAL(result, -1);
216+
}
217+
203218
/// A test verifying that the DB responds the correct result for given timestamps
204219
BOOST_AUTO_TEST_CASE(timestamptest, *utf::precondition(if_reachable()))
205220
{

0 commit comments

Comments
 (0)