CMS 3D CMS Logo

IOVEditor.cc
Go to the documentation of this file.
4 #include "SessionImpl.h"
5 //
6 
7 namespace cond {
8 
9  namespace persistency {
10 
11  // implementation details. holds only data.
12  class IOVEditorData {
13  public:
14  explicit IOVEditorData()
15  : tag(""),
16  timeType(cond::invalid),
17  payloadType(""),
19  description(""),
20  iovBuffer(),
21  deleteBuffer(),
22  changes() {}
30  boost::posix_time::ptime creationTime;
31  bool change = false;
32  bool metadataChange = false;
33  bool exists = false;
34  // buffer for the iov sequence
35  std::vector<std::tuple<cond::Time_t, cond::Hash, boost::posix_time::ptime> > iovBuffer;
36  std::vector<std::tuple<cond::Time_t, cond::Hash> > deleteBuffer;
37  std::set<std::string> changes;
38  int protectionCode = 0;
39  };
40 
41  IOVEditor::IOVEditor() : m_data(), m_session() {}
42 
43  IOVEditor::IOVEditor(const std::shared_ptr<SessionImpl>& session) : m_data(new IOVEditorData), m_session(session) {}
44 
45  IOVEditor::IOVEditor(const std::shared_ptr<SessionImpl>& session,
46  const std::string& tag,
47  cond::TimeType timeType,
48  const std::string& payloadObjectType,
49  cond::SynchronizationType synchronizationType,
50  const boost::posix_time::ptime& creationTime)
51  : m_data(new IOVEditorData), m_session(session) {
52  m_data->tag = tag;
53  m_data->timeType = timeType;
54  m_data->payloadType = payloadObjectType;
55  m_data->synchronizationType = synchronizationType;
56  m_data->creationTime = creationTime;
57  m_data->change = true;
58  m_data->metadataChange = true;
59  }
60 
61  IOVEditor::IOVEditor(const IOVEditor& rhs) : m_data(rhs.m_data), m_session(rhs.m_session) {}
62 
64 
66  m_data = rhs.m_data;
67  m_session = rhs.m_session;
68  return *this;
69  }
70 
72  checkTransaction("IOVEditor::load");
73  // loads the current header data in memory
74  if (!m_session->iovSchema().tagTable().select(tag,
75  m_data->timeType,
76  m_data->payloadType,
77  m_data->synchronizationType,
78  m_data->endOfValidity,
79  m_data->lastValidatedTime,
80  m_data->protectionCode)) {
81  cond::throwException("Tag \"" + tag + "\" has not been found in the database.", "IOVEditor::load");
82  }
83  if (m_data->protectionCode) {
84  if (m_data->protectionCode & cond::auth::COND_DBTAG_WRITE_ACCESS_CODE) {
85  bool writeAllowed = m_session->iovSchema().tagAccessPermissionTable().getAccessPermission(
86  tag,
87  m_session->principalName,
90  if (!writeAllowed)
92  "Tag \"" + tag + "\" can't be accessed for update by db-user \"" + m_session->principalName + "\".",
93  "IOVEditor::load");
94  }
95  if (m_data->protectionCode & cond::auth::COND_DBTAG_LOCK_ACCESS_CODE) {
96  bool mylock = m_session->iovSchema().tagAccessPermissionTable().getAccessPermission(
98  if (!mylock)
100  "Tag \"" + tag + "\" can't be accessed for update, because it has been locked by an other session. \"" +
101  m_session->principalName + "\".",
102  "IOVEditor::load");
103  }
104  }
105  m_data->tag = tag;
106  m_data->exists = true;
107  m_data->change = false;
108  }
109 
110  std::string IOVEditor::tag() const { return m_data.get() ? m_data->tag : ""; }
111 
112  cond::TimeType IOVEditor::timeType() const { return m_data.get() ? m_data->timeType : cond::invalid; }
113 
114  std::string IOVEditor::payloadType() const { return m_data.get() ? m_data->payloadType : ""; }
115 
117  return m_data.get() ? m_data->synchronizationType : cond::SYNCH_ANY;
118  }
119 
121  if (m_data.get()) {
122  m_data->synchronizationType = synchronizationType;
123  m_data->change = true;
124  m_data->changes.insert("SynchronizationType");
125  }
126  }
127 
128  cond::Time_t IOVEditor::endOfValidity() const { return m_data.get() ? m_data->endOfValidity : cond::time::MIN_VAL; }
129 
131  if (m_data.get()) {
132  m_data->endOfValidity = time;
133  m_data->change = true;
134  m_data->changes.insert("EndOfValidity");
135  }
136  }
137 
138  std::string IOVEditor::description() const { return m_data.get() ? m_data->description : ""; }
139 
141  if (m_data.get()) {
142  m_data->description = description;
143  m_data->metadataChange = true;
144  m_data->changes.insert("Description");
145  }
146  }
147 
149  return m_data.get() ? m_data->lastValidatedTime : cond::time::MIN_VAL;
150  }
151 
153  if (m_data.get()) {
154  m_data->lastValidatedTime = time;
155  m_data->change = true;
156  m_data->changes.insert("LastValidatedTime");
157  }
158  }
159 
160  void IOVEditor::insert(cond::Time_t since, const cond::Hash& payloadHash, bool checkType) {
161  boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time();
162  insert(since, payloadHash, now, checkType);
163  }
164 
166  const cond::Hash& payloadHash,
167  const boost::posix_time::ptime& insertionTime,
168  bool) {
169  if (m_data.get()) {
170  // here the type check could be added
171  m_data->iovBuffer.push_back(std::tie(since, payloadHash, insertionTime));
172  }
173  }
174 
175  void IOVEditor::erase(cond::Time_t since, const cond::Hash& payloadHash) {
176  if (m_data.get()) {
177  m_data->deleteBuffer.push_back(std::tie(since, payloadHash));
178  }
179  }
180 
181  bool iovSorter(const std::tuple<cond::Time_t, cond::Hash, boost::posix_time::ptime>& f,
182  const std::tuple<cond::Time_t, cond::Hash, boost::posix_time::ptime>& s) {
183  return std::get<0>(f) < std::get<0>(s);
184  }
185 
186  bool IOVEditor::flush(const std::string& logText,
187  const boost::posix_time::ptime& operationTime,
188  bool forceInsertion) {
189  bool ret = false;
190  checkTransaction("IOVEditor::flush");
191  std::string lt = logText;
192  if (lt.empty())
193  lt = "-";
194  if (m_data->change || m_data->metadataChange) {
195  if (m_data->metadataChange && m_data->description.empty())
196  throwException("A non-empty description string is mandatory.", "IOVEditor::flush");
197  //if (m_data->validationMode)
198  // m_session->iovSchema().tagTable().setValidationMode();
199  if (!m_data->exists) {
200  // set the creation time ( only available in the migration from v1...)
201  if (m_data->creationTime.is_not_a_date_time())
202  m_data->creationTime = operationTime;
203  m_session->iovSchema().tagTable().insert(m_data->tag,
204  m_data->timeType,
205  m_data->payloadType,
206  m_data->synchronizationType,
207  m_data->endOfValidity,
208  m_data->description,
209  m_data->lastValidatedTime,
210  m_data->creationTime);
211  if (m_session->iovSchema().tagLogTable().exists())
212  m_session->iovSchema().tagLogTable().insert(m_data->tag,
213  m_data->creationTime,
214  cond::getUserName(),
215  cond::getHostName(),
216  cond::getCommand(),
217  std::string("New tag created."),
218  lt);
219  m_data->exists = true;
220  ret = true;
221  } else {
222  if (m_data->change) {
223  m_session->iovSchema().tagTable().update(m_data->tag,
224  m_data->synchronizationType,
225  m_data->endOfValidity,
226  m_data->lastValidatedTime,
227  operationTime);
228  }
229  if (m_data->metadataChange) {
230  m_session->iovSchema().tagTable().updateMetadata(m_data->tag, m_data->description, operationTime);
231  }
232  if (m_session->iovSchema().tagLogTable().exists()) {
233  std::string action("Tag header updated. Changes involve: ");
234  size_t i = 0;
235  for (const auto& c : m_data->changes) {
236  action += c;
237  if (i == (m_data->changes.size() - 1))
238  action += ".";
239  else
240  action += ", ";
241  i++;
242  }
243  m_session->iovSchema().tagLogTable().insert(
244  m_data->tag, operationTime, cond::getUserName(), cond::getHostName(), cond::getCommand(), action, lt);
245  }
246  ret = true;
247  }
248  m_data->change = false;
249  }
250  if (!m_data->iovBuffer.empty()) {
251  std::sort(m_data->iovBuffer.begin(), m_data->iovBuffer.end(), iovSorter);
252  cond::Time_t l = std::get<0>(m_data->iovBuffer.front());
253  //We do not allow for IOV updates (i.e. insertion in the past or overriding) on tags whose syncrosization is not "ANY" or "VALIDATION".
254  //This policy is stricter than the one deployed in the Condition Upload service,
255  //which allows insertions in the past or overriding for IOVs larger than the first condition safe run for HLT ("HLT"/"EXPRESS" synchronizations) and Tier0 ("PROMPT"/"PCL").
256  //This is intended: in the C++ API we have no way to determine the first condition safe runs.
257  if (!forceInsertion && m_data->synchronizationType != cond::SYNCH_ANY &&
258  m_data->synchronizationType != cond::SYNCH_VALIDATION) {
259  // retrieve the last since
260  cond::Time_t last = 0;
261  cond::Hash h;
262  boost::posix_time::ptime no_time;
263  m_session->iovSchema().iovTable().getLastIov(m_data->tag, no_time, last, h);
264  // check if the min iov is greater then the last since
265  if (l <= last) {
266  std::stringstream msg;
267  msg << "Can't insert iov since " << l << " on the tag " << m_data->tag << ": last since is " << last
268  << " and synchronization is \"" << cond::synchronizationTypeNames(m_data->synchronizationType) << "\"";
269  throwException(msg.str(), "IOVEditor::flush");
270  }
271  }
272  // set the insertion time ( only for the migration from v1 will be available... )
273  for (auto& iov : m_data->iovBuffer) {
274  boost::posix_time::ptime& insertionTime = std::get<2>(iov);
275  if (insertionTime.is_not_a_date_time())
276  insertionTime = operationTime;
277  }
278  // insert the new iovs
279  m_session->iovSchema().iovTable().insertMany(m_data->tag, m_data->iovBuffer);
280  ret = true;
281  }
282  if (!m_data->deleteBuffer.empty()) {
283  // delete the specified iovs
284  m_session->iovSchema().iovTable().eraseMany(m_data->tag, m_data->deleteBuffer);
285  ret = true;
286  }
287  if (m_session->iovSchema().tagLogTable().exists()) {
288  std::stringstream msg;
289  if (!m_data->iovBuffer.empty())
290  msg << m_data->iovBuffer.size() << " iov(s) inserted";
291  if (!msg.str().empty())
292  msg << "; ";
293  else
294  msg << ".";
295  if (!m_data->deleteBuffer.empty())
296  msg << m_data->deleteBuffer.size() << " iov(s) deleted.";
297  if (ret) {
298  m_session->iovSchema().tagLogTable().insert(
299  m_data->tag, operationTime, cond::getUserName(), cond::getHostName(), cond::getCommand(), msg.str(), lt);
300  }
301  }
302  m_data->iovBuffer.clear();
303  m_data->deleteBuffer.clear();
304  m_data->changes.clear();
305  return ret;
306  }
307 
308  bool IOVEditor::flush(const std::string& logText) {
309  return flush(logText, boost::posix_time::microsec_clock::universal_time(), false);
310  }
311 
312  bool IOVEditor::flush(const boost::posix_time::ptime& operationTime) {
313  return flush(std::string("-"), operationTime, false);
314  }
315 
317  return flush(std::string("-"), boost::posix_time::microsec_clock::universal_time(), false);
318  }
319 
320  bool IOVEditor::flush(const std::string& logText, bool forceInsertion) {
321  return flush(logText, boost::posix_time::microsec_clock::universal_time(), forceInsertion);
322  }
323 
324  bool IOVEditor::isLocked() const { return m_data->protectionCode & cond::auth::COND_DBTAG_LOCK_ACCESS_CODE; }
325 
327  if (isLocked())
328  return;
329  checkTransaction("IOVEditor::lock");
330  m_session->iovSchema().tagAccessPermissionTable().setAccessPermission(m_data->tag,
331  m_session->sessionHash,
335  m_session->iovSchema().tagTable().setProtectionCode(m_data->tag, cond::auth::COND_DBTAG_LOCK_ACCESS_CODE);
336  m_session->lockedTags.insert(m_data->tag);
337  std::string lt("-");
338  std::string action("Lock set by session ");
339  action += m_session->sessionHash;
340  m_session->iovSchema().tagLogTable().insert(m_data->tag,
341  boost::posix_time::microsec_clock::universal_time(),
342  cond::getUserName(),
343  cond::getHostName(),
344  cond::getCommand(),
345  action,
346  lt);
347  }
348 
350  if (!isLocked())
351  return;
352  checkTransaction("IOVEditor::unlock");
353  m_session->iovSchema().tagAccessPermissionTable().removeAccessPermission(
356  m_session->iovSchema().tagTable().unsetProtectionCode(m_data->tag, cond::auth::COND_DBTAG_LOCK_ACCESS_CODE);
357  m_session->lockedTags.erase(m_data->tag);
358  std::string lt("-");
359  std::string action("Lock released by session ");
360  action += m_session->sessionHash;
361  m_session->iovSchema().tagLogTable().insert(m_data->tag,
362  boost::posix_time::microsec_clock::universal_time(),
363  cond::getUserName(),
364  cond::getHostName(),
365  cond::getCommand(),
366  action,
367  lt);
368  }
369 
371  if (!m_session.get())
372  throwException("The session is not active.", ctx);
373  if (!m_session->isTransactionActive(false))
374  throwException("The transaction is not active.", ctx);
375  }
376 
377  } // namespace persistency
378 } // namespace cond
runTheMatrix.ret
ret
prodAgent to be discontinued
Definition: runTheMatrix.py:542
cond::time::MIN_VAL
const Time_t MIN_VAL(0)
cond::persistency::IOVEditor::~IOVEditor
~IOVEditor()
Definition: IOVEditor.cc:63
cond::persistency::IOVEditor::insert
void insert(cond::Time_t since, const cond::Hash &payloadHash, bool checkType=false)
Definition: IOVEditor.cc:160
cond::persistency::IOVEditorData::payloadType
std::string payloadType
Definition: IOVEditor.cc:25
cond::persistency::IOVEditorData::changes
std::set< std::string > changes
Definition: IOVEditor.cc:37
mps_fire.i
i
Definition: mps_fire.py:428
cond::TimeType
TimeType
Definition: Time.h:19
cond::persistency::IOVEditor::setLastValidatedTime
void setLastValidatedTime(cond::Time_t time)
Definition: IOVEditor.cc:152
cond::persistency::IOVEditorData::tag
std::string tag
Definition: IOVEditor.cc:23
cond::Hash
std::string Hash
Definition: Types.h:43
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
cond::persistency::IOVEditor::tag
std::string tag() const
Definition: IOVEditor.cc:110
submitPVValidationJobs.now
now
Definition: submitPVValidationJobs.py:639
cond::persistency::IOVEditor::isLocked
bool isLocked() const
Definition: IOVEditor.cc:324
cond::auth::COND_DBTAG_LOCK_ACCESS_CODE
static constexpr int COND_DBTAG_LOCK_ACCESS_CODE
Definition: Auth.h:38
cond::persistency::IOVEditorData::endOfValidity
cond::Time_t endOfValidity
Definition: IOVEditor.cc:28
h
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
Definition: L1TUtmAlgorithmRcd.h:4
edmLumisInFiles.description
description
Definition: edmLumisInFiles.py:11
cond::persistency::IOVEditorData::timeType
cond::TimeType timeType
Definition: IOVEditor.cc:24
cond::persistency::IOVEditor
Definition: IOVEditor.h:28
IOVEditor.h
protons_cff.time
time
Definition: protons_cff.py:39
mps_check.msg
tuple msg
Definition: mps_check.py:285
cond::auth::COND_DBKEY_CREDENTIAL_CODE
static constexpr int COND_DBKEY_CREDENTIAL_CODE
Definition: Auth.h:36
cond::persistency::IOVEditorData::description
std::string description
Definition: IOVEditor.cc:27
cond::SYNCH_VALIDATION
Definition: Types.h:29
cond::persistency::IOVEditorData::deleteBuffer
std::vector< std::tuple< cond::Time_t, cond::Hash > > deleteBuffer
Definition: IOVEditor.cc:36
cond::persistency::IOVEditorData
Definition: IOVEditor.cc:12
cond::synchronizationTypeNames
std::string synchronizationTypeNames(SynchronizationType type)
Definition: Types.cc:45
cond::persistency::IOVEditorData::synchronizationType
cond::SynchronizationType synchronizationType
Definition: IOVEditor.cc:26
cond::persistency::IOVEditorData::metadataChange
bool metadataChange
Definition: IOVEditor.cc:32
alignCSCRings.s
s
Definition: alignCSCRings.py:92
dqmdumpme.last
last
Definition: dqmdumpme.py:56
cond::auth::COND_SESSION_HASH_CODE
static constexpr int COND_SESSION_HASH_CODE
Definition: Auth.h:35
cond::SynchronizationType
SynchronizationType
Definition: Types.h:27
Utils.h
GlobalPosition_Frontier_DevDB_cff.tag
tag
Definition: GlobalPosition_Frontier_DevDB_cff.py:11
SessionImpl.h
cond::persistency::IOVEditor::m_session
std::shared_ptr< SessionImpl > m_session
Definition: IOVEditor.h:99
cond::persistency::IOVEditor::m_data
std::shared_ptr< IOVEditorData > m_data
Definition: IOVEditor.h:98
cond::persistency::IOVEditorData::protectionCode
int protectionCode
Definition: IOVEditor.cc:38
writeEcalDQMStatus.since
since
Definition: writeEcalDQMStatus.py:53
h
cond::persistency::IOVEditorData::IOVEditorData
IOVEditorData()
Definition: IOVEditor.cc:14
cond::persistency::IOVEditor::setDescription
void setDescription(const std::string &description)
Definition: IOVEditor.cc:140
cond::persistency::iovSorter
bool iovSorter(const std::tuple< cond::Time_t, cond::Hash, boost::posix_time::ptime > &f, const std::tuple< cond::Time_t, cond::Hash, boost::posix_time::ptime > &s)
Definition: IOVEditor.cc:181
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
cond::persistency::IOVEditorData::iovBuffer
std::vector< std::tuple< cond::Time_t, cond::Hash, boost::posix_time::ptime > > iovBuffer
Definition: IOVEditor.cc:35
cond
Definition: plugin.cc:23
createPayload.checkType
checkType
Definition: createPayload.py:383
cond::persistency::IOVEditorData::lastValidatedTime
cond::Time_t lastValidatedTime
Definition: IOVEditor.cc:29
cond::persistency::IOVEditor::timeType
cond::TimeType timeType() const
Definition: IOVEditor.cc:112
cond::SYNCH_ANY
Definition: Types.h:28
cond::persistency::IOVEditorData::exists
bool exists
Definition: IOVEditor.cc:33
cond::persistency::IOVEditor::description
std::string description() const
Definition: IOVEditor.cc:138
jetUpdater_cfi.sort
sort
Definition: jetUpdater_cfi.py:29
cond::persistency::IOVEditor::synchronizationType
cond::SynchronizationType synchronizationType() const
Definition: IOVEditor.cc:116
cond::Time_t
unsigned long long Time_t
Definition: Time.h:14
cond::time::MAX_VAL
const Time_t MAX_VAL(std::numeric_limits< Time_t >::max())
writedatasetfile.action
action
Definition: writedatasetfile.py:8
cond::persistency::IOVEditor::IOVEditor
IOVEditor()
Definition: IOVEditor.cc:41
cond::persistency::IOVEditor::lastValidatedTime
cond::Time_t lastValidatedTime() const
Definition: IOVEditor.cc:148
BeamSpotPI::creationTime
Definition: BeamSpotPayloadInspectorHelper.h:44
cond::auth::COND_DBTAG_WRITE_ACCESS_CODE
static constexpr int COND_DBTAG_WRITE_ACCESS_CODE
Definition: Auth.h:39
cond::persistency::IOVEditor::payloadType
std::string payloadType() const
Definition: IOVEditor.cc:114
cond::invalid
Definition: Time.h:19
cond::persistency::IOVEditor::setSynchronizationType
void setSynchronizationType(cond::SynchronizationType synchronizationType)
Definition: IOVEditor.cc:120
cmsLHEtoEOSManager.l
l
Definition: cmsLHEtoEOSManager.py:204
cond::persistency::IOVEditor::checkTransaction
void checkTransaction(const std::string &ctx)
Definition: IOVEditor.cc:370
cond::persistency::IOVEditorData::change
bool change
Definition: IOVEditor.cc:31
cond::persistency::IOVEditor::setEndOfValidity
void setEndOfValidity(cond::Time_t validity)
Definition: IOVEditor.cc:130
cond::persistency::IOVEditor::operator=
IOVEditor & operator=(const IOVEditor &rhs)
Definition: IOVEditor.cc:65
cond::persistency::throwException
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:12
cond::persistency::IOVEditor::erase
void erase(cond::Time_t since, const cond::Hash &payloadHash)
Definition: IOVEditor.cc:175
cond::persistency::IOVEditorData::creationTime
boost::posix_time::ptime creationTime
Definition: IOVEditor.cc:30
Auth.h
c
auto & c
Definition: CAHitNtupletGeneratorKernelsImpl.h:46
cond::persistency::IOVEditor::flush
bool flush()
Definition: IOVEditor.cc:316
cond::persistency::IOVEditor::lock
void lock()
Definition: IOVEditor.cc:326
cond::persistency::IOVEditor::endOfValidity
cond::Time_t endOfValidity() const
Definition: IOVEditor.cc:128
cond::persistency::IOVEditor::load
void load(const std::string &tag)
Definition: IOVEditor.cc:71
cond::persistency::IOVEditor::unlock
void unlock()
Definition: IOVEditor.cc:349
cond::throwException
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:18