CMS 3D CMS Logo

ProductResolver.h
Go to the documentation of this file.
1 #ifndef CondCore_ESSources_ProductResolver_H
2 #define CondCore_ESSources_ProductResolver_H
3 
4 #include <cassert>
5 //#include <iostream>
6 #include <memory>
7 #include <string>
8 #include <mutex>
9 
10 // user include files
14 
19 
20 // expose a cond::PayloadProxy as a eventsetup::ESProductResolver
21 namespace cond {
22  template <typename DataT>
24  void operator()(DataT&) {}
25  };
26 
27  template <class RecordT, class DataT, typename Initializer = cond::DefaultInitializer<DataT>>
29  public:
31  edm::SerialTaskQueue* iQueue,
32  std::mutex* iMutex)
33  : edm::eventsetup::ESSourceProductResolverTemplate<DataT>(iQueue, iMutex), m_data{pdata} {}
34  //ProductResolver(); // stop default
35  const ProductResolver& operator=(const ProductResolver&) = delete; // stop default
36 
37  // ---------- const member functions ---------------------
38 
39  // ---------- static member functions --------------------
40 
41  // ---------- member functions ---------------------------
42  protected:
44  m_data->make();
45  m_initializer(const_cast<DataT&>((*m_data)()));
46  }
47 
48  DataT const* fetch() const final { return &(*m_data)(); }
49 
50  private:
51  void initializeForNewIOV() override { m_data->initializeForNewIOV(); }
52 
53  // ---------- member data --------------------------------
54 
55  std::shared_ptr<cond::persistency::PayloadProxy<DataT>> m_data;
56  Initializer m_initializer;
57  };
58 
59  /* ABI bridging between the cond world and eventsetup world
60  * keep them separated!
61  */
63  public:
64  typedef std::shared_ptr<cond::persistency::BasePayloadProxy> ProxyP;
65  typedef std::shared_ptr<edm::eventsetup::ESProductResolver> esResolverP;
66 
67  // limitation of plugin manager...
68  typedef std::pair<std::string, std::string> Args;
69 
70  virtual edm::eventsetup::TypeTag type() const = 0;
71  virtual ProxyP proxy(unsigned int iovIndex) const = 0;
72  virtual esResolverP esResolver(unsigned int iovIndex) const = 0;
74 
76  // late initialize (to allow to load ALL library first)
78  const std::string& tag,
79  const boost::posix_time::ptime& snapshotTime,
80  std::string const& il,
81  std::string const& cs,
83  std::mutex* mutex) = 0;
84 
85  virtual void initConcurrentIOVs(unsigned int nConcurrentIOVs) = 0;
86 
87  void addInfo(std::string const& il, std::string const& cs, std::string const& tag);
88 
90 
91  std::string const& label() const { return m_label; }
92  std::string const& connString() const { return m_connString; }
93  std::string const& tag() const { return m_tag; }
95  persistency::IOVProxy const& iovProxy() const { return m_iovProxy; }
96  Iov_t const& currentIov() const { return m_currentIov; }
98  persistency::Session const& session() const { return m_session; }
99  std::shared_ptr<std::vector<Iov_t>> const& requests() const { return m_requests; }
100 
102 
103  void loadTag(std::string const& tag);
104  void loadTag(std::string const& tag, boost::posix_time::ptime const& snapshotTime);
105  void reload();
106 
109 
110  private:
117  std::shared_ptr<std::vector<Iov_t>> m_requests;
118  };
119 } // namespace cond
120 
121 /* bridge between the cond world and eventsetup world
122  * keep them separated!
123  */
124 template <class RecordT, class DataT, typename Initializer = cond::DefaultInitializer<DataT>>
126 public:
127  typedef ::cond::ProductResolver<RecordT, DataT, Initializer> ProductResolver;
128 
129  // constructor from plugin...
130  explicit ProductResolverWrapper(const char* source = nullptr) : m_source(source ? source : "") {
131  //NOTE: We do this so that the type 'DataT' will get registered
132  // when the plugin is dynamically loaded
133  m_type = edm::eventsetup::DataKey::makeTypeTag<DataT>();
134  }
135 
136  // late initialize (to allow to load ALL library first)
138  const std::string& tag,
139  const boost::posix_time::ptime& snapshotTime,
140  std::string const& il,
141  std::string const& cs,
143  std::mutex* mutex) override {
144  setSession(iSession);
145  // set the IOVProxy
147  // Only make the first PayloadProxy object now because we don't know yet
148  // how many we will need.
149  m_proxies.push_back(std::make_shared<cond::persistency::PayloadProxy<DataT>>(
150  &currentIov(), &session(), &requests(), m_source.empty() ? (const char*)nullptr : m_source.c_str()));
151  m_esResolvers.push_back(std::make_shared<ProductResolver>(m_proxies[0], queue, mutex));
152  addInfo(il, cs, tag);
153  }
154 
155  void initConcurrentIOVs(unsigned int nConcurrentIOVs) override {
156  // Create additional PayloadProxy objects if we are allowing
157  // multiple IOVs to run concurrently.
158  if (m_proxies.size() != nConcurrentIOVs) {
159  assert(m_proxies.size() == 1);
160  auto queue = m_esResolvers.front()->queue();
161  auto mutex = m_esResolvers.front()->mutex();
162  for (unsigned int i = 1; i < nConcurrentIOVs; ++i) {
163  m_proxies.push_back(std::make_shared<cond::persistency::PayloadProxy<DataT>>(
164  &currentIov(), &session(), &requests(), m_source.empty() ? (const char*)nullptr : m_source.c_str()));
165  m_esResolvers.push_back(std::make_shared<ProductResolver>(m_proxies[i], queue, mutex));
166  // This does nothing except in the special case of a KeyList PayloadProxy.
167  // They all need to have copies of the same IOVProxy object.
168  m_proxies[i]->initKeyList(*m_proxies[0]);
169  }
170  assert(m_proxies.size() == nConcurrentIOVs);
171  }
172  assert(m_proxies.size() == m_esResolvers.size());
173  }
174 
175  edm::eventsetup::TypeTag type() const override { return m_type; }
176  ProxyP proxy(unsigned int iovIndex) const override { return m_proxies.at(iovIndex); }
177  esResolverP esResolver(unsigned int iovIndex) const override { return m_esResolvers.at(iovIndex); }
178 
179  // ProductResolverWrapper returning the Key for the RecordT
180  // guarantees the proper linking order between the Records and
181  // CondDBESSource
183  return edm::eventsetup::EventSetupRecordKey::makeKey<RecordT>();
184  }
185 
186 private:
189  std::vector<std::shared_ptr<cond::persistency::PayloadProxy<DataT>>> m_proxies;
190  std::vector<std::shared_ptr<ProductResolver>> m_esResolvers;
191 };
192 
193 #endif /* CondCore_ESSources_ProductResolver_H */
persistency::Session const & session() const
ALPAKA_FN_ACC ALPAKA_FN_INLINE void VtxSoAView & pdata
std::shared_ptr< std::vector< Iov_t > > m_requests
const ProductResolver & operator=(const ProductResolver &)=delete
void initializeForNewIOV() override
std::pair< std::string, std::string > Args
static std::mutex mutex
Definition: Proxy.cc:8
virtual void initConcurrentIOVs(unsigned int nConcurrentIOVs)=0
virtual edm::eventsetup::TypeTag type() const =0
void loadTag(std::string const &tag)
assert(be >=bs)
persistency::IOVProxy const & iovProxy() const
std::string const & label() const
edm::eventsetup::TypeTag m_type
void setSession(persistency::Session const &v)
edm::eventsetup::EventSetupRecordKey recordKey() const final
std::string const & connString() const
DataT const * fetch() const final
TimeType
Definition: Time.h:19
virtual esResolverP esResolver(unsigned int iovIndex) const =0
virtual void lateInit(persistency::Session &session, const std::string &tag, const boost::posix_time::ptime &snapshotTime, std::string const &il, std::string const &cs, edm::SerialTaskQueue *queue, std::mutex *mutex)=0
unsigned long long Time_t
Definition: Time.h:14
void initConcurrentIOVs(unsigned int nConcurrentIOVs) override
persistency::IOVProxy & iovProxy()
void lateInit(cond::persistency::Session &iSession, const std::string &tag, const boost::posix_time::ptime &snapshotTime, std::string const &il, std::string const &cs, edm::SerialTaskQueue *queue, std::mutex *mutex) override
void prefetch(edm::eventsetup::DataKey const &iKey, edm::EventSetupRecordDetails) final
cond::Tag_t tagInfo() const
Definition: IOVProxy.cc:246
std::shared_ptr< cond::persistency::PayloadProxy< DataT > > m_data
virtual edm::eventsetup::EventSetupRecordKey recordKey() const =0
std::shared_ptr< std::vector< Iov_t > > const & requests() const
esResolverP esResolver(unsigned int iovIndex) const override
ProxyP proxy(unsigned int iovIndex) const override
Iov_t const & currentIov() const
void addInfo(std::string const &il, std::string const &cs, std::string const &tag)
edm::eventsetup::TypeTag type() const override
std::shared_ptr< cond::persistency::BasePayloadProxy > ProxyP
ProductResolverWrapper(const char *source=nullptr)
TimeType timeType
Definition: Types.h:63
std::string const & tag() const
virtual ProxyP proxy(unsigned int iovIndex) const =0
std::vector< std::shared_ptr< ProductResolver > > m_esResolvers
std::shared_ptr< edm::eventsetup::ESProductResolver > esResolverP
persistency::IOVProxy m_iovProxy
HLT enums.
std::vector< std::shared_ptr< cond::persistency::PayloadProxy< DataT > > > m_proxies
persistency::Session & session()
::cond::ProductResolver< RecordT, DataT, Initializer > ProductResolver
ProductResolver(std::shared_ptr< cond::persistency::PayloadProxy< DataT >> pdata, edm::SerialTaskQueue *iQueue, std::mutex *iMutex)
ValidityInterval setIntervalFor(Time_t target)
static std::string const source
Definition: EdmProvDump.cc:49