From 098d401c67835fccafc6cd70c17696096f5d68ab Mon Sep 17 00:00:00 2001 From: Scott Snyder <scott.snyder@cern.ch> Date: Fri, 14 Dec 2018 17:10:03 +0000 Subject: [PATCH] AthenaKernel+others: Support mixed conditions containers. Former-commit-id: f04c3617ac5ff81072f0dfda84a66c9591745db6 --- Control/AthenaKernel/AthenaKernel/CondCont.h | 544 ++++++++++++- .../AthenaKernel/AthenaKernel/CondCont.icc | 161 +++- Control/AthenaKernel/share/CondCont_test.ref | 12 +- Control/AthenaKernel/src/CondCont.cxx | 752 +++++++++++++----- Control/AthenaKernel/test/CondCont_test.cxx | 380 ++++++++- .../src/DelayedConditionsCleanerSvc.cxx | 1 + .../test/ConditionsCleanerSvc_test.cxx | 34 +- .../test/DelayedConditionsCleanerSvc_test.cxx | 39 +- .../DataModelRunTests/share/CondReader.ref | 292 +++++-- .../DataModelRunTests/share/CondReaderMT.ref | 333 ++++++-- .../DataModelRunTests/share/CondReader_jo.py | 19 +- .../DataModelRunTests/share/CondWriter.ref | 40 +- .../DataModelRunTests/share/CondWriter_jo.py | 26 +- .../DataModelTestDataCommonDict.h | 3 +- .../DataModelTestDataCommon/S3.h | 39 + .../DataModelTestDataCommon/S3Cond.h | 25 + .../DataModelTestDataCommon/selection.xml | 1 + .../DataModelTestDataCommon/src/CondAlg2.cxx | 87 ++ .../DataModelTestDataCommon/src/CondAlg2.h | 63 ++ .../src/CondReaderAlg.cxx | 27 +- .../src/CondReaderAlg.h | 6 +- .../src/CondWriterAlg.cxx | 60 ++ .../src/CondWriterAlg.h | 6 +- .../DataModelTestDataCommon_entries.cxx | 2 + 24 files changed, 2581 insertions(+), 371 deletions(-) create mode 100644 Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3.h create mode 100644 Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3Cond.h create mode 100644 Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.cxx create mode 100644 Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.h diff --git a/Control/AthenaKernel/AthenaKernel/CondCont.h b/Control/AthenaKernel/AthenaKernel/CondCont.h index 7e7bd6991bd5..e2a503cc6267 100644 --- a/Control/AthenaKernel/AthenaKernel/CondCont.h +++ b/Control/AthenaKernel/AthenaKernel/CondCont.h @@ -7,6 +7,61 @@ * @author Vakho, Charles, Scott * @date 2017 * @brief Hold mappings of ranges to condition objects. + * + * Conditions objects of type @c T are managed by @c CondCont<T>, which are + * recorded in the conditions store. @c CondCont<T> is a map of IOV ranges + * to payload objects of type @c T. + * + * A conditions container must be declared as such and given a CLID using + * the macro @c CONDCONT_DEF: + *@code + * CONDCONT_DEF (MyType, 12345); + @endcode + * + * If one payload class derives from another, it is possible declare + * conditions containers so that they have the same inheritance by adding + * the payload base class as a thir argument to @c CONDCONT_DEF. For example, + * if @c MyType derived from @c MyBase then you can use + *@code + * CONDCONT_DEF (MyType, 12345, MyBase); + @endcode + * + * A conditions container declared in this way should have keys that + * are either ranges in run+lbn or timestamp; they cannot be mixed. + * However, in the case where one has a conditions algorithm that takes + * as input both a run+lbn and a timestamp condition, the result + * will be IOVs that have both run+lbn and timestamp ranges. Such conditions + * may be stored in a mixed conditions container, declared as: + @code + * CONDCONT_MIXED_DEF (MyType, 12345); + @endcode + * + * @c CondCont<MyType> is now declared as a mixed container. + * Inheritance of conditions containers is not currently implemented + * for mixed containers. + * + * Implementation notes: + * All conditions containers derive from @c CondContBase. This defines + * virtual functions that are used by the IOV services. @c CondContSingleBase + * derives from this and collects non-templated implementations used by + * non-mixed containers; most virtual functions can be declared @c final here. + * Finally, @c CondCont<T> derives from @c CondContSingleBase and implements + * the type-specific part. + * + * We reduce the amount of templated code that must be instantiated by storing + * the payloads as void* in the underlying @c ConcurrentRangeMap. All this + * needs to do with the payloads is to be able to delete them; we handle + * this by giving @c ConcurrentRangeMap a function to call to delete a payload. + * + * For the case of mixed containers, rather than having the @c ConcurrentRangeMap + * store the payload directly, it instead holds another @c ConcurrentRangeMap + * which in turn hold the payload. The top map is indexed by run+lbn + * and the secondary ones by timestamp. + * + * For mixed containers, we have @c CondContMixedBase deriving from + * @c CondContBase and @c CondContMixed<T> deriving from that. + * The @c CONDCONT_MIXED_DEF macro then specializes @c CondCont<T> + * so that it derives from @c CondContMixed<T> */ #ifndef ATHENAKERNEL_CONDCONT_H @@ -66,6 +121,9 @@ enum class CondContStatusCode : StatusCode::code_t STATUSCODE_ENUM_DECL (CondContStatusCode) +/** + * @brief Base class for all conditions containers. + */ class CondContBase { public: @@ -111,7 +169,10 @@ public: TIMESTAMP, /// Container uses run+lbn keys. - RUNLBN + RUNLBN, + + /// Mixed Run+lbn / timestamp container. + MIXED, }; @@ -154,6 +215,12 @@ public: SG::DataProxy* proxy(); + /** + * @brief Return the associated @c DataProxy, if any. + */ + const SG::DataProxy* proxy() const; + + /** * @brief Set the associated @c DataProxy. * @param proxy The proxy to set. @@ -166,7 +233,7 @@ public: * @param ost Stream to which to write the dump. */ virtual - void list (std::ostream& ost) const; + void list (std::ostream& ost) const = 0; /** @@ -185,7 +252,7 @@ public: * @brief Return all IOV validity ranges defined in this container. */ virtual - std::vector<EventIDRange> ranges() const; + std::vector<EventIDRange> ranges() const = 0; /** @@ -209,7 +276,7 @@ public: virtual StatusCode typelessInsert (const EventIDRange& r, void* obj, - const EventContext& ctx = Gaudi::Hive::currentContext()); + const EventContext& ctx = Gaudi::Hive::currentContext()) = 0; /** @@ -217,7 +284,7 @@ public: * @param t IOV time to check. */ virtual - bool valid( const EventIDBase& t) const; + bool valid( const EventIDBase& t) const = 0; /** @@ -228,7 +295,7 @@ public: * Returns true if @c t is mapped; false otherwise. */ virtual - bool range (const EventIDBase& t, EventIDRange& r) const; + bool range (const EventIDBase& t, EventIDRange& r) const = 0; /** @@ -238,7 +305,7 @@ public: */ virtual StatusCode erase (const EventIDBase& t, - const EventContext& ctx = Gaudi::Hive::currentContext()); + const EventContext& ctx = Gaudi::Hive::currentContext()) = 0; /** @@ -299,7 +366,7 @@ public: */ virtual StatusCode extendLastRange (const EventIDRange& newRange, - const EventContext& ctx = Gaudi::Hive::currentContext()); + const EventContext& ctx = Gaudi::Hive::currentContext()) = 0; /** @@ -399,10 +466,12 @@ protected: CondContSet; typedef CondContSet::Updater_t Updater_t; + typedef CondContSet::delete_function delete_function; /** * @brief Internal constructor. * @param rcusvc RCU service instance. + * @param keyType Key type for this container. * @param CLID of the most-derived @c CondCont. * @param id CLID+key for this object. * @param proxy @c DataProxy for this object. @@ -410,6 +479,7 @@ protected: * @param capacity Initial capacity of the container. */ CondContBase (Athena::IRCUSvc& rcusvc, + KeyType keytype, CLID clid, const DataObjID& id, SG::DataProxy* proxy, @@ -435,6 +505,30 @@ protected: const EventContext& ctx = Gaudi::Hive::currentContext()); + /** + * @brief Erase the first element not less than @c t. + * @param IOV time of element to erase. + * @param ctx Event context for the current thread. + */ + StatusCode eraseBase (const EventIDBase& t, + const EventContext& ctx = Gaudi::Hive::currentContext()); + + + /** + * @brief Extend the range of the last IOV. + * @param newRange New validity range. + * @param ctx Event context. + * + * Returns failure if the start time of @c newRange does not match the start time + * of the last IOV in the container. Otherwise, the end time for the last + * IOV is changed to the end time for @c newRange. (If the end time for @c newRange + * is before the end of the last IOV, then nothing is changed.) + */ + StatusCode + extendLastRangeBase (const EventIDRange& newRange, + const EventContext& ctx = Gaudi::Hive::currentContext()); + + /** * @brief Internal lookup function. * @param t IOV time to find. @@ -475,6 +569,17 @@ protected: virtual const void* doCast (CLID clid, const void* ptr) const = 0; + /** + * @brief Call @c func on each entry in the container. + * @param func Functional to call on each entry. + * + * @c func will be called on each container element + * (being passed const CondContSet::value_type&). + */ + template <class FUNC> + void forEach (const FUNC& func) const; + + /** * @brief Tell the cleaner that a new object was added to the container. */ @@ -488,6 +593,18 @@ protected: void insertError (CLID usedCLID) const; + /** + * @brief Return the deletion function for this container. + */ + delete_function* delfcn() const; + + + /** + * @brief Description of this container to use for Msgstream. + */ + std::string title() const; + + private: /// Key type of this container. KeyType m_keyType; @@ -516,6 +633,119 @@ private: /////////////////////////////////////////////////////////////////////////// +/** + * @brief Base class for conditions containers that are either + * Run+LBN or timestamp. + */ +class CondContSingleBase + : public CondContBase +{ +public: + /** + * @brief Dump the container contents for debugging. + * @param ost Stream to which to write the dump. + */ + virtual + void list (std::ostream& ost) const override final; + + + /** + * @brief Return all IOV validity ranges defined in this container. + */ + virtual + std::vector<EventIDRange> ranges() const override final; + + + /** + * @brief Insert a new conditions object. + * @param r Range of validity of this object. + * @param obj Pointer to the object being inserted. + * @param ctx Event context for the current thread. + * + * @c obj must point to an object of type @c T, + * except in the case of inheritance, where the type of @c obj must + * correspond to the most-derived @c CondCont type. + * The container will take ownership of this object. + * + * Returns SUCCESS if the object was successfully inserted; + * OVERLAP if the object was inserted but the range partially overlaps + * with an existing one; + * DUPLICATE if the object wasn't inserted because the range + * duplicates an existing one, and FAILURE otherwise + * (ownership of the object will be taken in any case). + */ + virtual + StatusCode typelessInsert (const EventIDRange& r, + void* obj, + const EventContext& ctx = Gaudi::Hive::currentContext()) override final; + + + /** + * @brief Test to see if a given IOV time is mapped in the container. + * @param t IOV time to check. + */ + virtual + bool valid( const EventIDBase& t) const override final; + + + /** + * @brief Return the mapped validity range for an IOV time. + * @param t IOV time to check. + * @param r[out] The range containing @c t. + * + * Returns true if @c t is mapped; false otherwise. + */ + virtual + bool range (const EventIDBase& t, EventIDRange& r) const override final; + + + /** + * @brief Erase the first element not less than @c t. + * @param IOV time of element to erase. + * @param ctx Event context for the current thread. + */ + virtual + StatusCode erase (const EventIDBase& t, + const EventContext& ctx = Gaudi::Hive::currentContext()) override final; + + + /** + * @brief Extend the range of the last IOV. + * @param newRange New validity range. + * @param ctx Event context. + * + * Returns failure if the start time of @c newRange does not match the start time + * of the last IOV in the container. Otherwise, the end time for the last + * IOV is changed to the end time for @c newRange. (If the end time for @c newRange + * is before the end of the last IOV, then nothing is changed.) + */ + virtual + StatusCode extendLastRange (const EventIDRange& newRange, + const EventContext& ctx = Gaudi::Hive::currentContext()) override final; + + +protected: + /** + * @brief Internal constructor. + * @param rcusvc RCU service instance. + * @param CLID of the most-derived @c CondCont. + * @param id CLID+key for this object. + * @param proxy @c DataProxy for this object. + * @param delfcn Deletion function for the actual payload type. + * @param capacity Initial capacity of the container. + */ + CondContSingleBase (Athena::IRCUSvc& rcusvc, + CLID clid, + const DataObjID& id, + SG::DataProxy* proxy, + CondContSet::delete_function* delfcn, + size_t capacity); +}; + + +/////////////////////////////////////////////////////////////////////////// + + template <class T> class CondCont; @@ -530,7 +760,7 @@ template <typename T> class CondContBaseInfo { public: - typedef CondContBase Base; + typedef CondContSingleBase Base; }; @@ -679,7 +909,7 @@ protected: CLID clid, const DataObjID& id, SG::DataProxy* proxy, - const typename CondContSet::delete_function* delfcn, + typename CondContSet::delete_function* delfcn, size_t capacity); @@ -717,16 +947,296 @@ public: private: - typedef CondContBase::RangeKey RangeKey; + /// Deletion function to pass to @c ConcurrentRangeMap. + static void delfcn (const void* p) { + delete reinterpret_cast<const T*>(p); + } +}; +/////////////////////////////////////////////////////////////////////////// + + +/** + * @brief Base class for conditions containers for which keys are ranges + * in both Run+LBN and timestamp. + */ +class CondContMixedBase + : public CondContBase +{ +public: + /** + * @brief Dump the container contents for debugging. + * @param ost Stream to which to write the dump. + */ + virtual + void list (std::ostream& ost) const override final; + + + /** + * @brief Return all IOV validity ranges defined in this container. + */ + virtual + std::vector<EventIDRange> ranges() const override final; + + + /** + * @brief Insert a new conditions object. + * @param r Range of validity of this object. + * @param obj Pointer to the object being inserted. + * @param ctx Event context for the current thread. + * + * @c obj must point to an object of type @c T, + * except in the case of inheritance, where the type of @c obj must + * correspond to the most-derived @c CondCont type. + * The container will take ownership of this object. + * + * Returns SUCCESS if the object was successfully inserted; + * OVERLAP if the object was inserted but the range partially overlaps + * with an existing one; + * DUPLICATE if the object wasn't inserted because the range + * duplicates an existing one, and FAILURE otherwise + * (ownership of the object will be taken in any case). + */ + virtual + StatusCode typelessInsert (const EventIDRange& r, + void* obj, + const EventContext& ctx = Gaudi::Hive::currentContext()) override final; + + + /** + * @brief Test to see if a given IOV time is mapped in the container. + * @param t IOV time to check. + */ + virtual + bool valid( const EventIDBase& t) const override final; + + + /** + * @brief Return the mapped validity range for an IOV time. + * @param t IOV time to check. + * @param r[out] The range containing @c t. + * + * Returns true if @c t is mapped; false otherwise. + */ + virtual + bool range (const EventIDBase& t, EventIDRange& r) const override final; + + + /** + * @brief Erase the first element not less than @c t. + * @param IOV time of element to erase. + * @param ctx Event context for the current thread. + * + * This is not implemented for mixed containers. + */ + virtual + StatusCode erase (const EventIDBase& t, + const EventContext& ctx = Gaudi::Hive::currentContext()) override final; + + + /** + * @brief Extend the range of the last IOV. + * @param newRange New validity range. + * @param ctx Event context. + * + * Returns failure if the start time of @c newRange does not match the start time + * of the last IOV in the container. Otherwise, the end time for the last + * IOV is changed to the end time for @c newRange. (If the end time for @c newRange + * is before the end of the last IOV, then nothing is changed.) + * + * This is not implemented for mixed containers. + */ + virtual + StatusCode extendLastRange (const EventIDRange& newRange, + const EventContext& ctx = Gaudi::Hive::currentContext()) override final; + + +protected: + /** + * @brief Internal constructor. + * @param rcusvc RCU service instance. + * @param CLID of the most-derived @c CondCont. + * @param id CLID+key for this object. + * @param proxy @c DataProxy for this object. + * @param payloadDelfcn Deletion function for the actual payload type. + * @param capacity Initial capacity of the container. + */ + CondContMixedBase (Athena::IRCUSvc& rcusvc, + CLID clid, + const DataObjID& id, + SG::DataProxy* proxy, + CondContSet::delete_function* payloadDelfcn, + size_t capacity); + + + /** + * @brief Insert a new conditions object. + * @param r Range of validity of this object. + * @param t Pointer to the object being inserted. + * @param ctx Event context for the current thread. + * + * Returns SUCCESS if the object was successfully inserted; + * OVERLAP if the object was inserted but the range partially overlaps + * with an existing one; + * DUPLICATE if the object wasn't inserted because the range + * duplicates an existing one, and FAILURE otherwise + * (ownership of the object will be taken in any case). + */ + StatusCode insertMixed (const EventIDRange& r, + CondContBase::CondContSet::payload_unique_ptr t, + const EventContext& ctx = Gaudi::Hive::currentContext()); + + + /** + * @brief Internal lookup function. + * @param t IOV time to find. + * @param r If non-null, copy validity range of the object here. + * + * Looks up the conditions object corresponding to the IOV time @c t. + * If found, return the pointer (as a pointer to the payload type + * of the most-derived CondCont). Otherwise, return nullptr. + */ + const void* findMixed (const EventIDBase& t, + EventIDRange const** r) const; + + + /** + * @brief Return the payload deletion function for this container. + */ + delete_function* payloadDelfcn() const; + + + /** + * @brief Do pointer conversion for the payload type. + * @param clid CLID for the desired pointer type. + * @param ptr Pointer of type @c T*. + * + * This just aborts, since we don't currently implement inheritance + * for mixed types. + */ + virtual const void* doCast(CLID /*clid*/, const void* /*ptr*/) const override; + + +private: /// Deletion function to pass to @c ConcurrentRangeMap. static void delfcn (const void* p) { + delete reinterpret_cast<const CondContSet*>(p); + } + + /// Need to remember the RCU svc here in order to pass it to the + /// TS maps. + Athena::IRCUSvc& m_rcusvc; + + /// Function to delete payload objects. + delete_function* m_payloadDelfcn; + + /// Mutex for insertions. + std::mutex m_mutex; +}; + + +/////////////////////////////////////////////////////////////////////////// + + +/** + * @brief Conditions container for which keys are ranges in both Run+LBN + * and timestamp. + * + * Don't use this directly; instead declare your container with + * @c CONDCONT_MIXED_DEF and then use @c CondCont<T>. + */ +template <typename T> +class CondContMixed: public CondContMixedBase +{ +public: + /// Base class. + typedef CondContMixedBase Base; + + typedef typename Base::CondContSet CondContSet; + + /// Payload type held by this class. + typedef T Payload; + + typedef CondContBase::key_type key_type; + + + /// Destructor. + virtual ~CondContMixed(); + + /// No copying. + CondContMixed (const CondContMixed&) = delete; + CondContMixed& operator= (const CondContMixed&) = delete; + + + /** + * @brief Insert a new conditions object. + * @param r Range of validity of this object. + * @param obj Pointer to the object being inserted. + * @param ctx Event context for the current thread. + * + * @c obj must point to an object of type @c T. + * This will give an error if this is not called + * on the most-derived @c CondCont. + * + * Returns SUCCESS if the object was successfully inserted; + * OVERLAP if the object was inserted but the range partially overlaps + * with an existing one; + * DUPLICATE if the object wasn't inserted because the range + * duplicates an existing one, and FAILURE otherwise + * (ownership of the object will be taken in any case). + */ + StatusCode insert (const EventIDRange& r, + std::unique_ptr<T> obj, + const EventContext& ctx = Gaudi::Hive::currentContext()); + + + /** + * @brief Look up a conditions object for a given time. + * @param t IOV time to find. + * @param obj[out] Object found. + * @param r If non-null, copy validity range of the object here. + * + * Returns true if the object was found; false otherwide. + */ + bool find (const EventIDBase& t, + T const*& obj, + EventIDRange const** r = nullptr) const; + + +protected: + /** + * @brief Internal Constructor. + * @param rcusvc RCU service instance. + * @param CLID of the most-derived @c CondCont. + * @param id CLID+key for this object. + * @param proxy @c DataProxy for this object. + * @param capacity Initial capacity of the container. + */ + CondContMixed (Athena::IRCUSvc& rcusvc, + CLID clid, + const DataObjID& id, + SG::DataProxy* proxy, + size_t capacity); + + +public: + /// Helper to ensure that the inheritance information for this class + /// gets initialized. + static void registerBaseInit(); + + +private: + /// Deletion function to for payload objects. + static void payloadDelfcn (const void* p) { delete reinterpret_cast<const T*>(p); } }; +/////////////////////////////////////////////////////////////////////////// + + #include "AthenaKernel/CondCont.icc" #include "AthenaKernel/CondContMaker.h" @@ -751,6 +1261,18 @@ private: #define CONDCONT_DEF(...) \ BOOST_PP_OVERLOAD(CONDCONT_DEF_, __VA_ARGS__)(__VA_ARGS__) + +/// Declare a mixed conditions container along with its CLID. +#define CONDCONT_MIXED_DEF(T, CLID) \ + template<> class CondCont<T> : public CondContMixed<T> { \ + public: \ + CondCont (Athena::IRCUSvc& rcusvc, const DataObjID& id, \ + SG::DataProxy* proxy =nullptr, size_t capacity = 16) \ + : CondContMixed<T> (rcusvc, CLID, id, proxy, capacity) {} \ + }; \ + CLASS_DEF( CondCont<T>, CLID, 1) \ + static CondContainer::CondContMaker<T> maker_ ## CLID {} + #endif // not ATHENAKERNEL_CONDCONT_H diff --git a/Control/AthenaKernel/AthenaKernel/CondCont.icc b/Control/AthenaKernel/AthenaKernel/CondCont.icc index 2efc2d89559b..a0800550a337 100644 --- a/Control/AthenaKernel/AthenaKernel/CondCont.icc +++ b/Control/AthenaKernel/AthenaKernel/CondCont.icc @@ -63,13 +63,12 @@ SG::DataProxy* CondContBase::proxy() /** - * @brief Test to see if a given IOV time is mapped in the container. - * @param t IOV time to check. + * @brief Return the associated @c DataProxy, if any. */ inline -bool CondContBase::valid (const EventIDBase& t) const +const SG::DataProxy* CondContBase::proxy() const { - return findBase (t, nullptr) != nullptr; + return m_proxy; } @@ -114,7 +113,26 @@ CondContBase::key_type CondContBase::keyFromRunLBN (const EventIDBase& b) inline CondContBase::key_type CondContBase::keyFromTimestamp (const EventIDBase& b) { - return (static_cast<key_type> (b.time_stamp())<<32) + b.time_stamp_ns_offset(); + return (static_cast<key_type> (b.time_stamp())*1000000000) + b.time_stamp_ns_offset(); +} + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/** + * @brief Call @c func on each entry in the container. + * @param func Functional to call on each entry. + * + * @c func will be called on each container element + * (being passed const CondContSet::value_type&). + */ +template <class FUNC> +void CondContBase::forEach (const FUNC& func) const +{ + for (const typename CondContSet::value_type& ent : m_condSet.range()) { + func (ent); + } } @@ -155,6 +173,20 @@ CondContBase::RangeKey::RangeKey (const EventIDRange& r, /////////////////////////////////////////////////////////////////////////// +/** + * @brief Test to see if a given IOV time is mapped in the container. + * @param t IOV time to check. + */ +inline +bool CondContSingleBase::valid (const EventIDBase& t) const +{ + return findBase (t, nullptr) != nullptr; +} + + +/////////////////////////////////////////////////////////////////////////// + + /** * @brief Constructor. * @param rcusvc RCU service instance. @@ -288,7 +320,7 @@ CondCont<T>::CondCont (Athena::IRCUSvc& rcusvc, CLID clid, const DataObjID& id, SG::DataProxy* proxy, - const typename CondContSet::delete_function* delfcn, + typename CondContSet::delete_function* delfcn, size_t capacity) : Base (rcusvc, clid, id, proxy, delfcn, capacity) { @@ -333,3 +365,120 @@ void CondCont<T>::registerBaseInit() } +/////////////////////////////////////////////////////////////////////////// + + +/** + * @brief Test to see if a given IOV time is mapped in the container. + * @param t IOV time to check. + */ +inline +bool CondContMixedBase::valid (const EventIDBase& t) const +{ + return findMixed (t, nullptr) != nullptr; +} + + +/////////////////////////////////////////////////////////////////////////// + + +/** + * @brief Destructor. + */ +template <typename T> +CondContMixed<T>::~CondContMixed<T>() +{ +} + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/** + * @brief Insert a new conditions object. + * @param r Range of validity of this object. + * @param t Pointer to the object being inserted. + * @param ctx Event context for the current thread. + * + * @c t must point to an object of type @c T. + * This will give an error if this is not called + * on the most-derived @c CondCont. + * + * Returns SUCCESS if the object was successfully inserted; + * OVERLAP if the object was inserted but the range partially overlaps + * with an existing one; + * DUPLICATE if the object wasn't inserted because the range + * duplicates an existing one, and FAILURE otherwise + * (ownership of the object will be taken in any case). + */ +template <typename T> +StatusCode CondContMixed<T>::insert (const EventIDRange& r, + std::unique_ptr<T> t, + const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) +{ + // Not checking CLID here, since we don't support inheritance for mixed + // containers. + + return Base::insertMixed (r, std::move(t), ctx); +} + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/** + * @brief Look up a conditions object for a given time. + * @param t IOV time to find. + * @param obj[out] Object found. + * @param r If non-null, copy validity range of the object here. + * + * Returns true if the object was found; false otherwide. + */ +template <typename T> +bool CondContMixed<T>::find (const EventIDBase& t, + T const *& obj, + EventIDRange const** r) const +{ + obj = reinterpret_cast<const T*> (Base::findMixed (t, r)); + return obj != nullptr; +} + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/** + * @brief Constructor. + * @param rcusvc RCU service instance. + * @param CLID of the most-derived @c CondCont. + * @param id CLID+key for this object. + * @param proxy @c DataProxy for this object. + * @param capacity Initial capacity of the container. + */ +template <class T> +inline +CondContMixed<T>::CondContMixed (Athena::IRCUSvc& rcusvc, + CLID clid, + const DataObjID& id, + SG::DataProxy* proxy, + size_t capacity) + : Base (rcusvc, clid, id, proxy, payloadDelfcn, capacity) +{ + CondContMixed<T>::registerBaseInit(); +} + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/** + * @brief Helper to ensure that the inheritance information for this class + * gets initialized. + */ +template <class T> +void CondContMixed<T>::registerBaseInit() +{ + static const SG::RegisterBaseInit<CondContMixed> rbi; +} + + diff --git a/Control/AthenaKernel/share/CondCont_test.ref b/Control/AthenaKernel/share/CondCont_test.ref index ba5de68b9be3..e85d4d97ab2a 100644 --- a/Control/AthenaKernel/share/CondCont_test.ref +++ b/Control/AthenaKernel/share/CondCont_test.ref @@ -1,5 +1,5 @@ test1 -ClassIDSvc INFO getRegistryEntries: read 51 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 52 CLIDRegistry entries for module ALL UNKNOWN_CLASS:c... ERROR CondContBase::insertBase: EventIDRange {[40,l:2] - [t:543]} is neither fully RunEvent nor TimeStamp UNKNOWN_CLASS:c... ERROR CondContBase::erase: Non-Run/LBN key used in Run/LBN container. UNKNOWN_CLASS:c... ERROR CondContBase::erase: Non-Timestamp key used in timestamp container. @@ -13,4 +13,14 @@ test2 UNKNOWN_CLASS:c... ERROR CondContBase::insertBase: EventIDRange {[40,l:2] - [t:543]} is neither fully RunEvent nor TimeStamp UNKNOWN_CLASS:c... ERROR CondCont<T>::insert: Not most-derived class; CLID used: 932847546; container CLID: 932847547 test3 +test4 +UNKNOWN_CLASS:c... ERROR CondContMixedBase::insertMixed: Run+lbn part of new range doesn't match existing range. New: {[2,t:150,l:10] - [2,t:150,l:15]}; existing: {[2,t:100,l:10] - [2,t:103.500000000,l:20]} +UNKNOWN_CLASS:c... ERROR CondContMixedBase::insertMixed: Range does not have both start and stop timestamps defined. +UNKNOWN_CLASS:c... ERROR CondContMixedBase::findMixed: No valid timestamp in key used with mixed container. +UNKNOWN_CLASS:c... ERROR CondContBase::findBase: Non-Run/LBN key used in Run/LBN container. +UNKNOWN_CLASS:c... ERROR CondContMixedBase::findMixed: No valid timestamp in key used with mixed container. +UNKNOWN_CLASS:c... ERROR CondContBase::findBase: Non-Run/LBN key used in Run/LBN container. +UNKNOWN_CLASS:c... ERROR CondContMixedBase::erase: erase() is not implemented for mixed containers. +UNKNOWN_CLASS:c... ERROR CondContMixedBase::extendLastRange: extendLastRange() is not implemented for mixed containers. testThread +testThreadMixed diff --git a/Control/AthenaKernel/src/CondCont.cxx b/Control/AthenaKernel/src/CondCont.cxx index d6731d51cf88..519e61aa7f10 100644 --- a/Control/AthenaKernel/src/CondCont.cxx +++ b/Control/AthenaKernel/src/CondCont.cxx @@ -10,6 +10,7 @@ #include "AthenaKernel/CondCont.h" #include "AthenaKernel/getMessageSvc.h" #include "CxxUtils/AthUnlikelyMacros.h" +#include "CxxUtils/checker_macros.h" #include "GaudiKernel/MsgStream.h" #include <iostream> @@ -94,20 +95,6 @@ void CondContBase::setProxy (SG::DataProxy* proxy) } -/** - * @brief Dump the container contents for debugging. - * @param ost Stream to which to write the dump. - */ -void CondContBase::list (std::ostream& ost) const -{ - ost << "id: " << m_id << " proxy: " << m_proxy << " [" - << m_condSet.size() << "] entries" << std::endl; - for (const typename CondContSet::value_type& ent : m_condSet.range()) { - ost << ent.first.m_range << " " << ent.second << std::endl; - } -} - - /** * @brief Dump the container to cout. For calling from the debugger. */ @@ -126,108 +113,6 @@ size_t CondContBase::entries() const } -/** - * @brief Return all IOV validity ranges defined in this container. - */ -std::vector<EventIDRange> -CondContBase::ranges() const -{ - std::vector<EventIDRange> r; - r.reserve (m_condSet.size()); - for (const typename CondContSet::value_type& ent : m_condSet.range()) { - r.push_back( ent.first.m_range ); - } - - return r; -} - - -/** - * @brief Insert a new conditions object. - * @param r Range of validity of this object. - * @param obj Pointer to the object being inserted. - * @param ctx Event context for the current thread. - * - * @c obj must point to an object of type @c T, - * except in the case of inheritance, where the type of @c obj must - * correspond to the most-derived @c CondCont type. - * The container will take ownership of this object. - * - * Returns SUCCESS if the object was successfully inserted; - * OVERLAP if the object was inserted but the range partially overlaps - * with an existing one; - * DUPLICATE if the object wasn't inserted because the range - * duplicates an existing one, and FAILURE otherwise - * (ownership of the object will be taken in any case). - */ -StatusCode -CondContBase::typelessInsert (const EventIDRange& r, - void* obj, - const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) -{ - return insertBase (r, - CondContSet::payload_unique_ptr (obj, m_condSet.delfcn()), - ctx); -} - - -/** - * @brief Return the mapped validity range for an IOV time. - * @param t IOV time to check. - * @param r[out] The range containing @c t. - * - * Returns true if @c t is mapped; false otherwise. - */ -bool -CondContBase::range(const EventIDBase& t, EventIDRange& r) const -{ - const EventIDRange* rp = nullptr; - if (findBase (t, &rp) != nullptr) { - r = *rp; - return true; - } - return false; -} - - -/** - * @brief Erase the first element not less than @c t. - * @param IOV time of element to erase. - * @param ctx Event context for the current thread. - */ -StatusCode CondContBase::erase (const EventIDBase& t, - const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) -{ - switch (m_keyType) { - case KeyType::RUNLBN: - if (!t.isRunLumi()) { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); - msg << MSG::ERROR << "CondContBase::erase: " - << "Non-Run/LBN key used in Run/LBN container." - << endmsg; - return StatusCode::FAILURE; - } - m_condSet.erase (CondContBase::keyFromRunLBN (t), ctx); - break; - case KeyType::TIMESTAMP: - if (!t.isTimeStamp()) { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); - msg << MSG::ERROR << "CondContBase::erase: " - << "Non-Timestamp key used in timestamp container." - << endmsg; - return StatusCode::FAILURE; - } - m_condSet.erase (CondContBase::keyFromTimestamp (t), ctx); - break; - case KeyType::SINGLE: - break; - default: - std::abort(); - } - return StatusCode::SUCCESS; -} - - /** * @brief Remove unused entries from the front of the list. * @param keys List of keys that may still be in use. @@ -286,63 +171,10 @@ size_t CondContBase::maxSize() const } -/** - * @brief Extend the range of the last IOV. - * @param newRange New validity range. - * @param ctx Event context. - * - * Returns failure if the start time of @c newRange does not match the start time - * of the last IOV in the container. Otherwise, the end time for the last - * IOV is changed to the end time for @c newRange. (If the end time for @c newRange - * is before the end of the last IOV, then nothing is changed.) - */ -StatusCode -CondContBase::extendLastRange (const EventIDRange& newRange, - const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) -{ - key_type start; - key_type stop; - switch (m_keyType) { - case KeyType::RUNLBN: - if (!newRange.start().isRunLumi()) { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); - msg << MSG::ERROR << "CondContBase::extendLastRange: " - << "Non-Run/LBN range used in Run/LBN container." - << endmsg; - return StatusCode::FAILURE; - } - start = keyFromRunLBN (newRange.start()); - stop = keyFromRunLBN (newRange.stop()); - break; - case KeyType::TIMESTAMP: - if (!newRange.start().isTimeStamp()) { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); - msg << MSG::ERROR << "CondContBase::extendLastRange: " - << "Non-timestamp range used in timestamp container." - << endmsg; - return StatusCode::FAILURE; - } - start = keyFromTimestamp (newRange.start()); - stop = keyFromTimestamp (newRange.stop()); - break; - case KeyType::SINGLE: - // Empty container. - return StatusCode::FAILURE; - default: - std::abort(); - } - - if (m_condSet.extendLastRange (RangeKey (newRange, start, stop), ctx) != nullptr) - { - return StatusCode::SUCCESS; - } - return StatusCode::FAILURE; -} - - /** * @brief Internal constructor. * @param rcusvc RCU service instance. + * @param keyType Key type for this container. * @param CLID of the most-derived @c CondCont. * @param id CLID+key for this object. * @param proxy @c DataProxy for this object. @@ -350,12 +182,13 @@ CondContBase::extendLastRange (const EventIDRange& newRange, * @param capacity Initial capacity of the container. */ CondContBase::CondContBase (Athena::IRCUSvc& rcusvc, + KeyType keyType, CLID clid, const DataObjID& id, SG::DataProxy* proxy, CondContSet::delete_function* delfcn, size_t capacity) - : m_keyType (KeyType::SINGLE), + : m_keyType (keyType), m_clid (clid), m_id (id), m_proxy (proxy), @@ -391,12 +224,26 @@ CondContBase::insertBase (const EventIDRange& r, key_type start_key, stop_key; - if (start.isTimeStamp() && stop.isTimeStamp()) { + if (m_keyType == KeyType::MIXED) { + if (start.run_number() == EventIDBase::UNDEFNUM || + stop.run_number() == EventIDBase::UNDEFNUM) + { + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContBase::insertBase: " + << "Run part of range invalid in mixed container." + << endmsg; + return StatusCode::FAILURE; + } + + start_key = keyFromRunLBN (start); + stop_key = keyFromRunLBN (stop); + } + else if (start.isTimeStamp() && stop.isTimeStamp()) { if (m_keyType == KeyType::SINGLE) { m_keyType = KeyType::TIMESTAMP; } else if (m_keyType != KeyType::TIMESTAMP) { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); + MsgStream msg (Athena::getMessageSvc(), title()); msg << MSG::ERROR << "CondContBase::insertBase: " << "Timestamp key used in non-timestamp container." << endmsg; @@ -414,7 +261,7 @@ CondContBase::insertBase (const EventIDRange& r, m_keyType = KeyType::RUNLBN; } else if (m_keyType != KeyType::RUNLBN) { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); + MsgStream msg (Athena::getMessageSvc(), title()); msg << MSG::ERROR << "CondContBase::insertBase: " << "Run/LBN key used in non-Run/LBN container." << endmsg; @@ -426,7 +273,7 @@ CondContBase::insertBase (const EventIDRange& r, } else { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); + MsgStream msg (Athena::getMessageSvc(), title()); msg << MSG::ERROR << "CondContBase::insertBase: EventIDRange " << r << " is neither fully RunEvent nor TimeStamp" << endmsg; @@ -449,6 +296,99 @@ CondContBase::insertBase (const EventIDRange& r, } +/** + * @brief Erase the first element not less than @c t. + * @param IOV time of element to erase. + * @param ctx Event context for the current thread. + */ +StatusCode +CondContBase::eraseBase (const EventIDBase& t, + const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) +{ + switch (m_keyType) { + case KeyType::RUNLBN: + if (!t.isRunLumi()) { + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContBase::erase: " + << "Non-Run/LBN key used in Run/LBN container." + << endmsg; + return StatusCode::FAILURE; + } + m_condSet.erase (CondContBase::keyFromRunLBN (t), ctx); + break; + case KeyType::TIMESTAMP: + if (!t.isTimeStamp()) { + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContBase::erase: " + << "Non-Timestamp key used in timestamp container." + << endmsg; + return StatusCode::FAILURE; + } + m_condSet.erase (CondContBase::keyFromTimestamp (t), ctx); + break; + case KeyType::SINGLE: + break; + default: + std::abort(); + } + return StatusCode::SUCCESS; +} + + +/** + * @brief Extend the range of the last IOV. + * @param newRange New validity range. + * @param ctx Event context. + * + * Returns failure if the start time of @c newRange does not match the start time + * of the last IOV in the container. Otherwise, the end time for the last + * IOV is changed to the end time for @c newRange. (If the end time for @c newRange + * is before the end of the last IOV, then nothing is changed.) + */ +StatusCode +CondContBase::extendLastRangeBase (const EventIDRange& newRange, + const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) +{ + key_type start; + key_type stop; + switch (m_keyType) { + case KeyType::RUNLBN: + if (!newRange.start().isRunLumi()) { + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContBase::extendLastRange: " + << "Non-Run/LBN range used in Run/LBN container." + << endmsg; + return StatusCode::FAILURE; + } + start = keyFromRunLBN (newRange.start()); + stop = keyFromRunLBN (newRange.stop()); + break; + case KeyType::TIMESTAMP: + if (!newRange.start().isTimeStamp()) { + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContBase::extendLastRange: " + << "Non-timestamp range used in timestamp container." + << endmsg; + return StatusCode::FAILURE; + } + start = keyFromTimestamp (newRange.start()); + stop = keyFromTimestamp (newRange.stop()); + break; + case KeyType::SINGLE: + // Empty container. + return StatusCode::FAILURE; + default: + std::abort(); + } + + if (m_condSet.extendLastRange (RangeKey (newRange, start, stop), ctx) != nullptr) + { + return StatusCode::SUCCESS; + } + return StatusCode::FAILURE; +} + + /** * @brief Internal lookup function. * @param clid CLID for the desired pointer type. @@ -466,8 +406,9 @@ const void* CondContBase::findBase (const EventIDBase& t, key_type key; switch (m_keyType) { case KeyType::RUNLBN: + case KeyType::MIXED: if (ATH_UNLIKELY (!t.isRunLumi())) { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); + MsgStream msg (Athena::getMessageSvc(), title()); msg << MSG::ERROR << "CondContBase::findBase: " << "Non-Run/LBN key used in Run/LBN container." << endmsg; @@ -477,7 +418,7 @@ const void* CondContBase::findBase (const EventIDBase& t, break; case KeyType::TIMESTAMP: if (ATH_UNLIKELY (!t.isTimeStamp())) { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); + MsgStream msg (Athena::getMessageSvc(), title()); msg << MSG::ERROR << "CondContBase::findBase: " << "Non-timestamp key used in timestamp container." << endmsg; @@ -530,9 +471,464 @@ void CondContBase::setCleanerSvcName (const std::string& name) */ void CondContBase::insertError (CLID usedCLID) const { - MsgStream msg (Athena::getMessageSvc(), m_id.fullKey()); + MsgStream msg (Athena::getMessageSvc(), title()); msg << MSG::ERROR << "CondCont<T>::insert: Not most-derived class; " << "CLID used: " << usedCLID << "; container CLID: " << m_clid << endmsg; } + + +/** + * @brief Return the deletion function for this container. + */ +CondContBase::delete_function* CondContBase::delfcn() const +{ + return m_condSet.delfcn(); +} + + +/** + * @brief Description of this container to use for Msgstream. + */ +std::string CondContBase::title() const +{ + return m_id.fullKey(); +} + + +//**************************************************************************** + + +/** + * @brief Dump the container contents for debugging. + * @param ost Stream to which to write the dump. + */ +void CondContSingleBase::list (std::ostream& ost) const +{ + ost << "id: " << id() << " proxy: " << proxy() << " [" + << entries() << "] entries" << std::endl; + forEach ([&] (const CondContSet::value_type& ent) + { ost << ent.first.m_range << " " << ent.second << std::endl; }); +} + + +/** + * @brief Return all IOV validity ranges defined in this container. + */ +std::vector<EventIDRange> +CondContSingleBase::ranges() const +{ + std::vector<EventIDRange> r; + r.reserve (entries()); + + forEach ([&] (const CondContSet::value_type& ent) + { r.push_back (ent.first.m_range); }); + + return r; +} + + +/** + * @brief Insert a new conditions object. + * @param r Range of validity of this object. + * @param obj Pointer to the object being inserted. + * @param ctx Event context for the current thread. + * + * @c obj must point to an object of type @c T, + * except in the case of inheritance, where the type of @c obj must + * correspond to the most-derived @c CondCont type. + * The container will take ownership of this object. + * + * Returns SUCCESS if the object was successfully inserted; + * OVERLAP if the object was inserted but the range partially overlaps + * with an existing one; + * DUPLICATE if the object wasn't inserted because the range + * duplicates an existing one, and FAILURE otherwise + * (ownership of the object will be taken in any case). + */ +StatusCode +CondContSingleBase::typelessInsert (const EventIDRange& r, + void* obj, + const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) +{ + return insertBase (r, + CondContSet::payload_unique_ptr (obj, delfcn()), + ctx); +} + + +/** + * @brief Return the mapped validity range for an IOV time. + * @param t IOV time to check. + * @param r[out] The range containing @c t. + * + * Returns true if @c t is mapped; false otherwise. + */ +bool +CondContSingleBase::range (const EventIDBase& t, EventIDRange& r) const +{ + const EventIDRange* rp = nullptr; + if (findBase (t, &rp) != nullptr) { + r = *rp; + return true; + } + return false; +} + + +/** + * @brief Erase the first element not less than @c t. + * @param IOV time of element to erase. + * @param ctx Event context for the current thread. + */ +StatusCode +CondContSingleBase::erase (const EventIDBase& t, + const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) +{ + return CondContBase::eraseBase (t, ctx); +} + + +/** + * @brief Extend the range of the last IOV. + * @param newRange New validity range. + * @param ctx Event context. + * + * Returns failure if the start time of @c newRange does not match the start time + * of the last IOV in the container. Otherwise, the end time for the last + * IOV is changed to the end time for @c newRange. (If the end time for @c newRange + * is before the end of the last IOV, then nothing is changed.) + */ +StatusCode +CondContSingleBase::extendLastRange (const EventIDRange& newRange, + const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) +{ + return CondContBase::extendLastRangeBase (newRange, ctx); +} + + +/** + * @brief Internal constructor. + * @param rcusvc RCU service instance. + * @param CLID of the most-derived @c CondCont. + * @param id CLID+key for this object. + * @param proxy @c DataProxy for this object. + * @param delfcn Deletion function for the actual payload type. + * @param capacity Initial capacity of the container. + */ +CondContSingleBase::CondContSingleBase (Athena::IRCUSvc& rcusvc, + CLID clid, + const DataObjID& id, + SG::DataProxy* proxy, + CondContSet::delete_function* delfcn, + size_t capacity) + : CondContBase (rcusvc, KeyType::SINGLE, clid, id, proxy, delfcn, capacity) +{ +} + + +//**************************************************************************** + + +/** + * @brief Internal constructor. + * @param rcusvc RCU service instance. + * @param CLID of the most-derived @c CondCont. + * @param id CLID+key for this object. + * @param proxy @c DataProxy for this object. + * @param payloadDelfcn Deletion function for the actual payload type. + * @param capacity Initial capacity of the container. + */ +CondContMixedBase::CondContMixedBase (Athena::IRCUSvc& rcusvc, + CLID clid, + const DataObjID& id, + SG::DataProxy* proxy, + CondContSet::delete_function* payloadDelfcn, + size_t capacity) + : CondContBase (rcusvc, KeyType::MIXED, clid, id, proxy, delfcn, capacity), + m_rcusvc (rcusvc), + m_payloadDelfcn (payloadDelfcn) +{ +} + + +/** + * @brief Dump the container contents for debugging. + * @param ost Stream to which to write the dump. + */ +void CondContMixedBase::list (std::ostream& ost) const +{ + ost << "id: " << id() << " proxy: " << proxy() << " [" + << entries() << "] run+lbn entries" << std::endl; + forEach ([&] (const CondContSet::value_type& ent) + { + const CondContSet* tsmap = + reinterpret_cast<const CondContSet*> (ent.second); + for (const CondContSet::value_type& ent2 : tsmap->range()) { + ost << ent2.first.m_range << " " << ent2.second << std::endl; + } + }); +} + + +/** + * @brief Return all IOV validity ranges defined in this container. + */ +std::vector<EventIDRange> +CondContMixedBase::ranges() const +{ + std::vector<EventIDRange> r; + r.reserve (entries()*2); + + forEach ([&] (const CondContSet::value_type& ent) + { + const CondContSet* tsmap = + reinterpret_cast<const CondContSet*> (ent.second); + for (const CondContSet::value_type& ent2 : tsmap->range()) { + r.push_back (ent2.first.m_range); + } + }); + + return r; +} + + +/** + * @brief Insert a new conditions object. + * @param r Range of validity of this object. + * @param obj Pointer to the object being inserted. + * @param ctx Event context for the current thread. + * + * @c obj must point to an object of type @c T, + * except in the case of inheritance, where the type of @c obj must + * correspond to the most-derived @c CondCont type. + * The container will take ownership of this object. + * + * Returns SUCCESS if the object was successfully inserted; + * OVERLAP if the object was inserted but the range partially overlaps + * with an existing one; + * DUPLICATE if the object wasn't inserted because the range + * duplicates an existing one, and FAILURE otherwise + * (ownership of the object will be taken in any case). + */ +StatusCode +CondContMixedBase::typelessInsert (const EventIDRange& r, + void* obj, + const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) +{ + return insertMixed (r, + CondContSet::payload_unique_ptr (obj, payloadDelfcn()), + ctx); +} + + +/** + * @brief Return the mapped validity range for an IOV time. + * @param t IOV time to check. + * @param r[out] The range containing @c t. + * + * Returns true if @c t is mapped; false otherwise. + */ +bool +CondContMixedBase::range (const EventIDBase& t, EventIDRange& r) const +{ + const EventIDRange* rp = nullptr; + if (findMixed (t, &rp) != nullptr) { + r = *rp; + return true; + } + return false; +} + + +/** + * @brief Erase the first element not less than @c t. + * @param IOV time of element to erase. + * @param ctx Event context for the current thread. + * + * This is not implemented for mixed containers. + */ +StatusCode +CondContMixedBase::erase (const EventIDBase& /*t*/, + const EventContext& /*ctx = Gaudi::Hive::currentContext()*/) +{ + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContMixedBase::erase: " + << "erase() is not implemented for mixed containers." + << endmsg; + return StatusCode::FAILURE; +} + + +/** + * @brief Extend the range of the last IOV. + * @param newRange New validity range. + * @param ctx Event context. + * + * Returns failure if the start time of @c newRange does not match the start time + * of the last IOV in the container. Otherwise, the end time for the last + * IOV is changed to the end time for @c newRange. (If the end time for @c newRange + * is before the end of the last IOV, then nothing is changed.) + * + * This is not implemented for mixed containers. + */ +StatusCode +CondContMixedBase::extendLastRange (const EventIDRange& /*newRange*/, + const EventContext& /*ctx = Gaudi::Hive::currentContext()*/) +{ + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContMixedBase::extendLastRange: " + << "extendLastRange() is not implemented for mixed containers." + << endmsg; + return StatusCode::FAILURE; +} + + +/** + * @brief Insert a new conditions object. + * @param r Range of validity of this object. + * @param t Pointer to the object being inserted. + * @param ctx Event context for the current thread. + * + * Returns SUCCESS if the object was successfully inserted; + * OVERLAP if the object was inserted but the range partially overlaps + * with an existing one; + * DUPLICATE if the object wasn't inserted because the range + * duplicates an existing one, and FAILURE otherwise + * (ownership of the object will be taken in any case). + */ +StatusCode +CondContMixedBase::insertMixed (const EventIDRange& r, + CondContBase::CondContSet::payload_unique_ptr t, + const EventContext& ctx /*= Gaudi::Hive::currentContext()*/) +{ + // Serialize insertions. This may not actually be needed, but just in case. + std::lock_guard<std::mutex> lock (m_mutex); + + const EventIDRange* range = nullptr; + const void* tsmap_void = findBase (r.start(), &range); + CondContSet* tsmap ATLAS_THREAD_SAFE = + const_cast<CondContSet*>(reinterpret_cast<const CondContSet*> (tsmap_void)); + + StatusCode sc = StatusCode::SUCCESS; + sc.ignore(); + if (tsmap) { + if (r.start().run_number() != range->start().run_number() || + r.stop().run_number() != range->stop().run_number() || + r.start().lumi_block() != range->start().lumi_block() || + r.stop().lumi_block() != range->stop().lumi_block()) + { + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContMixedBase::insertMixed: " + << "Run+lbn part of new range doesn't match existing range. " + << "New: " << r << "; existing: " << *range + << endmsg; + return StatusCode::FAILURE; + } + } + else { + auto newmap = std::make_unique<CondContSet> + (Updater_t (m_rcusvc, m_payloadDelfcn), m_payloadDelfcn, 16); + tsmap = newmap.get(); + sc = insertBase (r, std::move (newmap), ctx); + if (sc.isFailure()) { + return sc; + } + else if (Category::isDuplicate (sc)) { + // Shouldn't happen... + std::abort(); + } + } + + if (!r.start().isTimeStamp() || !r.stop().isTimeStamp()) + { + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContMixedBase::insertMixed: " + << "Range does not have both start and stop timestamps defined." + << endmsg; + return StatusCode::FAILURE; + } + + key_type start_key = keyFromTimestamp (r.start()); + key_type stop_key = keyFromTimestamp (r.stop()); + + CondContSet::EmplaceResult reslt = + tsmap->emplace ( RangeKey(r, start_key, stop_key), + std::move(t), ctx ); + + if (reslt == CondContSet::EmplaceResult::DUPLICATE) + { + return CondContStatusCode::DUPLICATE; + } + else if (reslt == CondContSet::EmplaceResult::OVERLAP) { + return CondContStatusCode::OVERLAP; + } + + return sc; +} + + +/** + * @brief Internal lookup function. + * @param t IOV time to find. + * @param r If non-null, copy validity range of the object here. + * + * Looks up the conditions object corresponding to the IOV time @c t. + * If found, return the pointer (as a pointer to the payload type + * of the most-derived CondCont). Otherwise, return nullptr. + */ +const void* +CondContMixedBase::findMixed (const EventIDBase& t, + EventIDRange const** r) const +{ + const void* ptr = CondContBase::findBase (t, nullptr); + if (!ptr) return nullptr; + + if (!t.isTimeStamp()) { + MsgStream msg (Athena::getMessageSvc(), title()); + msg << MSG::ERROR << "CondContMixedBase::findMixed: " + << "No valid timestamp in key used with mixed container." + << endmsg; + return nullptr; + } + + const CondContSet* tsmap = reinterpret_cast<const CondContSet*> (ptr); + key_type key = keyFromTimestamp (t); + CondContSet::const_iterator it = tsmap->find (key); + + if (it && key < it->first.m_stop) { + if (r) { + *r = &it->first.m_range; + } + ptr = it->second; + } + else { + ptr = nullptr; + } + + return ptr; +} + + +/** + * @brief Return the payload deletion function for this container. + */ +CondContBase::delete_function* CondContMixedBase::payloadDelfcn() const +{ + return m_payloadDelfcn; +} + + +/** + * @brief Do pointer conversion for the payload type. + * @param clid CLID for the desired pointer type. + * @param ptr Pointer of type @c T*. + * + * This just aborts, since we don't currently implement inheritance + * for mixed types. + */ +const void* CondContMixedBase::doCast (CLID /*clid*/, const void* /*ptr*/) const +{ + std::abort(); +} diff --git a/Control/AthenaKernel/test/CondCont_test.cxx b/Control/AthenaKernel/test/CondCont_test.cxx index 4b7baabe3213..4bc3b0aef41d 100644 --- a/Control/AthenaKernel/test/CondCont_test.cxx +++ b/Control/AthenaKernel/test/CondCont_test.cxx @@ -130,6 +130,14 @@ CONDCONT_BASE(D, B); CLASS_DEF(CondCont<B>, 932847546, 0) CLASS_DEF(CondCont<D>, 932847547, 0) +CLASS_DEF(CondContMixed<B>, 932847548, 0) + + +bool succ (StatusCode sc) +{ + return sc.getCode() == static_cast<StatusCode::code_t>(StatusCode::SUCCESS); +} + EventIDBase runlbn (int run, int lbn) { @@ -149,6 +157,16 @@ EventIDBase timestamp (int t) } +EventIDBase mixed (int run, int lbn, float t) +{ + return EventIDBase (run, // run + EventIDBase::UNDEFEVT, // event + int(t), + int((t - int(t)) * 1e9), // timestamp ns + lbn); +} + + const EventIDRange r1 (runlbn (10, 15), runlbn (10, 20)); const EventIDRange r2 (runlbn (20, 17), runlbn (EventIDBase::UNDEFNUM/2, EventIDBase::UNDEFNUM/2)); const EventIDRange r3 (timestamp (123), timestamp (456)); @@ -183,9 +201,9 @@ void fillit (CondCont<T>& cc_rl, CondCont<T>& cc_ts, std::vector<T*> & ptrs) ptrs.push_back (new T(2)); ptrs.push_back (new T(3)); - assert( cc_rl.typelessInsert (r1, ptrs[0]).isSuccess() ); - assert( cc_rl.typelessInsert (r2, ptrs[1]).isSuccess() ); - assert( cc_ts.insert (r3, std::unique_ptr<T> (ptrs[2])).isSuccess() ); + assert(succ( cc_rl.typelessInsert (r1, ptrs[0]) )); + assert(succ( cc_rl.typelessInsert (r2, ptrs[1]) )); + assert(succ( cc_ts.insert (r3, std::unique_ptr<T> (ptrs[2])) )); { StatusCode sc = cc_ts.insert (r3, std::make_unique<T> (99)); assert (sc.isSuccess()); @@ -421,7 +439,155 @@ void test3 (TestRCUSvc& rcusvc) } -//******************************************************************************* +class CondContMixedTest + : public CondContMixed<B> +{ +public: + CondContMixedTest (Athena::IRCUSvc& rcusvc, const DataObjID& id) + : CondContMixed<B> (rcusvc, ClassID_traits<CondContMixed<B> >::ID(), + id, nullptr, 16) + { + } +}; + + +// Testing mixed keys. +void test4 (TestRCUSvc& rcusvc) +{ + std::cout << "test4\n"; + DataObjID id ("cls", "key"); + + std::vector<B*> bptrs; + for (int i=0; i < 6; i++) { + bptrs.push_back (new B(i+1)); + } + + // Insert + + CondContMixedTest cc (rcusvc, id); + assert (cc.keyType() == CondContBase::KeyType::MIXED); + + assert (succ (cc.insert (EventIDRange (mixed(1, 10, 1), + mixed(1, 20, 2)), + std::unique_ptr<B>(bptrs[0]))) ); + assert (succ (cc.insert (EventIDRange (mixed(1, 10, 2), + mixed(1, 20, 4.5)), + std::unique_ptr<B>(bptrs[1]))) ); + + assert (succ (cc.insert (EventIDRange (mixed(1, 30, 25), + mixed(1, 40, 30)), + std::unique_ptr<B>(bptrs[2]))) ); + + assert (succ (cc.insert (EventIDRange (mixed(2, 10, 100), + mixed(2, 20, 103.5)), + std::unique_ptr<B>(bptrs[3]))) ); + assert (succ (cc.insert (EventIDRange (mixed(2, 10, 103.5), + mixed(2, 20, 110)), + std::unique_ptr<B>(bptrs[4]))) ); + assert (succ (cc.typelessInsert (EventIDRange (mixed(2, 10, 120), + mixed(2, 20, 130)), + bptrs[5])) ); + + assert (cc.insert (EventIDRange (mixed(2, 10, 150), + mixed(2, 15, 150)), + std::make_unique<B>(7)).isFailure()); + assert (cc.insert (EventIDRange (mixed(2, 10, 150), + runlbn(2, 20)), + std::make_unique<B>(8)).isFailure()); + + StatusCode sc = cc.insert (EventIDRange (mixed(2, 10, 120), + mixed(2, 20, 130)), + std::make_unique<B>(9)); + assert (sc.isSuccess()); + assert (CondContBase::Category::isDuplicate (sc)); + + + // List + std::ostringstream ss1; + cc.list (ss1); + std::ostringstream exp1; + exp1 << "id: ( 'UNKNOWN_CLASS:cls' , 'key' ) proxy: 0 [3] run+lbn entries\n"; + exp1 << "{[1,t:1,l:10] - [1,t:2,l:20]} " << bptrs[0] << "\n"; + exp1 << "{[1,t:2,l:10] - [1,t:4.500000000,l:20]} " << bptrs[1] << "\n"; + exp1 << "{[1,t:25,l:30] - [1,t:30,l:40]} " << bptrs[2] << "\n"; + exp1 << "{[2,t:100,l:10] - [2,t:103.500000000,l:20]} " << bptrs[3] << "\n"; + exp1 << "{[2,t:103.500000000,l:10] - [2,t:110,l:20]} " << bptrs[4] << "\n"; + exp1 << "{[2,t:120,l:10] - [2,t:130,l:20]} " << bptrs[5] << "\n"; + //std::cout << "ss1: " << ss1.str() << "\nexp1: " << exp1.str() << "\n"; + assert (ss1.str() == exp1.str()); + + + // Ranges + std::vector<EventIDRange> rvec = cc.ranges(); + assert (rvec.size() == 6); + assert (rvec[0] == EventIDRange (mixed(1, 10, 1), mixed(1, 20, 2))); + assert (rvec[1] == EventIDRange (mixed(1, 10, 2), mixed(1, 20, 4.5))); + assert (rvec[2] == EventIDRange (mixed(1, 30, 25), mixed(1, 40, 30))); + assert (rvec[3] == EventIDRange (mixed(2, 10, 100), mixed(2, 20, 103.5))); + assert (rvec[4] == EventIDRange (mixed(2, 10, 103.5), mixed(2, 20, 110))); + assert (rvec[5] == EventIDRange (mixed(2, 10, 120), mixed(2, 20, 130))); + + + // Find + const EventIDRange* range = nullptr; + const B* obj = nullptr; + assert (!cc.find (runlbn(1, 10), obj, &range)); + assert (!cc.find (timestamp(110), obj, &range)); + + assert (cc.find (mixed(1, 12, 3), obj, &range)); + assert (obj->m_x == 2); + assert (*range == EventIDRange (mixed(1, 10, 2), mixed(1, 20, 4.5))); + + assert (cc.find (mixed(1, 35, 25), obj, &range)); + assert (obj->m_x == 3); + assert (*range == EventIDRange (mixed(1, 30, 25), mixed(1, 40, 30))); + + assert (cc.find (mixed(2, 12, 103.7), obj, &range)); + assert (obj->m_x == 5); + assert (*range == EventIDRange (mixed(2, 10, 103.5), mixed(2, 20, 110))); + + assert (!cc.find (mixed(1, 12, 10), obj, &range)); + assert (!cc.find (mixed(1, 8, 3), obj, &range)); + assert (!cc.find (mixed(1, 35, 20), obj, &range)); + assert (!cc.find (mixed(2, 15, 115), obj, &range)); + + + // Valid + assert (!cc.valid (runlbn(1, 10))); + assert (!cc.valid (timestamp(110))); + + assert (cc.valid (mixed(1, 12, 3))); + assert (cc.valid (mixed(1, 35, 25))); + assert (cc.valid (mixed(2, 12, 103.7))); + + assert (!cc.valid (mixed(1, 12, 10))); + assert (!cc.valid (mixed(1, 8, 3))); + assert (!cc.valid (mixed(1, 35, 20))); + assert (!cc.valid (mixed(2, 15, 115))); + + + // Range + EventIDRange r2; + assert (cc.range (mixed(1, 35, 25), r2)); + assert (r2 == EventIDRange (mixed(1, 30, 25), mixed(1, 40, 30))); + assert (!cc.range (mixed(1, 35, 20), r2)); + + + // Insert w/overlap + sc = cc.insert (EventIDRange (mixed (2, 10, 125), + mixed (2, 20, 127)), + std::make_unique<B> (11)); + assert (CondContBase::Category::isOverlap (sc)); + + + // Erase/extendLastRange + assert (cc.erase (mixed(2, 10, 100)).isFailure()); + assert (cc.extendLastRange (EventIDRange (mixed(2, 10, 125), + mixed(2, 20, 200))).isFailure()); +} + + +//****************************************************************************** std::shared_timed_mutex start_mutex; @@ -631,6 +797,210 @@ void testThread (TestRCUSvc& rcusvc) } +//****************************************************************************** + + +class testThread_MixedWriter + : public testThread_Base +{ +public: + testThread_MixedWriter (int slot, CondContMixedTest& map); + void operator()(); + EventIDRange makeRange (int i); + +private: + CondContMixedTest& m_map; +}; + + +testThread_MixedWriter::testThread_MixedWriter (int slot, CondContMixedTest& map) + : testThread_Base (slot), + m_map (map) +{ +} + + +void testThread_MixedWriter::operator()() +{ + setContext(); + std::shared_lock<std::shared_timed_mutex> lock (start_mutex); + + for (int i=0; i < nwrites; i++) { + if (i >= ninflight/2) { + std::vector<CondContBase::key_type> keys; + keys.reserve (ninflight/2); + for (int j = i/2-ninflight/2; j<i/2; j++) { + keys.push_back (j); + } + m_map.trim (keys); + } + EventIDRange r = makeRange(i); + int payload = r.start().lumi_block() + r.start().time_stamp(); + assert (m_map.insert (r, std::make_unique<B> (payload), ctx()).isSuccess()); + m_map.quiescent (ctx()); + if (((i+1)%128) == 0) { + usleep (1000); + } + } +} + + +EventIDRange testThread_MixedWriter::makeRange (int i) +{ + // 111111111 + // 0123456789012345678 // i + // + // 0011223344556677889 // lb + // 0112233445566778899 // ts + + unsigned int lbn = i / 2; + unsigned int ts = (i+1)/2 * 1000; + EventIDBase start (0, 0, ts, 0, lbn); + EventIDBase stop (0, 0, ts+1, 0, lbn+1); + return EventIDRange (start, stop); +} + + +class testThread_MixedIterator + : public testThread_Base +{ +public: + testThread_MixedIterator (int slot, CondContMixedTest& map); + void operator()(); + +private: + CondContMixedTest& m_map; +}; + + +testThread_MixedIterator::testThread_MixedIterator (int slot, CondContMixedTest& map) + : testThread_Base (slot), + m_map (map) +{ +} + + +void testThread_MixedIterator::operator()() +{ + setContext(); + std::shared_lock<std::shared_timed_mutex> lock (start_mutex); + + bool full = false; + while (true) { + int sz = static_cast<int>(m_map.entries()); + if (full) { + assert (std::abs (sz - ninflight/2) <= 1); + } + std::vector<EventIDRange> rvec = m_map.ranges(); + sz = rvec.size(); + if (full) { + assert (std::abs (sz - ninflight) <= 2); + } + + if (sz >= ninflight) { + full = true; + } + + for (const EventIDRange& r : rvec) { + const B* obj; + if (m_map.find (r.start(), obj)) { + assert (obj->m_x == static_cast<int>(r.start().lumi_block() + r.start().time_stamp())); + } + } + + if (sz > 0 && (rvec.end()-1)->start().lumi_block() == (nwrites-1)/2) break; + + m_map.quiescent (ctx()); + } +} + + +class testThread_MixedReader + : public testThread_Base +{ +public: + testThread_MixedReader (int slot, CondContMixedTest& map); + void operator()(); + +private: + CondContMixedTest& m_map; + uint32_t m_seed; +}; + + +testThread_MixedReader::testThread_MixedReader (int slot, CondContMixedTest& map) + : testThread_Base (slot), + m_map (map), + m_seed (slot * 123) +{ +} + + +void testThread_MixedReader::operator()() +{ + setContext(); + std::shared_lock<std::shared_timed_mutex> lock (start_mutex); + + while (true) { + std::vector<EventIDRange> rvec = m_map.ranges(); + if (rvec.empty()) continue; + const EventIDBase& stop = (rvec.end()-1)->stop(); + const EventIDBase& start = rvec.begin()->start(); + unsigned int lb = Athena_test::randi_seed (m_seed, + stop.lumi_block()-1, + start.lumi_block()); + unsigned int ts = Athena_test::randi_seed (m_seed, + stop.time_stamp()-1, + start.time_stamp()); + EventIDBase key (0, 0, ts, 0, lb); + const B* obj = nullptr; + const EventIDRange* rr = nullptr; + if (m_map.find (key, obj, &rr)) { + assert (lb >= rr->start().lumi_block() && lb < rr->stop().lumi_block()); + assert (ts >= rr->start().time_stamp() && ts < rr->stop().time_stamp()); + assert (obj->m_x == static_cast<int> (rr->start().lumi_block() + rr->start().time_stamp())); + } + + if ((rvec.end()-1)->start().lumi_block() == (nwrites-1)/2) break; + m_map.quiescent (ctx()); + } +} + + +void testThreadMixed_iter (TestRCUSvc& rcusvc) +{ + DataObjID id ("cls", "key"); + CondContMixedTest condcont (rcusvc, id); + + const int nthread = 4; + std::thread threads[nthread]; + start_mutex.lock(); + + threads[0] = std::thread (testThread_MixedWriter (0, condcont)); + threads[1] = std::thread (testThread_MixedIterator (1, condcont)); + threads[2] = std::thread (testThread_MixedReader (2, condcont)); + threads[3] = std::thread (testThread_MixedReader (3, condcont)); + + // Try to get the threads starting as much at the same time as possible. + start_mutex.unlock(); + for (int i=0; i < nthread; i++) + threads[i].join(); +} + + +void testThreadMixed (TestRCUSvc& rcusvc) +{ + std::cout << "testThreadMixed\n"; + + for (int i=0; i < 10; i++) { + testThreadMixed_iter (rcusvc); + } +} + + +//****************************************************************************** + + int main ATLAS_NOT_THREAD_SAFE () { CondContBase::setCleanerSvcName ("ConditionsCleanerTest"); @@ -647,6 +1017,8 @@ int main ATLAS_NOT_THREAD_SAFE () test1 (rcusvc); test2 (rcusvc); test3 (rcusvc); + test4 (rcusvc); testThread (rcusvc); + testThreadMixed (rcusvc); return 0; } diff --git a/Control/AthenaServices/src/DelayedConditionsCleanerSvc.cxx b/Control/AthenaServices/src/DelayedConditionsCleanerSvc.cxx index 761ce45eb046..ea73fc3415fa 100644 --- a/Control/AthenaServices/src/DelayedConditionsCleanerSvc.cxx +++ b/Control/AthenaServices/src/DelayedConditionsCleanerSvc.cxx @@ -225,6 +225,7 @@ DelayedConditionsCleanerSvc::event (const EventContext& ctx, bool allowAsync) case KeyType::SINGLE: break; case KeyType::RUNLBN: + case KeyType::MIXED: ci_runlbn.push_back (ci); break; case KeyType::TIMESTAMP: diff --git a/Control/AthenaServices/test/ConditionsCleanerSvc_test.cxx b/Control/AthenaServices/test/ConditionsCleanerSvc_test.cxx index 90789b786eed..3215a0cceb3a 100644 --- a/Control/AthenaServices/test/ConditionsCleanerSvc_test.cxx +++ b/Control/AthenaServices/test/ConditionsCleanerSvc_test.cxx @@ -42,11 +42,43 @@ class CondContTest { public: CondContTest (Athena::IRCUSvc& rcusvc, const DataObjID& id) - : CondContBase (rcusvc, 123, id, nullptr, nullptr, 0) + : CondContBase (rcusvc, KeyType::SINGLE, 123, id, nullptr, nullptr, 0) {} virtual const void* doCast (CLID /*clid*/, const void* /*ptr*/) const override { std::abort(); } + + virtual + void list (std::ostream& /*ost*/) const override + { std::abort(); } + + virtual + std::vector<EventIDRange> ranges() const override + { std::abort(); } + + virtual + StatusCode typelessInsert (const EventIDRange& /*r*/, + void* /*obj*/, + const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override + { std::abort(); } + + virtual + bool valid( const EventIDBase& /*t*/) const override + { std::abort(); } + + virtual + bool range (const EventIDBase& /*t*/, EventIDRange& /*r*/) const override + { std::abort(); } + + virtual + StatusCode erase (const EventIDBase& /*t*/, + const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override + { std::abort(); } + + virtual + StatusCode extendLastRange (const EventIDRange& /*newRange*/, + const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override + { std::abort(); } }; diff --git a/Control/AthenaServices/test/DelayedConditionsCleanerSvc_test.cxx b/Control/AthenaServices/test/DelayedConditionsCleanerSvc_test.cxx index 115af550e5df..f36a61ef0304 100644 --- a/Control/AthenaServices/test/DelayedConditionsCleanerSvc_test.cxx +++ b/Control/AthenaServices/test/DelayedConditionsCleanerSvc_test.cxx @@ -72,7 +72,7 @@ public: static void delfcn (const void*) {} CondContTest (Athena::IRCUSvc& rcusvc, const DataObjID& id, int n, CondContBase::KeyType keyType) - : CondContBase (rcusvc, 123, id, nullptr, delfcn, 0), + : CondContBase (rcusvc, KeyType::SINGLE, 123, id, nullptr, delfcn, 0), m_n (n) { // Do a dummy insert to set the key type. @@ -113,7 +113,44 @@ public: return v; } + virtual + void list (std::ostream& /*ost*/) const override + { std::abort(); } + + virtual + bool valid( const EventIDBase& /*t*/) const override + { std::abort(); } + + virtual + bool range (const EventIDBase& /*t*/, EventIDRange& /*r*/) const override + { std::abort(); } + + virtual + StatusCode erase (const EventIDBase& /*t*/, + const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override + { std::abort(); } + virtual + std::vector<EventIDRange> ranges() const override + { std::abort(); } + + virtual + StatusCode typelessInsert (const EventIDRange& r, + void* obj, + const EventContext& ctx = Gaudi::Hive::currentContext()) override + { + return insertBase (r, + CondContSet::payload_unique_ptr (obj, delfcn), + ctx); + } + + + virtual + StatusCode extendLastRange (const EventIDRange& /*newRange*/, + const EventContext& /*ctx*/ = Gaudi::Hive::currentContext()) override + { std::abort(); } + + private: int m_n; std::list<std::vector<key_type> > m_keys; diff --git a/Control/DataModelTest/DataModelRunTests/share/CondReader.ref b/Control/DataModelTest/DataModelRunTests/share/CondReader.ref index 6ea310e1a799..949f0f0f2818 100644 --- a/Control/DataModelTest/DataModelRunTests/share/CondReader.ref +++ b/Control/DataModelTest/DataModelRunTests/share/CondReader.ref @@ -1,13 +1,13 @@ -Thu Dec 6 06:25:07 CET 2018 +Tue Dec 11 15:25:53 CET 2018 Preloading tcmalloc_minimal.so Py:Athena INFO including file "AthenaCommon/Preparation.py" -Py:Athena INFO using release [AthenaWorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3/fa0fd6d0989] -- built on [2018-12-06T0538] +Py:Athena INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3g/fc1ea6b7761] -- built on [2018-12-11T1514] Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO including file "DataModelRunTests/CondReader_jo.py" Py:Athena INFO including file "AthenaPoolCnvSvc/AthenaPool_jobOptions.py" -Py:ConfigurableDb INFO Read module info for 5473 configurables from 53 genConfDb files +Py:ConfigurableDb INFO Read module info for 5443 configurables from 42 genConfDb files Py:ConfigurableDb INFO No duplicates have been found: that's good ! Py:Athena INFO including file "DataModelRunTests/loadReadDicts.py" EventInfoMgtInit: Got release version Athena-22.0.1 @@ -18,7 +18,7 @@ ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to leve ApplicationMgr SUCCESS ==================================================================================================================================== Welcome to ApplicationMgr (GaudiCoreSvc v30r5) - running on lxplus077.cern.ch on Thu Dec 6 06:25:23 2018 + running on lxplus079.cern.ch on Tue Dec 11 15:26:12 2018 ==================================================================================================================================== ApplicationMgr INFO Successfully loaded modules : AthenaServices ApplicationMgr INFO Application Manager Configured successfully @@ -30,7 +30,7 @@ ClassIDSvc INFO getRegistryEntries: read 2946 CLIDRegistry entries fo CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) AthenaEventLoopMgr INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00 -ClassIDSvc INFO getRegistryEntries: read 1818 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 1877 CLIDRegistry entries for module ALL CondInputLoader INFO Initializing CondInputLoader... MetaDataSvc INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00 AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version AthenaPoolCnvSvc-00-00-00 @@ -38,8 +38,8 @@ PoolSvc INFO io_register[PoolSvc](xmlcatalog_file:PoolFileCatalog.x PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-local.cern.ch:8000/atlr)(serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca-proxy-meyrin.cern.ch:3128)(proxyurl=http://ca-proxy-wigner.cern.ch:3128)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data -DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-04T2300/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config -DBReplicaSvc INFO Total of 10 servers found for host lxplus077.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ] +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-10T2259/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config +DBReplicaSvc INFO Total of 10 servers found for host lxplus079.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ] PoolSvc INFO Successfully setup replica sorting algorithm PoolSvc INFO Setting up APR FileCatalog and Streams PoolSvc INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml @@ -49,20 +49,26 @@ IOVDbSvc INFO Opened read transaction for POOL PersistencySvc IOVDbSvc INFO Only 5 POOL conditions files will be open at once IOVDbSvc INFO Cache alignment will be done in 3 slices IOVDbFolder INFO Read from meta data only for folder /TagInfo -IOVDbSvc INFO Initialised with 2 connections and 3 folders +IOVDbSvc INFO Initialised with 2 connections and 5 folders IOVDbSvc INFO Service IOVDbSvc initialised successfully IOVDbSvc INFO preLoadAddresses: Removing folder /TagInfo. It should only be in the file meta data and was not found. IOVDbSvc INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200 -ClassIDSvc INFO getRegistryEntries: read 1341 CLIDRegistry entries for module ALL IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event +ClassIDSvc INFO getRegistryEntries: read 1341 CLIDRegistry entries for module ALL IOVDbSvc INFO Disconnecting from sqlite://;schema=condtest.db;dbname=OFLP200 +IOVDbSvc INFO Added taginfo remove for /DMTest/RLTest IOVDbSvc INFO Added taginfo remove for /DMTest/S2 +IOVDbSvc INFO Added taginfo remove for /DMTest/TSTest IOVDbSvc INFO Added taginfo remove for /DMTest/TestAttrList CondInputLoader INFO Adding base classes: + + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) -> + + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) -> + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) -> + ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' ) -> DMTest::S1 (243020043) CondInputLoader INFO Will create WriteCondHandle dependencies for the following DataObjects: + + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) + + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) + ( 'DMTest::S1' , 'ConditionStore+/DMTest/S2' ) + ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' ) @@ -73,7 +79,9 @@ HistogramPersis...WARNING Histograms saving not required. EventSelector INFO Enter McEventSelector Initialization AthenaEventLoopMgr INFO Setup EventSelector service EventSelector ApplicationMgr INFO Application Manager Initialized successfully -ClassIDSvc INFO getRegistryEntries: read 7219 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 7221 CLIDRegistry entries for module ALL +CondInputLoader INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/RLTest' +CondInputLoader INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/TSTest' CondInputLoader INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/TestAttrList' CondInputLoader INFO created CondCont<DMTest::S2> with key 'ConditionStore+/DMTest/S2' ApplicationMgr INFO Application Manager Started successfully @@ -85,130 +93,280 @@ ClassIDSvc INFO getRegistryEntries: read 109 CLIDRegistry entries for AthenaEventLoopMgr INFO ===>>> start processing event #0, run #0 0 events processed so far <<<=== IOVDbSvc INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200 IOVDbSvc INFO Disconnecting from sqlite://;schema=condtest.db;dbname=OFLP200 -Domain[ROOT_All] INFO -> Access DbDatabase READ [ROOT_All] F67004F9-6082-4B4C-B52D-88A1A76CF991 +Domain[ROOT_All] INFO -> Access DbDatabase READ [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7 Domain[ROOT_All] INFO condtest.pool.root RootDatabase.open INFO condtest.pool.root File version:61404 DMTest::CondRea... INFO Event 0 LBN 0 DMTest::CondRea... INFO xint xint (int) : 10 DMTest::CondRea... INFO scond 1000 DMTest::CondRea... INFO s2 0 +DMTest::CondRea... INFO rl xint (int) : 1 +DMTest::CondRea... INFO ts xint (int) : 100 +DMTest::CondRea... INFO s3 101 AthenaEventLoopMgr INFO ===>>> done processing event #0, run #0 1 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #1, run #0 1 events processed so far <<<=== DMTest::CondRea... INFO Event 1 LBN 0 DMTest::CondRea... INFO xint xint (int) : 10 DMTest::CondRea... INFO scond 1000 DMTest::CondRea... INFO s2 0 +DMTest::CondRea... INFO rl xint (int) : 1 +DMTest::CondRea... INFO ts xint (int) : 100 +DMTest::CondRea... INFO s3 101 AthenaEventLoopMgr INFO ===>>> done processing event #1, run #0 2 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #2, run #0 2 events processed so far <<<=== -DMTest::CondRea... INFO Event 2 LBN 1 -DMTest::CondRea... INFO xint xint (int) : 20 -DMTest::CondRea... INFO scond 2000 +DMTest::CondRea... INFO Event 2 LBN 0 +DMTest::CondRea... INFO xint xint (int) : 10 +DMTest::CondRea... INFO scond 1000 DMTest::CondRea... INFO s2 0 +DMTest::CondRea... INFO rl xint (int) : 1 +DMTest::CondRea... INFO ts xint (int) : 100 +DMTest::CondRea... INFO s3 101 AthenaEventLoopMgr INFO ===>>> done processing event #2, run #0 3 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #3, run #0 3 events processed so far <<<=== DMTest::CondRea... INFO Event 3 LBN 1 DMTest::CondRea... INFO xint xint (int) : 20 DMTest::CondRea... INFO scond 2000 DMTest::CondRea... INFO s2 0 +DMTest::CondRea... INFO rl xint (int) : 2 +DMTest::CondRea... INFO ts xint (int) : 200 +DMTest::CondRea... INFO s3 202 AthenaEventLoopMgr INFO ===>>> done processing event #3, run #0 4 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #4, run #0 4 events processed so far <<<=== -DMTest::CondRea... INFO Event 4 LBN 2 +DMTest::CondRea... INFO Event 4 LBN 1 +DMTest::CondRea... INFO xint xint (int) : 20 +DMTest::CondRea... INFO scond 2000 +DMTest::CondRea... INFO s2 0 +DMTest::CondRea... INFO rl xint (int) : 2 +DMTest::CondRea... INFO ts xint (int) : 200 +DMTest::CondRea... INFO s3 202 +AthenaEventLoopMgr INFO ===>>> done processing event #4, run #0 5 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #5, run #0 5 events processed so far <<<=== +DMTest::CondRea... INFO Event 5 LBN 1 +DMTest::CondRea... INFO xint xint (int) : 20 +DMTest::CondRea... INFO scond 2000 +DMTest::CondRea... INFO s2 0 +DMTest::CondRea... INFO rl xint (int) : 2 +DMTest::CondRea... INFO ts xint (int) : 200 +DMTest::CondRea... INFO s3 202 +AthenaEventLoopMgr INFO ===>>> done processing event #5, run #0 6 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #6, run #0 6 events processed so far <<<=== +DMTest::CondRea... INFO Event 6 LBN 2 DMTest::CondRea... INFO xint xint (int) : 30 DMTest::CondRea... INFO scond 3000 DMTest::CondRea... INFO s2 100 -AthenaEventLoopMgr INFO ===>>> done processing event #4, run #0 5 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #5, run #0 5 events processed so far <<<=== -DMTest::CondRea... INFO Event 5 LBN 2 +DMTest::CondRea... INFO rl xint (int) : 2 +DMTest::CondRea... INFO ts xint (int) : 300 +DMTest::CondRea... INFO s3 302 +AthenaEventLoopMgr INFO ===>>> done processing event #6, run #0 7 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #7, run #0 7 events processed so far <<<=== +DMTest::CondRea... INFO Event 7 LBN 2 DMTest::CondRea... INFO xint xint (int) : 30 DMTest::CondRea... INFO scond 3000 DMTest::CondRea... INFO s2 100 -AthenaEventLoopMgr INFO ===>>> done processing event #5, run #0 6 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #6, run #0 6 events processed so far <<<=== -DMTest::CondRea... INFO Event 6 LBN 3 +DMTest::CondRea... INFO rl xint (int) : 2 +DMTest::CondRea... INFO ts xint (int) : 400 +DMTest::CondRea... INFO s3 402 +AthenaEventLoopMgr INFO ===>>> done processing event #7, run #0 8 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #8, run #0 8 events processed so far <<<=== +DMTest::CondRea... INFO Event 8 LBN 2 +DMTest::CondRea... INFO xint xint (int) : 30 +DMTest::CondRea... INFO scond 3000 +DMTest::CondRea... INFO s2 100 +DMTest::CondRea... INFO rl xint (int) : 2 +DMTest::CondRea... INFO ts xint (int) : 400 +DMTest::CondRea... INFO s3 402 +AthenaEventLoopMgr INFO ===>>> done processing event #8, run #0 9 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #9, run #0 9 events processed so far <<<=== +DMTest::CondRea... INFO Event 9 LBN 3 DMTest::CondRea... INFO xint xint (int) : 40 DMTest::CondRea... INFO scond 4000 DMTest::CondRea... INFO s2 100 -AthenaEventLoopMgr INFO ===>>> done processing event #6, run #0 7 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #7, run #0 7 events processed so far <<<=== -DMTest::CondRea... INFO Event 7 LBN 3 +DMTest::CondRea... INFO rl xint (int) : 3 +DMTest::CondRea... INFO ts xint (int) : 400 +DMTest::CondRea... INFO s3 403 +AthenaEventLoopMgr INFO ===>>> done processing event #9, run #0 10 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #10, run #0 10 events processed so far <<<=== +DMTest::CondRea... INFO Event 10 LBN 3 DMTest::CondRea... INFO xint xint (int) : 40 DMTest::CondRea... INFO scond 4000 DMTest::CondRea... INFO s2 100 -AthenaEventLoopMgr INFO ===>>> done processing event #7, run #0 8 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #8, run #0 8 events processed so far <<<=== -DMTest::CondRea... INFO Event 8 LBN 4 +DMTest::CondRea... INFO rl xint (int) : 3 +DMTest::CondRea... INFO ts xint (int) : 500 +DMTest::CondRea... INFO s3 503 +AthenaEventLoopMgr INFO ===>>> done processing event #10, run #0 11 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #11, run #0 11 events processed so far <<<=== +DMTest::CondRea... INFO Event 11 LBN 3 +DMTest::CondRea... INFO xint xint (int) : 40 +DMTest::CondRea... INFO scond 4000 +DMTest::CondRea... INFO s2 100 +DMTest::CondRea... INFO rl xint (int) : 3 +DMTest::CondRea... INFO ts xint (int) : 500 +DMTest::CondRea... INFO s3 503 +AthenaEventLoopMgr INFO ===>>> done processing event #11, run #0 12 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #12, run #0 12 events processed so far <<<=== +DMTest::CondRea... INFO Event 12 LBN 4 DMTest::CondRea... INFO xint xint (int) : 50 DMTest::CondRea... INFO scond 5000 DMTest::CondRea... INFO s2 200 -AthenaEventLoopMgr INFO ===>>> done processing event #8, run #0 9 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #9, run #0 9 events processed so far <<<=== -DMTest::CondRea... INFO Event 9 LBN 4 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 500 +DMTest::CondRea... INFO s3 504 +AthenaEventLoopMgr INFO ===>>> done processing event #12, run #0 13 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #13, run #0 13 events processed so far <<<=== +DMTest::CondRea... INFO Event 13 LBN 4 DMTest::CondRea... INFO xint xint (int) : 50 DMTest::CondRea... INFO scond 5000 DMTest::CondRea... INFO s2 200 -AthenaEventLoopMgr INFO ===>>> done processing event #9, run #0 10 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #10, run #0 10 events processed so far <<<=== -DMTest::CondRea... INFO Event 10 LBN 5 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 500 +DMTest::CondRea... INFO s3 504 +AthenaEventLoopMgr INFO ===>>> done processing event #13, run #0 14 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #14, run #0 14 events processed so far <<<=== +DMTest::CondRea... INFO Event 14 LBN 4 +DMTest::CondRea... INFO xint xint (int) : 50 +DMTest::CondRea... INFO scond 5000 +DMTest::CondRea... INFO s2 200 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 500 +DMTest::CondRea... INFO s3 504 +AthenaEventLoopMgr INFO ===>>> done processing event #14, run #0 15 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #15, run #0 15 events processed so far <<<=== +DMTest::CondRea... INFO Event 15 LBN 5 DMTest::CondRea... INFO xint xint (int) : 60 DMTest::CondRea... INFO scond 6000 DMTest::CondRea... INFO s2 200 -AthenaEventLoopMgr INFO ===>>> done processing event #10, run #0 11 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #11, run #0 11 events processed so far <<<=== -DMTest::CondRea... INFO Event 11 LBN 5 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 500 +DMTest::CondRea... INFO s3 504 +AthenaEventLoopMgr INFO ===>>> done processing event #15, run #0 16 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #16, run #0 16 events processed so far <<<=== +DMTest::CondRea... INFO Event 16 LBN 5 DMTest::CondRea... INFO xint xint (int) : 60 DMTest::CondRea... INFO scond 6000 DMTest::CondRea... INFO s2 200 -AthenaEventLoopMgr INFO ===>>> done processing event #11, run #0 12 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #12, run #0 12 events processed so far <<<=== -DMTest::CondRea... INFO Event 12 LBN 6 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 500 +DMTest::CondRea... INFO s3 504 +AthenaEventLoopMgr INFO ===>>> done processing event #16, run #0 17 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #17, run #0 17 events processed so far <<<=== +DMTest::CondRea... INFO Event 17 LBN 5 +DMTest::CondRea... INFO xint xint (int) : 60 +DMTest::CondRea... INFO scond 6000 +DMTest::CondRea... INFO s2 200 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 600 +DMTest::CondRea... INFO s3 604 +AthenaEventLoopMgr INFO ===>>> done processing event #17, run #0 18 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #18, run #0 18 events processed so far <<<=== +DMTest::CondRea... INFO Event 18 LBN 6 DMTest::CondRea... INFO xint xint (int) : 70 DMTest::CondRea... INFO scond 7000 DMTest::CondRea... INFO s2 300 -AthenaEventLoopMgr INFO ===>>> done processing event #12, run #0 13 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #13, run #0 13 events processed so far <<<=== -DMTest::CondRea... INFO Event 13 LBN 6 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 600 +DMTest::CondRea... INFO s3 604 +AthenaEventLoopMgr INFO ===>>> done processing event #18, run #0 19 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #19, run #0 19 events processed so far <<<=== +DMTest::CondRea... INFO Event 19 LBN 6 DMTest::CondRea... INFO xint xint (int) : 70 DMTest::CondRea... INFO scond 7000 DMTest::CondRea... INFO s2 300 -AthenaEventLoopMgr INFO ===>>> done processing event #13, run #0 14 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #14, run #0 14 events processed so far <<<=== -DMTest::CondRea... INFO Event 14 LBN 7 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 700 +DMTest::CondRea... INFO s3 704 +AthenaEventLoopMgr INFO ===>>> done processing event #19, run #0 20 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #20, run #0 20 events processed so far <<<=== +DMTest::CondRea... INFO Event 20 LBN 6 +DMTest::CondRea... INFO xint xint (int) : 70 +DMTest::CondRea... INFO scond 7000 +DMTest::CondRea... INFO s2 300 +DMTest::CondRea... INFO rl xint (int) : 4 +DMTest::CondRea... INFO ts xint (int) : 700 +DMTest::CondRea... INFO s3 704 +AthenaEventLoopMgr INFO ===>>> done processing event #20, run #0 21 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #21, run #0 21 events processed so far <<<=== +DMTest::CondRea... INFO Event 21 LBN 7 DMTest::CondRea... INFO xint xint (int) : 80 DMTest::CondRea... INFO scond 8000 DMTest::CondRea... INFO s2 300 -AthenaEventLoopMgr INFO ===>>> done processing event #14, run #0 15 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #15, run #0 15 events processed so far <<<=== -DMTest::CondRea... INFO Event 15 LBN 7 +DMTest::CondRea... INFO rl xint (int) : 5 +DMTest::CondRea... INFO ts xint (int) : 700 +DMTest::CondRea... INFO s3 705 +AthenaEventLoopMgr INFO ===>>> done processing event #21, run #0 22 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #22, run #0 22 events processed so far <<<=== +DMTest::CondRea... INFO Event 22 LBN 7 DMTest::CondRea... INFO xint xint (int) : 80 DMTest::CondRea... INFO scond 8000 DMTest::CondRea... INFO s2 300 -AthenaEventLoopMgr INFO ===>>> done processing event #15, run #0 16 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #16, run #0 16 events processed so far <<<=== -DMTest::CondRea... INFO Event 16 LBN 8 +DMTest::CondRea... INFO rl xint (int) : 5 +DMTest::CondRea... INFO ts xint (int) : 800 +DMTest::CondRea... INFO s3 805 +AthenaEventLoopMgr INFO ===>>> done processing event #22, run #0 23 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #23, run #0 23 events processed so far <<<=== +DMTest::CondRea... INFO Event 23 LBN 7 +DMTest::CondRea... INFO xint xint (int) : 80 +DMTest::CondRea... INFO scond 8000 +DMTest::CondRea... INFO s2 300 +DMTest::CondRea... INFO rl xint (int) : 5 +DMTest::CondRea... INFO ts xint (int) : 800 +DMTest::CondRea... INFO s3 805 +AthenaEventLoopMgr INFO ===>>> done processing event #23, run #0 24 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #24, run #0 24 events processed so far <<<=== +DMTest::CondRea... INFO Event 24 LBN 8 DMTest::CondRea... INFO xint xint (int) : 90 DMTest::CondRea... INFO scond 9000 DMTest::CondRea... INFO s2 400 -AthenaEventLoopMgr INFO ===>>> done processing event #16, run #0 17 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #17, run #0 17 events processed so far <<<=== -DMTest::CondRea... INFO Event 17 LBN 8 +DMTest::CondRea... INFO rl xint (int) : 6 +DMTest::CondRea... INFO ts xint (int) : 800 +DMTest::CondRea... INFO s3 806 +AthenaEventLoopMgr INFO ===>>> done processing event #24, run #0 25 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #25, run #0 25 events processed so far <<<=== +DMTest::CondRea... INFO Event 25 LBN 8 DMTest::CondRea... INFO xint xint (int) : 90 DMTest::CondRea... INFO scond 9000 DMTest::CondRea... INFO s2 400 -AthenaEventLoopMgr INFO ===>>> done processing event #17, run #0 18 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #18, run #0 18 events processed so far <<<=== -DMTest::CondRea... INFO Event 18 LBN 9 +DMTest::CondRea... INFO rl xint (int) : 6 +DMTest::CondRea... INFO ts xint (int) : 800 +DMTest::CondRea... INFO s3 806 +AthenaEventLoopMgr INFO ===>>> done processing event #25, run #0 26 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #26, run #0 26 events processed so far <<<=== +DMTest::CondRea... INFO Event 26 LBN 8 +DMTest::CondRea... INFO xint xint (int) : 90 +DMTest::CondRea... INFO scond 9000 +DMTest::CondRea... INFO s2 400 +DMTest::CondRea... INFO rl xint (int) : 6 +DMTest::CondRea... INFO ts xint (int) : 900 +DMTest::CondRea... INFO s3 906 +AthenaEventLoopMgr INFO ===>>> done processing event #26, run #0 27 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #27, run #0 27 events processed so far <<<=== +DMTest::CondRea... INFO Event 27 LBN 9 DMTest::CondRea... INFO xint xint (int) : 100 DMTest::CondRea... INFO scond 10000 DMTest::CondRea... INFO s2 400 -AthenaEventLoopMgr INFO ===>>> done processing event #18, run #0 19 events processed so far <<<=== -AthenaEventLoopMgr INFO ===>>> start processing event #19, run #0 19 events processed so far <<<=== -DMTest::CondRea... INFO Event 19 LBN 9 +DMTest::CondRea... INFO rl xint (int) : 7 +DMTest::CondRea... INFO ts xint (int) : 900 +DMTest::CondRea... INFO s3 907 +AthenaEventLoopMgr INFO ===>>> done processing event #27, run #0 28 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #28, run #0 28 events processed so far <<<=== +DMTest::CondRea... INFO Event 28 LBN 9 DMTest::CondRea... INFO xint xint (int) : 100 DMTest::CondRea... INFO scond 10000 DMTest::CondRea... INFO s2 400 -AthenaEventLoopMgr INFO ===>>> done processing event #19, run #0 20 events processed so far <<<=== +DMTest::CondRea... INFO rl xint (int) : 7 +DMTest::CondRea... INFO ts xint (int) : 900 +DMTest::CondRea... INFO s3 907 +AthenaEventLoopMgr INFO ===>>> done processing event #28, run #0 29 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #29, run #0 29 events processed so far <<<=== +DMTest::CondRea... INFO Event 29 LBN 9 +DMTest::CondRea... INFO xint xint (int) : 100 +DMTest::CondRea... INFO scond 10000 +DMTest::CondRea... INFO s2 400 +DMTest::CondRea... INFO rl xint (int) : 7 +DMTest::CondRea... INFO ts xint (int) : 900 +DMTest::CondRea... INFO s3 907 +AthenaEventLoopMgr INFO ===>>> done processing event #29, run #0 30 events processed so far <<<=== condtest.pool.root INFO Database being retired... -Domain[ROOT_All] INFO -> Deaccess DbDatabase READ [ROOT_All] F67004F9-6082-4B4C-B52D-88A1A76CF991 +Domain[ROOT_All] INFO -> Deaccess DbDatabase READ [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7 Domain[ROOT_All] INFO > Deaccess DbDomain READ [ROOT_All] ApplicationMgr INFO Application Manager Stopped successfully IncidentProcAlg1 INFO Finalize @@ -217,11 +375,13 @@ LoadReadDicts INFO Finalizing LoadReadDicts... IncidentProcAlg2 INFO Finalize EventSelector INFO finalize PyComponentMgr INFO Finalizing PyComponentMgr... -IOVDbFolder INFO Folder /DMTest/S2 (PoolRef) db-read 1/5 objs/chan/bytes 10/1/1810 (( 0.01 ))s -IOVDbFolder INFO Folder /DMTest/TestAttrList (AttrList) db-read 1/10 objs/chan/bytes 20/1/80 (( 0.00 ))s -IOVDbSvc INFO bytes in (( 0.02 ))s +IOVDbFolder INFO Folder /DMTest/RLTest (AttrList) db-read 1/7 objs/chan/bytes 7/1/28 (( 0.01 ))s +IOVDbFolder INFO Folder /DMTest/S2 (PoolRef) db-read 1/5 objs/chan/bytes 15/1/2715 (( 0.00 ))s +IOVDbFolder INFO Folder /DMTest/TSTest (AttrList) db-read 1/9 objs/chan/bytes 9/1/36 (( 0.00 ))s +IOVDbFolder INFO Folder /DMTest/TestAttrList (AttrList) db-read 1/10 objs/chan/bytes 30/1/120 (( 0.00 ))s +IOVDbSvc INFO bytes in (( 0.01 ))s IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=OFLP200 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s -IOVDbSvc INFO Connection sqlite://;schema=condtest.db;dbname=OFLP200 : nConnect: 2 nFolders: 2 ReadTime: (( 0.02 ))s +IOVDbSvc INFO Connection sqlite://;schema=condtest.db;dbname=OFLP200 : nConnect: 2 nFolders: 4 ReadTime: (( 0.01 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ChronoStatSvc.f... INFO Service finalized successfully diff --git a/Control/DataModelTest/DataModelRunTests/share/CondReaderMT.ref b/Control/DataModelTest/DataModelRunTests/share/CondReaderMT.ref index 47e0826cb572..8800bc3257b8 100644 --- a/Control/DataModelTest/DataModelRunTests/share/CondReaderMT.ref +++ b/Control/DataModelTest/DataModelRunTests/share/CondReaderMT.ref @@ -1,7 +1,7 @@ -Thu Dec 6 06:15:44 CET 2018 +Tue Dec 11 15:26:14 CET 2018 Preloading tcmalloc_minimal.so Py:Athena INFO including file "AthenaCommon/Preparation.py" -Py:Athena INFO using release [AthenaWorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3/fa0fd6d0989] -- built on [2018-12-06T0538] +Py:Athena INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3g/fc1ea6b7761] -- built on [2018-12-11T1514] Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup Py:Athena INFO configuring AthenaHive with [1] concurrent threads and [1] concurrent events @@ -10,7 +10,7 @@ Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO including file "DataModelRunTests/CondReaderMT_jo.py" Py:Athena INFO including file "DataModelRunTests/CondReader_jo.py" Py:Athena INFO including file "AthenaPoolCnvSvc/AthenaPool_jobOptions.py" -Py:ConfigurableDb INFO Read module info for 5473 configurables from 53 genConfDb files +Py:ConfigurableDb INFO Read module info for 5443 configurables from 42 genConfDb files Py:ConfigurableDb INFO No duplicates have been found: that's good ! Py:Athena INFO including file "DataModelRunTests/loadReadDicts.py" EventInfoMgtInit: Got release version Athena-22.0.1 @@ -22,7 +22,7 @@ MessageSvc INFO Activating in a separate thread ApplicationMgr SUCCESS ==================================================================================================================================== Welcome to ApplicationMgr (GaudiCoreSvc v30r5) - running on lxplus077.cern.ch on Thu Dec 6 06:16:12 2018 + running on lxplus079.cern.ch on Tue Dec 11 15:26:37 2018 ==================================================================================================================================== ApplicationMgr INFO Successfully loaded modules : AthenaServices ApplicationMgr INFO Application Manager Configured successfully @@ -39,8 +39,8 @@ PoolSvc INFO io_register[PoolSvc](xml PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-local.cern.ch:8000/atlr)(serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca-proxy-meyrin.cern.ch:3128)(proxyurl=http://ca-proxy-wigner.cern.ch:3128)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data -DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-04T2300/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config -DBReplicaSvc INFO Total of 10 servers found for host lxplus077.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ] +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-10T2259/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config +DBReplicaSvc INFO Total of 10 servers found for host lxplus079.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ] PoolSvc INFO Successfully setup replica sorting algorithm PoolSvc INFO Setting up APR FileCatalog and Streams PoolSvc INFO POOL WriteCatalog is xmlcatalog_file:PoolFileCatalog.xml @@ -50,30 +50,36 @@ IOVDbSvc INFO Opened read transaction IOVDbSvc INFO Only 5 POOL conditions files will be open at once IOVDbSvc INFO Cache alignment will be done in 3 slices IOVDbFolder INFO Read from meta data only for folder /TagInfo -IOVDbSvc INFO Initialised with 2 connections and 3 folders +IOVDbSvc INFO Initialised with 2 connections and 5 folders IOVDbSvc INFO Service IOVDbSvc initialised successfully -ClassIDSvc INFO getRegistryEntries: read 2839 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 2898 CLIDRegistry entries for module ALL PyComponentMgr INFO Initializing PyComponentMgr... LoadReadDicts INFO Initializing LoadReadDicts... -ClassIDSvc INFO getRegistryEntries: read 7064 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 7066 CLIDRegistry entries for module ALL CondInputLoader INFO Initializing CondInputLoader... IOVDbSvc INFO preLoadAddresses: Removing folder /TagInfo. It should only be in the file meta data and was not found. IOVDbSvc INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200 IOVSvc INFO No IOVSvcTool associated with store "StoreGateSvc" IOVSvcTool INFO IOVRanges will be checked at every Event IOVDbSvc INFO Disconnecting from sqlite://;schema=condtest.db;dbname=OFLP200 +IOVDbSvc INFO Added taginfo remove for /DMTest/RLTest IOVDbSvc INFO Added taginfo remove for /DMTest/S2 +IOVDbSvc INFO Added taginfo remove for /DMTest/TSTest IOVDbSvc INFO Added taginfo remove for /DMTest/TestAttrList CondInputLoader INFO Adding base classes: + + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) -> + + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) -> + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) -> + ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' ) -> DMTest::S1 (243020043) CondInputLoader INFO Will create WriteCondHandle dependencies for the following DataObjects: + + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) + + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) + ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) + ( 'DMTest::S1' , 'ConditionStore+/DMTest/S2' ) + ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' ) ThreadPoolSvc INFO no thread init tools attached AvalancheSchedulerSvc INFO Activating scheduler in a separate thread -AvalancheSchedulerSvc INFO Found 9 algorithms +AvalancheSchedulerSvc INFO Found 10 algorithms AvalancheSchedulerSvc INFO Data Dependencies for Algorithms: BeginIncFiringAlg none @@ -84,11 +90,16 @@ AvalancheSchedulerSvc INFO Data Dependencies for Al LoadReadDicts none DMTest::CondReaderAlg + o INPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) + o INPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) o INPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) o INPUT ( 'DMTest::S1' , 'ConditionStore+/DMTest/S2' ) o INPUT ( 'DMTest::S1' , 'ConditionStore+scond' ) + o INPUT ( 'DMTest::S3' , 'ConditionStore+scond3' ) o INPUT ( 'EventInfo' , 'StoreGateSvc+McEventInfo' ) CondInputLoader + o OUTPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) + o OUTPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) o OUTPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) o OUTPUT ( 'DMTest::S1' , 'ConditionStore+/DMTest/S2' ) o OUTPUT ( 'DMTest::S2' , 'ConditionStore+/DMTest/S2' ) @@ -96,6 +107,10 @@ AvalancheSchedulerSvc INFO Data Dependencies for Al o INPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TestAttrList' ) o OUTPUT ( 'DMTest::S1' , 'ConditionStore+scond' ) o OUTPUT ( 'DMTest::S2' , 'ConditionStore+scond' ) + DMTest::CondAlg2 + o INPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/RLTest' ) + o INPUT ( 'AthenaAttributeList' , 'ConditionStore+/DMTest/TSTest' ) + o OUTPUT ( 'DMTest::S3' , 'ConditionStore+scond3' ) EndIncFiringAlg none IncidentProcAlg2 @@ -115,6 +130,8 @@ AthenaHiveEventLoopMgr INFO Setup EventSelector serv ApplicationMgr INFO Application Manager Initialized successfully PoolSvc INFO Enabled implicit multithreading in ROOT via PersistencySvc to: 1 ClassIDSvc INFO getRegistryEntries: read 108 CLIDRegistry entries for module ALL +CondInputLoader INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/RLTest' +CondInputLoader INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/TSTest' CondInputLoader INFO created CondCont<AthenaAttributeList> with key 'ConditionStore+/DMTest/TestAttrList' CondInputLoader INFO created CondCont<DMTest::S2> with key 'ConditionStore+/DMTest/S2' ApplicationMgr INFO Application Manager Started successfully @@ -127,13 +144,16 @@ ClassIDSvc 0 0 INFO getRegistryEntries: rea AthenaHiveEventLoopMgr 0 0 INFO ===>>> start processing event #0, run #0 on slot 0, 0 events processed so far <<<=== IOVDbSvc 0 0 INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200 IOVDbSvc 0 0 INFO Disconnecting from sqlite://;schema=condtest.db;dbname=OFLP200 -Domain[ROOT_All] 0 0 INFO -> Access DbDatabase READ [ROOT_All] F69635EF-6D4E-394D-BC66-03595DA2A079 +Domain[ROOT_All] 0 0 INFO -> Access DbDatabase READ [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7 Domain[ROOT_All] 0 0 INFO condtest.pool.root RootDatabase.open 0 0 INFO condtest.pool.root File version:61404 DMTest::CondReaderAlg 0 0 INFO Event 0 LBN 0 DMTest::CondReaderAlg 0 0 INFO xint xint (int) : 10 DMTest::CondReaderAlg 0 0 INFO scond 1000 DMTest::CondReaderAlg 0 0 INFO s2 0 +DMTest::CondReaderAlg 0 0 INFO rl xint (int) : 1 +DMTest::CondReaderAlg 0 0 INFO ts xint (int) : 100 +DMTest::CondReaderAlg 0 0 INFO s3 101 AthenaHiveEventLoopMgr INFO ===>>> done processing event #0, run #0 on slot 0, 1 events processed so far <<<=== AthenaHiveEventLoopMgr 1 0 INFO ===>>> start processing event #1, run #0 on slot 0, 1 events processed so far <<<=== ClassIDSvc 1 0 INFO getRegistryEntries: read 55 CLIDRegistry entries for module ALL @@ -141,118 +161,265 @@ DMTest::CondReaderAlg 1 0 INFO Event 1 LBN 0 DMTest::CondReaderAlg 1 0 INFO xint xint (int) : 10 DMTest::CondReaderAlg 1 0 INFO scond 1000 DMTest::CondReaderAlg 1 0 INFO s2 0 +DMTest::CondReaderAlg 1 0 INFO rl xint (int) : 1 +DMTest::CondReaderAlg 1 0 INFO ts xint (int) : 100 +DMTest::CondReaderAlg 1 0 INFO s3 101 AthenaHiveEventLoopMgr INFO ===>>> done processing event #1, run #0 on slot 0, 2 events processed so far <<<=== AthenaHiveEventLoopMgr 2 0 INFO ===>>> start processing event #2, run #0 on slot 0, 2 events processed so far <<<=== -DMTest::CondReaderAlg 2 0 INFO Event 2 LBN 1 -DMTest::CondReaderAlg 2 0 INFO xint xint (int) : 20 -DMTest::CondReaderAlg 2 0 INFO scond 2000 +DMTest::CondReaderAlg 2 0 INFO Event 2 LBN 0 +DMTest::CondReaderAlg 2 0 INFO xint xint (int) : 10 +DMTest::CondReaderAlg 2 0 INFO scond 1000 DMTest::CondReaderAlg 2 0 INFO s2 0 +DMTest::CondReaderAlg 2 0 INFO rl xint (int) : 1 +DMTest::CondReaderAlg 2 0 INFO ts xint (int) : 100 +DMTest::CondReaderAlg 2 0 INFO s3 101 AthenaHiveEventLoopMgr INFO ===>>> done processing event #2, run #0 on slot 0, 3 events processed so far <<<=== AthenaHiveEventLoopMgr 3 0 INFO ===>>> start processing event #3, run #0 on slot 0, 3 events processed so far <<<=== DMTest::CondReaderAlg 3 0 INFO Event 3 LBN 1 DMTest::CondReaderAlg 3 0 INFO xint xint (int) : 20 DMTest::CondReaderAlg 3 0 INFO scond 2000 DMTest::CondReaderAlg 3 0 INFO s2 0 +DMTest::CondReaderAlg 3 0 INFO rl xint (int) : 2 +DMTest::CondReaderAlg 3 0 INFO ts xint (int) : 200 +DMTest::CondReaderAlg 3 0 INFO s3 202 AthenaHiveEventLoopMgr INFO ===>>> done processing event #3, run #0 on slot 0, 4 events processed so far <<<=== AthenaHiveEventLoopMgr 4 0 INFO ===>>> start processing event #4, run #0 on slot 0, 4 events processed so far <<<=== -DMTest::CondReaderAlg 4 0 INFO Event 4 LBN 2 -DMTest::CondReaderAlg 4 0 INFO xint xint (int) : 30 -DMTest::CondReaderAlg 4 0 INFO scond 3000 -DMTest::CondReaderAlg 4 0 INFO s2 100 +DMTest::CondReaderAlg 4 0 INFO Event 4 LBN 1 +DMTest::CondReaderAlg 4 0 INFO xint xint (int) : 20 +DMTest::CondReaderAlg 4 0 INFO scond 2000 +DMTest::CondReaderAlg 4 0 INFO s2 0 +DMTest::CondReaderAlg 4 0 INFO rl xint (int) : 2 +DMTest::CondReaderAlg 4 0 INFO ts xint (int) : 200 +DMTest::CondReaderAlg 4 0 INFO s3 202 AthenaHiveEventLoopMgr INFO ===>>> done processing event #4, run #0 on slot 0, 5 events processed so far <<<=== AthenaHiveEventLoopMgr 5 0 INFO ===>>> start processing event #5, run #0 on slot 0, 5 events processed so far <<<=== -DMTest::CondReaderAlg 5 0 INFO Event 5 LBN 2 -DMTest::CondReaderAlg 5 0 INFO xint xint (int) : 30 -DMTest::CondReaderAlg 5 0 INFO scond 3000 -DMTest::CondReaderAlg 5 0 INFO s2 100 +DMTest::CondReaderAlg 5 0 INFO Event 5 LBN 1 +DMTest::CondReaderAlg 5 0 INFO xint xint (int) : 20 +DMTest::CondReaderAlg 5 0 INFO scond 2000 +DMTest::CondReaderAlg 5 0 INFO s2 0 +DMTest::CondReaderAlg 5 0 INFO rl xint (int) : 2 +DMTest::CondReaderAlg 5 0 INFO ts xint (int) : 200 +DMTest::CondReaderAlg 5 0 INFO s3 202 AthenaHiveEventLoopMgr INFO ===>>> done processing event #5, run #0 on slot 0, 6 events processed so far <<<=== AthenaHiveEventLoopMgr 6 0 INFO ===>>> start processing event #6, run #0 on slot 0, 6 events processed so far <<<=== -DMTest::CondReaderAlg 6 0 INFO Event 6 LBN 3 -DMTest::CondReaderAlg 6 0 INFO xint xint (int) : 40 -DMTest::CondReaderAlg 6 0 INFO scond 4000 +DMTest::CondReaderAlg 6 0 INFO Event 6 LBN 2 +DMTest::CondReaderAlg 6 0 INFO xint xint (int) : 30 +DMTest::CondReaderAlg 6 0 INFO scond 3000 DMTest::CondReaderAlg 6 0 INFO s2 100 +DMTest::CondReaderAlg 6 0 INFO rl xint (int) : 2 +DMTest::CondReaderAlg 6 0 INFO ts xint (int) : 300 +DMTest::CondReaderAlg 6 0 INFO s3 302 AthenaHiveEventLoopMgr INFO ===>>> done processing event #6, run #0 on slot 0, 7 events processed so far <<<=== AthenaHiveEventLoopMgr 7 0 INFO ===>>> start processing event #7, run #0 on slot 0, 7 events processed so far <<<=== -DMTest::CondReaderAlg 7 0 INFO Event 7 LBN 3 -DMTest::CondReaderAlg 7 0 INFO xint xint (int) : 40 -DMTest::CondReaderAlg 7 0 INFO scond 4000 +DMTest::CondReaderAlg 7 0 INFO Event 7 LBN 2 +DMTest::CondReaderAlg 7 0 INFO xint xint (int) : 30 +DMTest::CondReaderAlg 7 0 INFO scond 3000 DMTest::CondReaderAlg 7 0 INFO s2 100 +DMTest::CondReaderAlg 7 0 INFO rl xint (int) : 2 +DMTest::CondReaderAlg 7 0 INFO ts xint (int) : 400 +DMTest::CondReaderAlg 7 0 INFO s3 402 AthenaHiveEventLoopMgr INFO ===>>> done processing event #7, run #0 on slot 0, 8 events processed so far <<<=== AthenaHiveEventLoopMgr 8 0 INFO ===>>> start processing event #8, run #0 on slot 0, 8 events processed so far <<<=== -DMTest::CondReaderAlg 8 0 INFO Event 8 LBN 4 -DMTest::CondReaderAlg 8 0 INFO xint xint (int) : 50 -DMTest::CondReaderAlg 8 0 INFO scond 5000 -DMTest::CondReaderAlg 8 0 INFO s2 200 +DMTest::CondReaderAlg 8 0 INFO Event 8 LBN 2 +DMTest::CondReaderAlg 8 0 INFO xint xint (int) : 30 +DMTest::CondReaderAlg 8 0 INFO scond 3000 +DMTest::CondReaderAlg 8 0 INFO s2 100 +DMTest::CondReaderAlg 8 0 INFO rl xint (int) : 2 +DMTest::CondReaderAlg 8 0 INFO ts xint (int) : 400 +DMTest::CondReaderAlg 8 0 INFO s3 402 AthenaHiveEventLoopMgr INFO ===>>> done processing event #8, run #0 on slot 0, 9 events processed so far <<<=== AthenaHiveEventLoopMgr 9 0 INFO ===>>> start processing event #9, run #0 on slot 0, 9 events processed so far <<<=== -DMTest::CondReaderAlg 9 0 INFO Event 9 LBN 4 -DMTest::CondReaderAlg 9 0 INFO xint xint (int) : 50 -DMTest::CondReaderAlg 9 0 INFO scond 5000 -DMTest::CondReaderAlg 9 0 INFO s2 200 +DMTest::CondReaderAlg 9 0 INFO Event 9 LBN 3 +DMTest::CondReaderAlg 9 0 INFO xint xint (int) : 40 +DMTest::CondReaderAlg 9 0 INFO scond 4000 +DMTest::CondReaderAlg 9 0 INFO s2 100 +DMTest::CondReaderAlg 9 0 INFO rl xint (int) : 3 +DMTest::CondReaderAlg 9 0 INFO ts xint (int) : 400 +DMTest::CondReaderAlg 9 0 INFO s3 403 AthenaHiveEventLoopMgr INFO ===>>> done processing event #9, run #0 on slot 0, 10 events processed so far <<<=== AthenaHiveEventLoopMgr 10 0 INFO ===>>> start processing event #10, run #0 on slot 0, 10 events processed so far <<<=== -DMTest::CondReaderAlg 10 0 INFO Event 10 LBN 5 -DMTest::CondReaderAlg 10 0 INFO xint xint (int) : 60 -DMTest::CondReaderAlg 10 0 INFO scond 6000 -DMTest::CondReaderAlg 10 0 INFO s2 200 +DMTest::CondReaderAlg 10 0 INFO Event 10 LBN 3 +DMTest::CondReaderAlg 10 0 INFO xint xint (int) : 40 +DMTest::CondReaderAlg 10 0 INFO scond 4000 +DMTest::CondReaderAlg 10 0 INFO s2 100 +DMTest::CondReaderAlg 10 0 INFO rl xint (int) : 3 +DMTest::CondReaderAlg 10 0 INFO ts xint (int) : 500 +DMTest::CondReaderAlg 10 0 INFO s3 503 AthenaHiveEventLoopMgr INFO ===>>> done processing event #10, run #0 on slot 0, 11 events processed so far <<<=== AthenaHiveEventLoopMgr 11 0 INFO ===>>> start processing event #11, run #0 on slot 0, 11 events processed so far <<<=== -DMTest::CondReaderAlg 11 0 INFO Event 11 LBN 5 -DMTest::CondReaderAlg 11 0 INFO xint xint (int) : 60 -DMTest::CondReaderAlg 11 0 INFO scond 6000 -DMTest::CondReaderAlg 11 0 INFO s2 200 +DMTest::CondReaderAlg 11 0 INFO Event 11 LBN 3 +DMTest::CondReaderAlg 11 0 INFO xint xint (int) : 40 +DMTest::CondReaderAlg 11 0 INFO scond 4000 +DMTest::CondReaderAlg 11 0 INFO s2 100 +DMTest::CondReaderAlg 11 0 INFO rl xint (int) : 3 +DMTest::CondReaderAlg 11 0 INFO ts xint (int) : 500 +DMTest::CondReaderAlg 11 0 INFO s3 503 AthenaHiveEventLoopMgr INFO ===>>> done processing event #11, run #0 on slot 0, 12 events processed so far <<<=== AthenaHiveEventLoopMgr 12 0 INFO ===>>> start processing event #12, run #0 on slot 0, 12 events processed so far <<<=== -DMTest::CondReaderAlg 12 0 INFO Event 12 LBN 6 -DMTest::CondReaderAlg 12 0 INFO xint xint (int) : 70 -DMTest::CondReaderAlg 12 0 INFO scond 7000 -DMTest::CondReaderAlg 12 0 INFO s2 300 +DMTest::CondReaderAlg 12 0 INFO Event 12 LBN 4 +DMTest::CondReaderAlg 12 0 INFO xint xint (int) : 50 +DMTest::CondReaderAlg 12 0 INFO scond 5000 +DMTest::CondReaderAlg 12 0 INFO s2 200 +DMTest::CondReaderAlg 12 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 12 0 INFO ts xint (int) : 500 +DMTest::CondReaderAlg 12 0 INFO s3 504 AthenaHiveEventLoopMgr INFO ===>>> done processing event #12, run #0 on slot 0, 13 events processed so far <<<=== AthenaHiveEventLoopMgr 13 0 INFO ===>>> start processing event #13, run #0 on slot 0, 13 events processed so far <<<=== -DMTest::CondReaderAlg 13 0 INFO Event 13 LBN 6 -DMTest::CondReaderAlg 13 0 INFO xint xint (int) : 70 -DMTest::CondReaderAlg 13 0 INFO scond 7000 -DMTest::CondReaderAlg 13 0 INFO s2 300 +DMTest::CondReaderAlg 13 0 INFO Event 13 LBN 4 +DMTest::CondReaderAlg 13 0 INFO xint xint (int) : 50 +DMTest::CondReaderAlg 13 0 INFO scond 5000 +DMTest::CondReaderAlg 13 0 INFO s2 200 +DMTest::CondReaderAlg 13 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 13 0 INFO ts xint (int) : 500 +DMTest::CondReaderAlg 13 0 INFO s3 504 AthenaHiveEventLoopMgr INFO ===>>> done processing event #13, run #0 on slot 0, 14 events processed so far <<<=== AthenaHiveEventLoopMgr 14 0 INFO ===>>> start processing event #14, run #0 on slot 0, 14 events processed so far <<<=== -DMTest::CondReaderAlg 14 0 INFO Event 14 LBN 7 -DMTest::CondReaderAlg 14 0 INFO xint xint (int) : 80 -DMTest::CondReaderAlg 14 0 INFO scond 8000 -DMTest::CondReaderAlg 14 0 INFO s2 300 +DMTest::CondReaderAlg 14 0 INFO Event 14 LBN 4 +DMTest::CondReaderAlg 14 0 INFO xint xint (int) : 50 +DMTest::CondReaderAlg 14 0 INFO scond 5000 +DMTest::CondReaderAlg 14 0 INFO s2 200 +DMTest::CondReaderAlg 14 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 14 0 INFO ts xint (int) : 500 +DMTest::CondReaderAlg 14 0 INFO s3 504 AthenaHiveEventLoopMgr INFO ===>>> done processing event #14, run #0 on slot 0, 15 events processed so far <<<=== AthenaHiveEventLoopMgr 15 0 INFO ===>>> start processing event #15, run #0 on slot 0, 15 events processed so far <<<=== -DMTest::CondReaderAlg 15 0 INFO Event 15 LBN 7 -DMTest::CondReaderAlg 15 0 INFO xint xint (int) : 80 -DMTest::CondReaderAlg 15 0 INFO scond 8000 -DMTest::CondReaderAlg 15 0 INFO s2 300 +DMTest::CondReaderAlg 15 0 INFO Event 15 LBN 5 +DMTest::CondReaderAlg 15 0 INFO xint xint (int) : 60 +DMTest::CondReaderAlg 15 0 INFO scond 6000 +DMTest::CondReaderAlg 15 0 INFO s2 200 +DMTest::CondReaderAlg 15 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 15 0 INFO ts xint (int) : 500 +DMTest::CondReaderAlg 15 0 INFO s3 504 AthenaHiveEventLoopMgr INFO ===>>> done processing event #15, run #0 on slot 0, 16 events processed so far <<<=== AthenaHiveEventLoopMgr 16 0 INFO ===>>> start processing event #16, run #0 on slot 0, 16 events processed so far <<<=== -DMTest::CondReaderAlg 16 0 INFO Event 16 LBN 8 -DMTest::CondReaderAlg 16 0 INFO xint xint (int) : 90 -DMTest::CondReaderAlg 16 0 INFO scond 9000 -DMTest::CondReaderAlg 16 0 INFO s2 400 +DMTest::CondReaderAlg 16 0 INFO Event 16 LBN 5 +DMTest::CondReaderAlg 16 0 INFO xint xint (int) : 60 +DMTest::CondReaderAlg 16 0 INFO scond 6000 +DMTest::CondReaderAlg 16 0 INFO s2 200 +DMTest::CondReaderAlg 16 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 16 0 INFO ts xint (int) : 500 +DMTest::CondReaderAlg 16 0 INFO s3 504 AthenaHiveEventLoopMgr INFO ===>>> done processing event #16, run #0 on slot 0, 17 events processed so far <<<=== AthenaHiveEventLoopMgr 17 0 INFO ===>>> start processing event #17, run #0 on slot 0, 17 events processed so far <<<=== -DMTest::CondReaderAlg 17 0 INFO Event 17 LBN 8 -DMTest::CondReaderAlg 17 0 INFO xint xint (int) : 90 -DMTest::CondReaderAlg 17 0 INFO scond 9000 -DMTest::CondReaderAlg 17 0 INFO s2 400 +DMTest::CondReaderAlg 17 0 INFO Event 17 LBN 5 +DMTest::CondReaderAlg 17 0 INFO xint xint (int) : 60 +DMTest::CondReaderAlg 17 0 INFO scond 6000 +DMTest::CondReaderAlg 17 0 INFO s2 200 +DMTest::CondReaderAlg 17 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 17 0 INFO ts xint (int) : 600 +DMTest::CondReaderAlg 17 0 INFO s3 604 AthenaHiveEventLoopMgr INFO ===>>> done processing event #17, run #0 on slot 0, 18 events processed so far <<<=== AthenaHiveEventLoopMgr 18 0 INFO ===>>> start processing event #18, run #0 on slot 0, 18 events processed so far <<<=== -DMTest::CondReaderAlg 18 0 INFO Event 18 LBN 9 -DMTest::CondReaderAlg 18 0 INFO xint xint (int) : 100 -DMTest::CondReaderAlg 18 0 INFO scond 10000 -DMTest::CondReaderAlg 18 0 INFO s2 400 +DMTest::CondReaderAlg 18 0 INFO Event 18 LBN 6 +DMTest::CondReaderAlg 18 0 INFO xint xint (int) : 70 +DMTest::CondReaderAlg 18 0 INFO scond 7000 +DMTest::CondReaderAlg 18 0 INFO s2 300 +DMTest::CondReaderAlg 18 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 18 0 INFO ts xint (int) : 600 +DMTest::CondReaderAlg 18 0 INFO s3 604 AthenaHiveEventLoopMgr INFO ===>>> done processing event #18, run #0 on slot 0, 19 events processed so far <<<=== AthenaHiveEventLoopMgr 19 0 INFO ===>>> start processing event #19, run #0 on slot 0, 19 events processed so far <<<=== -DMTest::CondReaderAlg 19 0 INFO Event 19 LBN 9 -DMTest::CondReaderAlg 19 0 INFO xint xint (int) : 100 -DMTest::CondReaderAlg 19 0 INFO scond 10000 -DMTest::CondReaderAlg 19 0 INFO s2 400 +DMTest::CondReaderAlg 19 0 INFO Event 19 LBN 6 +DMTest::CondReaderAlg 19 0 INFO xint xint (int) : 70 +DMTest::CondReaderAlg 19 0 INFO scond 7000 +DMTest::CondReaderAlg 19 0 INFO s2 300 +DMTest::CondReaderAlg 19 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 19 0 INFO ts xint (int) : 700 +DMTest::CondReaderAlg 19 0 INFO s3 704 AthenaHiveEventLoopMgr INFO ===>>> done processing event #19, run #0 on slot 0, 20 events processed so far <<<=== -AthenaHiveEventLoopMgr INFO ---> Loop Finished (seconds): 1.68937 +AthenaHiveEventLoopMgr 20 0 INFO ===>>> start processing event #20, run #0 on slot 0, 20 events processed so far <<<=== +DMTest::CondReaderAlg 20 0 INFO Event 20 LBN 6 +DMTest::CondReaderAlg 20 0 INFO xint xint (int) : 70 +DMTest::CondReaderAlg 20 0 INFO scond 7000 +DMTest::CondReaderAlg 20 0 INFO s2 300 +DMTest::CondReaderAlg 20 0 INFO rl xint (int) : 4 +DMTest::CondReaderAlg 20 0 INFO ts xint (int) : 700 +DMTest::CondReaderAlg 20 0 INFO s3 704 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #20, run #0 on slot 0, 21 events processed so far <<<=== +AthenaHiveEventLoopMgr 21 0 INFO ===>>> start processing event #21, run #0 on slot 0, 21 events processed so far <<<=== +DMTest::CondReaderAlg 21 0 INFO Event 21 LBN 7 +DMTest::CondReaderAlg 21 0 INFO xint xint (int) : 80 +DMTest::CondReaderAlg 21 0 INFO scond 8000 +DMTest::CondReaderAlg 21 0 INFO s2 300 +DMTest::CondReaderAlg 21 0 INFO rl xint (int) : 5 +DMTest::CondReaderAlg 21 0 INFO ts xint (int) : 700 +DMTest::CondReaderAlg 21 0 INFO s3 705 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #21, run #0 on slot 0, 22 events processed so far <<<=== +AthenaHiveEventLoopMgr 22 0 INFO ===>>> start processing event #22, run #0 on slot 0, 22 events processed so far <<<=== +DMTest::CondReaderAlg 22 0 INFO Event 22 LBN 7 +DMTest::CondReaderAlg 22 0 INFO xint xint (int) : 80 +DMTest::CondReaderAlg 22 0 INFO scond 8000 +DMTest::CondReaderAlg 22 0 INFO s2 300 +DMTest::CondReaderAlg 22 0 INFO rl xint (int) : 5 +DMTest::CondReaderAlg 22 0 INFO ts xint (int) : 800 +DMTest::CondReaderAlg 22 0 INFO s3 805 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #22, run #0 on slot 0, 23 events processed so far <<<=== +AthenaHiveEventLoopMgr 23 0 INFO ===>>> start processing event #23, run #0 on slot 0, 23 events processed so far <<<=== +DMTest::CondReaderAlg 23 0 INFO Event 23 LBN 7 +DMTest::CondReaderAlg 23 0 INFO xint xint (int) : 80 +DMTest::CondReaderAlg 23 0 INFO scond 8000 +DMTest::CondReaderAlg 23 0 INFO s2 300 +DMTest::CondReaderAlg 23 0 INFO rl xint (int) : 5 +DMTest::CondReaderAlg 23 0 INFO ts xint (int) : 800 +DMTest::CondReaderAlg 23 0 INFO s3 805 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #23, run #0 on slot 0, 24 events processed so far <<<=== +AthenaHiveEventLoopMgr 24 0 INFO ===>>> start processing event #24, run #0 on slot 0, 24 events processed so far <<<=== +DMTest::CondReaderAlg 24 0 INFO Event 24 LBN 8 +DMTest::CondReaderAlg 24 0 INFO xint xint (int) : 90 +DMTest::CondReaderAlg 24 0 INFO scond 9000 +DMTest::CondReaderAlg 24 0 INFO s2 400 +DMTest::CondReaderAlg 24 0 INFO rl xint (int) : 6 +DMTest::CondReaderAlg 24 0 INFO ts xint (int) : 800 +DMTest::CondReaderAlg 24 0 INFO s3 806 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #24, run #0 on slot 0, 25 events processed so far <<<=== +AthenaHiveEventLoopMgr 25 0 INFO ===>>> start processing event #25, run #0 on slot 0, 25 events processed so far <<<=== +DMTest::CondReaderAlg 25 0 INFO Event 25 LBN 8 +DMTest::CondReaderAlg 25 0 INFO xint xint (int) : 90 +DMTest::CondReaderAlg 25 0 INFO scond 9000 +DMTest::CondReaderAlg 25 0 INFO s2 400 +DMTest::CondReaderAlg 25 0 INFO rl xint (int) : 6 +DMTest::CondReaderAlg 25 0 INFO ts xint (int) : 800 +DMTest::CondReaderAlg 25 0 INFO s3 806 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #25, run #0 on slot 0, 26 events processed so far <<<=== +AthenaHiveEventLoopMgr 26 0 INFO ===>>> start processing event #26, run #0 on slot 0, 26 events processed so far <<<=== +DMTest::CondReaderAlg 26 0 INFO Event 26 LBN 8 +DMTest::CondReaderAlg 26 0 INFO xint xint (int) : 90 +DMTest::CondReaderAlg 26 0 INFO scond 9000 +DMTest::CondReaderAlg 26 0 INFO s2 400 +DMTest::CondReaderAlg 26 0 INFO rl xint (int) : 6 +DMTest::CondReaderAlg 26 0 INFO ts xint (int) : 900 +DMTest::CondReaderAlg 26 0 INFO s3 906 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #26, run #0 on slot 0, 27 events processed so far <<<=== +AthenaHiveEventLoopMgr 27 0 INFO ===>>> start processing event #27, run #0 on slot 0, 27 events processed so far <<<=== +DMTest::CondReaderAlg 27 0 INFO Event 27 LBN 9 +DMTest::CondReaderAlg 27 0 INFO xint xint (int) : 100 +DMTest::CondReaderAlg 27 0 INFO scond 10000 +DMTest::CondReaderAlg 27 0 INFO s2 400 +DMTest::CondReaderAlg 27 0 INFO rl xint (int) : 7 +DMTest::CondReaderAlg 27 0 INFO ts xint (int) : 900 +DMTest::CondReaderAlg 27 0 INFO s3 907 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #27, run #0 on slot 0, 28 events processed so far <<<=== +AthenaHiveEventLoopMgr 28 0 INFO ===>>> start processing event #28, run #0 on slot 0, 28 events processed so far <<<=== +DMTest::CondReaderAlg 28 0 INFO Event 28 LBN 9 +DMTest::CondReaderAlg 28 0 INFO xint xint (int) : 100 +DMTest::CondReaderAlg 28 0 INFO scond 10000 +DMTest::CondReaderAlg 28 0 INFO s2 400 +DMTest::CondReaderAlg 28 0 INFO rl xint (int) : 7 +DMTest::CondReaderAlg 28 0 INFO ts xint (int) : 900 +DMTest::CondReaderAlg 28 0 INFO s3 907 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #28, run #0 on slot 0, 29 events processed so far <<<=== +AthenaHiveEventLoopMgr 29 0 INFO ===>>> start processing event #29, run #0 on slot 0, 29 events processed so far <<<=== +DMTest::CondReaderAlg 29 0 INFO Event 29 LBN 9 +DMTest::CondReaderAlg 29 0 INFO xint xint (int) : 100 +DMTest::CondReaderAlg 29 0 INFO scond 10000 +DMTest::CondReaderAlg 29 0 INFO s2 400 +DMTest::CondReaderAlg 29 0 INFO rl xint (int) : 7 +DMTest::CondReaderAlg 29 0 INFO ts xint (int) : 900 +DMTest::CondReaderAlg 29 0 INFO s3 907 +AthenaHiveEventLoopMgr INFO ===>>> done processing event #29, run #0 on slot 0, 30 events processed so far <<<=== +AthenaHiveEventLoopMgr INFO ---> Loop Finished (seconds): 1.70628 condtest.pool.root INFO Database being retired... -Domain[ROOT_All] INFO -> Deaccess DbDatabase READ [ROOT_All] F69635EF-6D4E-394D-BC66-03595DA2A079 +Domain[ROOT_All] INFO -> Deaccess DbDatabase READ [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7 Domain[ROOT_All] INFO > Deaccess DbDomain READ [ROOT_All] ApplicationMgr INFO Application Manager Stopped successfully IncidentProcAlg1 INFO Finalize @@ -264,11 +431,13 @@ EventSelector INFO finalize AvalancheSchedulerSvc INFO Joining Scheduler thread PyComponentMgr INFO Finalizing PyComponentMgr... EventDataSvc INFO Finalizing EventDataSvc - package version StoreGate-00-00-00 -IOVDbFolder INFO Folder /DMTest/S2 (PoolRef) db-read 1/5 objs/chan/bytes 10/1/1810 (( 0.01 ))s -IOVDbFolder INFO Folder /DMTest/TestAttrList (AttrList) db-read 1/10 objs/chan/bytes 20/1/80 (( 0.00 ))s -IOVDbSvc INFO bytes in (( 0.02 ))s +IOVDbFolder INFO Folder /DMTest/RLTest (AttrList) db-read 1/7 objs/chan/bytes 7/1/28 (( 0.01 ))s +IOVDbFolder INFO Folder /DMTest/S2 (PoolRef) db-read 1/5 objs/chan/bytes 15/1/2715 (( 0.00 ))s +IOVDbFolder INFO Folder /DMTest/TSTest (AttrList) db-read 1/9 objs/chan/bytes 9/1/36 (( 0.00 ))s +IOVDbFolder INFO Folder /DMTest/TestAttrList (AttrList) db-read 1/10 objs/chan/bytes 30/1/120 (( 0.00 ))s +IOVDbSvc INFO bytes in (( 0.01 ))s IOVDbSvc INFO Connection sqlite://;schema=mycool.db;dbname=OFLP200 : nConnect: 0 nFolders: 0 ReadTime: (( 0.00 ))s -IOVDbSvc INFO Connection sqlite://;schema=condtest.db;dbname=OFLP200 : nConnect: 2 nFolders: 2 ReadTime: (( 0.02 ))s +IOVDbSvc INFO Connection sqlite://;schema=condtest.db;dbname=OFLP200 : nConnect: 2 nFolders: 4 ReadTime: (( 0.01 ))s AthDictLoaderSvc INFO in finalize... ToolSvc INFO Removing all tools created by ToolSvc ChronoStatSvc.finalize() INFO Service finalized successfully diff --git a/Control/DataModelTest/DataModelRunTests/share/CondReader_jo.py b/Control/DataModelTest/DataModelRunTests/share/CondReader_jo.py index 243a6011c0ba..0a86a459006f 100644 --- a/Control/DataModelTest/DataModelRunTests/share/CondReader_jo.py +++ b/Control/DataModelTest/DataModelRunTests/share/CondReader_jo.py @@ -44,12 +44,16 @@ conddb.addFolder ('condtest.db', '/DMTest/TestAttrList <tag>AttrList_noTag</tag> className='AthenaAttributeList') conddb.addFolder ('condtest.db', '/DMTest/S2 <tag>S2_noTag</tag>', className='DMTest::S2') +conddb.addFolder ('condtest.db', '/DMTest/RLTest <tag>RL_noTag</tag>', + className='AthenaAttributeList') +conddb.addFolder ('condtest.db', '/DMTest/TSTest <tag>TS_noTag</tag>', + className='AthenaAttributeList') #-------------------------------------------------------------- # Event related parameters #-------------------------------------------------------------- -theApp.EvtMax = 20 +theApp.EvtMax = 30 #-------------------------------------------------------------- @@ -65,13 +69,16 @@ if nThreads >= 1: from DataModelTestDataCommon.DataModelTestDataCommonConf import \ - DMTest__CondReaderAlg, DMTest__CondAlg1 -topSequence += DMTest__CondReaderAlg() + DMTest__CondReaderAlg, DMTest__CondAlg1, DMTest__CondAlg2 +topSequence += DMTest__CondReaderAlg (RLTestKey = '/DMTest/RLTest', + TSTestKey = '/DMTest/TSTest', + S3Key = 'scond3') from AthenaCommon.AlgSequence import AthSequencer condSequence = AthSequencer("AthCondSeq") condSequence += DMTest__CondAlg1() +condSequence += DMTest__CondAlg2() #-------------------------------------------------------------- @@ -87,9 +94,11 @@ ChronoStatSvc.ChronoPrintOutTable = FALSE ChronoStatSvc.PrintUserTime = FALSE ChronoStatSvc.StatPrintOutTable = FALSE -# Increment LBN every two events. +# Increment LBN every three events, TS each event. from McEventSelector import McEventSelectorConf -svcMgr+=McEventSelectorConf.McEventSelector('EventSelector',EventsPerLB=2) +svcMgr+=McEventSelectorConf.McEventSelector('EventSelector', + EventsPerLB=3, + TimeStampInterval=1) PoolSvc = Service( "PoolSvc" ) PoolSvc.ReadCatalog = ["file:CondWriter_catalog.xml"] diff --git a/Control/DataModelTest/DataModelRunTests/share/CondWriter.ref b/Control/DataModelTest/DataModelRunTests/share/CondWriter.ref index 3037f66a83aa..42c31d048418 100644 --- a/Control/DataModelTest/DataModelRunTests/share/CondWriter.ref +++ b/Control/DataModelTest/DataModelRunTests/share/CondWriter.ref @@ -1,12 +1,12 @@ -Thu Dec 6 06:22:29 CET 2018 +Tue Dec 11 15:25:02 CET 2018 Preloading tcmalloc_minimal.so Py:Athena INFO including file "AthenaCommon/Preparation.py" -Py:Athena INFO using release [AthenaWorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3/fa0fd6d0989] -- built on [2018-12-06T0538] +Py:Athena INFO using release [WorkDir-22.0.1] [x86_64-slc6-gcc62-opt] [atlas-work3g/fc1ea6b7761] -- built on [2018-12-11T1514] Py:Athena INFO including file "AthenaCommon/Atlas.UnixStandardJob.py" Py:Athena INFO executing ROOT6Setup Py:Athena INFO including file "AthenaCommon/Execution.py" Py:Athena INFO including file "DataModelRunTests/CondWriter_jo.py" -Py:ConfigurableDb INFO Read module info for 5473 configurables from 53 genConfDb files +Py:ConfigurableDb INFO Read module info for 5443 configurables from 42 genConfDb files Py:ConfigurableDb INFO No duplicates have been found: that's good ! Py:Athena INFO including file "DataModelRunTests/loadWriteDicts.py" EventInfoMgtInit: Got release version Athena-22.0.1 @@ -17,7 +17,7 @@ ApplicationMgr INFO Updating Gaudi::PluginService::SetDebug(level) to leve ApplicationMgr SUCCESS ==================================================================================================================================== Welcome to ApplicationMgr (GaudiCoreSvc v30r5) - running on lxplus077.cern.ch on Thu Dec 6 06:22:54 2018 + running on lxplus079.cern.ch on Tue Dec 11 15:25:24 2018 ==================================================================================================================================== ApplicationMgr INFO Successfully loaded modules : AthenaServices ApplicationMgr INFO Application Manager Configured successfully @@ -29,7 +29,7 @@ ClassIDSvc INFO getRegistryEntries: read 2946 CLIDRegistry entries fo CoreDumpSvc INFO install f-a-t-a-l handler... (flag = -1) CoreDumpSvc INFO Handling signals: 11(Segmentation fault) 7(Bus error) 4(Illegal instruction) 8(Floating point exception) AthenaEventLoopMgr INFO Initializing AthenaEventLoopMgr - package version AthenaServices-00-00-00 -ClassIDSvc INFO getRegistryEntries: read 1796 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 1855 CLIDRegistry entries for module ALL PyComponentMgr INFO Initializing PyComponentMgr... LoadWriteDicts INFO Initializing LoadWriteDicts... MetaDataSvc INFO Initializing MetaDataSvc - package version AthenaServices-00-00-00 @@ -37,8 +37,8 @@ AthenaPoolCnvSvc INFO Initializing AthenaPoolCnvSvc - package version Athena PoolSvc INFO Set connectionsvc retry/timeout/IDLE timeout to 'ConnectionRetrialPeriod':300/ 'ConnectionRetrialTimeOut':3600/ 'ConnectionTimeOut':5 seconds with connection cleanup disabled PoolSvc INFO Frontier compression level set to 5 DBReplicaSvc INFO Frontier server at (serverurl=http://atlasfrontier-local.cern.ch:8000/atlr)(serverurl=http://atlasfrontier-ai.cern.ch:8000/atlr)(serverurl=http://lcgft-atlas.gridpp.rl.ac.uk:3128/frontierATLAS)(serverurl=http://ccfrontier.in2p3.fr:23128/ccin2p3-AtlasFrontier)(proxyurl=http://ca-proxy.cern.ch:3128)(proxyurl=http://ca-proxy-meyrin.cern.ch:3128)(proxyurl=http://ca-proxy-wigner.cern.ch:3128)(proxyurl=http://atlasbpfrontier.cern.ch:3127)(proxyurl=http://atlasbpfrontier.fnal.gov:3127) will be considered for COOL data -DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-04T2300/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config -DBReplicaSvc INFO Total of 10 servers found for host lxplus077.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ] +DBReplicaSvc INFO Read replica configuration from /cvmfs/atlas-nightlies.cern.ch/repo/sw/master/2018-12-10T2259/Athena/22.0.1/InstallArea/x86_64-slc6-gcc62-opt/share/dbreplica.config +DBReplicaSvc INFO Total of 10 servers found for host lxplus079.cern.ch [ATLF ATLAS_COOLPROD atlas_dd ATLAS_CONFIG INT8R INTR ATONR_COOL ATONR_CONF DEVDB11 ATLF ] PoolSvc INFO Successfully setup replica sorting algorithm PoolSvc INFO Setting up APR FileCatalog and Streams PoolSvc INFO POOL WriteCatalog is file:CondWriter_catalog.xml @@ -61,13 +61,13 @@ AthenaEventLoopMgr INFO ===>>> start of run 0 <<<=== EventPersistenc... INFO Added successfully Conversion service:AthenaPoolCnvSvc EventPersistenc... INFO Added successfully Conversion service:TagInfoMgr AthenaEventLoopMgr INFO ===>>> start processing event #0, run #0 0 events processed so far <<<=== -ClassIDSvc INFO getRegistryEntries: read 8990 CLIDRegistry entries for module ALL +ClassIDSvc INFO getRegistryEntries: read 8992 CLIDRegistry entries for module ALL IOVDbSvc INFO Opening COOL connection for sqlite://;schema=condtest.db;dbname=OFLP200 IOVDbSvc INFO *** COOL exception caught: The database does not exist IOVDbSvc INFO Create a new conditions database: sqlite://;schema=condtest.db;dbname=OFLP200 DbSession INFO Open DbSession Domain[ROOT_All] INFO > Access DbDomain UPDATE [ROOT_All] -Domain[ROOT_All] INFO -> Access DbDatabase CREATE [ROOT_All] A9C970C0-3C58-8C41-8200-4F1137A07773 +Domain[ROOT_All] INFO -> Access DbDatabase CREATE [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7 Domain[ROOT_All] INFO condtest.pool.root RootDatabase.open INFO condtest.pool.root File version:61404 StorageSvc INFO Building shape according to reflection information using shape ID for: @@ -119,9 +119,29 @@ AthenaEventLoopMgr INFO ===>>> start processing event #18, run #0 18 events AthenaEventLoopMgr INFO ===>>> done processing event #18, run #0 19 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> start processing event #19, run #0 19 events processed so far <<<=== AthenaEventLoopMgr INFO ===>>> done processing event #19, run #0 20 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #20, run #0 20 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #20, run #0 21 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #21, run #0 21 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #21, run #0 22 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #22, run #0 22 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #22, run #0 23 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #23, run #0 23 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #23, run #0 24 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #24, run #0 24 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #24, run #0 25 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #25, run #0 25 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #25, run #0 26 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #26, run #0 26 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #26, run #0 27 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #27, run #0 27 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #27, run #0 28 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #28, run #0 28 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #28, run #0 29 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> start processing event #29, run #0 29 events processed so far <<<=== +AthenaEventLoopMgr INFO ===>>> done processing event #29, run #0 30 events processed so far <<<=== Domain[ROOT_All] INFO > Deaccess DbDomain READ [ROOT_All] condtest.pool.root INFO Database being retired... -Domain[ROOT_All] INFO -> Deaccess DbDatabase CREATE [ROOT_All] A9C970C0-3C58-8C41-8200-4F1137A07773 +Domain[ROOT_All] INFO -> Deaccess DbDatabase CREATE [ROOT_All] A834E12A-0572-2942-88EC-5A969061BCA7 Domain[ROOT_All] INFO > Deaccess DbDomain UPDATE [ROOT_All] ApplicationMgr INFO Application Manager Stopped successfully IncidentProcAlg1 INFO Finalize diff --git a/Control/DataModelTest/DataModelRunTests/share/CondWriter_jo.py b/Control/DataModelTest/DataModelRunTests/share/CondWriter_jo.py index 8b027b97dc67..4c112a7fb5c8 100644 --- a/Control/DataModelTest/DataModelRunTests/share/CondWriter_jo.py +++ b/Control/DataModelTest/DataModelRunTests/share/CondWriter_jo.py @@ -29,7 +29,29 @@ include ('DataModelRunTests/loadWriteDicts.py') #-------------------------------------------------------------- # Event related parameters #-------------------------------------------------------------- -theApp.EvtMax = 20 +theApp.EvtMax = 30 + +# +# For purposes of this test, we assume that timestamp (in sec) matches +# the event number (starting with 0) and that LBN counts every 3 events. +# +# We write four folders: +# /DMTest/TestAttrList (runlbn): +# Attribute list. New IOV for every LBN. xint=(lbn+1)*10 +# /DMTest/S2 (runlbn): +# DMTest::S2. New IOV for every 2 LBNs. payload: lbn*50 +# /DMTest/RLTest (runlbn): +# Attribute list, defined as below. +# /DMTest/TSTest (timestamp): +# Attribute list, defined as below. + +# lbn: 0..1..2..3..4..5..6..7..8..9.. +# +# lbn iov: 1..2.....3..4........5..6..7.. +# ts iov: 1..2..34..5......6.7..8...9... * 100 +# +# event: 11111111112222222222 +# (ts) 012345678901234567890123456789 #-------------------------------------------------------------- # Output options @@ -38,7 +60,7 @@ theApp.EvtMax = 20 from AthenaServices.AthenaServicesConf import AthenaOutputStreamTool condstream = AthenaOutputStreamTool ('CondStream', - OutputFile = 'condtest.pool.root') + OutputFile = 'condtest.pool.root') from DataModelTestDataCommon.DataModelTestDataCommonConf import \ DMTest__CondWriterAlg diff --git a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/DataModelTestDataCommonDict.h b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/DataModelTestDataCommonDict.h index 64348ed784a8..704384590e5b 100755 --- a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/DataModelTestDataCommonDict.h +++ b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/DataModelTestDataCommonDict.h @@ -1,7 +1,7 @@ // This file's extension implies that it's C, but it's really -*- C++ -*-. /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration */ // $Id: DataModelTestDataCommonDict.h,v 1.2 2005-12-01 19:07:55 ssnyder Exp $ @@ -21,6 +21,7 @@ #include "DataModelTestDataCommon/D.h" #include "DataModelTestDataCommon/S1.h" #include "DataModelTestDataCommon/S2.h" +#include "DataModelTestDataCommon/S3.h" #include "DataModelTestDataCommon/BAux.h" #include "DataModelTestDataCommon/BAuxStandalone.h" #include "DataModelTestDataCommon/BAuxVec.h" diff --git a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3.h b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3.h new file mode 100644 index 000000000000..71568d141c61 --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3.h @@ -0,0 +1,39 @@ +// This file's extension implies that it's C, but it's really -*- C++ -*-. +/* + * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration. + */ +// $Id$ +/** + * @file DataModelTestDataCommon/S3.h + * @author scott snyder <snyder@bnl.gov> + * @date Nov, 2018 + * @brief For mixed condcont tests. + */ + + +#ifndef DATAMODELTESTDATACOMMON_S3_H +#define DATAMODELTESTDATACOMMON_S3_H + + +#include "SGTools/CLASS_DEF.h" + + +namespace DMTest { + + +class S3 +{ +public: + S3 (int x = 0) : m_x (x) {} + virtual ~S3() {} + int m_x; +}; + + +} // namespace DMTest + + +CLASS_DEF (DMTest::S3, 131160325, 0) + + +#endif // not DATAMODELTESTDATACOMMON_S3_H diff --git a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3Cond.h b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3Cond.h new file mode 100644 index 000000000000..dfe169113d6e --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/S3Cond.h @@ -0,0 +1,25 @@ +// This file's extension implies that it's C, but it's really -*- C++ -*-. +/* + * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration. + */ +// $Id$ +/** + * @file DataModelTestDataCommon/S3Cond.h + * @author scott snyder <snyder@bnl.gov> + * @date Nov, 2018 + * @brief Conditions declarations for S3. + */ + + +#ifndef DATAMODELTESTDATACOMMON_S3COND_H +#define DATAMODELTESTDATACOMMON_S3COND_H + + +#include "DataModelTestDataCommon/S3.h" +#include "AthenaKernel/CondCont.h" + + +CONDCONT_MIXED_DEF(DMTest::S3, 62539635); + + +#endif // not DATAMODELTESTDATACOMMON_S3COND_H diff --git a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/selection.xml b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/selection.xml index 6f6ac81d83d8..bc604a323d4e 100755 --- a/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/selection.xml +++ b/Control/DataModelTest/DataModelTestDataCommon/DataModelTestDataCommon/selection.xml @@ -14,6 +14,7 @@ <class name="DMTest::D"/> <class name="DMTest::S1" id="230C025C-A8BB-4C8A-9C82-04C9C3D92384"/> <class name="DMTest::S2" id="EC2D9BCD-4B99-41EB-A799-82BAF48887FC"/> + <class name="DMTest::S3"/> <class name="DMTest::BAux" id="B2751847-F5E8-456A-8C03-BCA9AEEB27DD"/> <class name="DMTest::BAuxStandalone" id="6378E4BD-95AD-4D46-9860-B15779893A75" IAuxStore="true"/> <class name="DataVector<DMTest::BAux>" id="734BB39F-4E7C-4637-8510-6716160242D4"/> diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.cxx new file mode 100644 index 000000000000..ff8f54068cc8 --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.cxx @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration. + */ +// $Id$ +/** + * @file DataModelTestDataCommon/src/CondAlg2.cxx + * @author scott snyder <snyder@bnl.gov> + * @date Nov, 2018 + * @brief Testing conditions algorithm taking both RL and TS inputs + * and producing mixed output. + */ + + +#include "CondAlg2.h" + + +namespace DMTest { + + +/** + * @brief Constructor. + * @param name The algorithm name. + * @param pSvcLocator The service locator. + */ +CondAlg2::CondAlg2 (const std::string &name, ISvcLocator *pSvcLocator) + : AthReentrantAlgorithm (name, pSvcLocator), + m_rltestKey ("/DMTest/RLTest"), + m_tstestKey ("/DMTest/TSTest"), + m_outKey ("scond3", "DMTest") +{ + declareProperty ("RLTestKey", m_rltestKey); + declareProperty ("TSTestKey", m_tstestKey); + declareProperty ("OutKey", m_outKey); +} + + +/** + * @brief Algorithm initialization; called at the beginning of the job. + */ +StatusCode CondAlg2::initialize() +{ + ATH_CHECK( m_rltestKey.initialize() ); + ATH_CHECK( m_tstestKey.initialize() ); + ATH_CHECK( m_outKey.initialize() ); + return StatusCode::SUCCESS; +} + + +/** + * @brief Algorithm event processing. + */ +StatusCode CondAlg2::execute_r (const EventContext& ctx) const +{ + SG::ReadCondHandle<AthenaAttributeList> rltest (m_rltestKey, ctx); + int xint_rl = (**rltest)["xint"].data<int>(); + + SG::ReadCondHandle<AthenaAttributeList> tstest (m_tstestKey, ctx); + int xint_ts = (**tstest)["xint"].data<int>(); + + EventIDRange range_rl; + ATH_CHECK( rltest.range(range_rl) ); + + EventIDRange range_ts; + ATH_CHECK( tstest.range(range_ts) ); + + EventIDBase start (range_rl.start().run_number(), + range_rl.start().event_number(), + range_ts.start().time_stamp(), + range_ts.start().time_stamp_ns_offset(), + range_rl.start().lumi_block()); + EventIDBase stop (range_rl.stop().run_number(), + range_rl.stop().event_number(), + range_ts.stop().time_stamp(), + range_ts.stop().time_stamp_ns_offset(), + range_rl.stop().lumi_block()); + + EventIDRange range (start, stop); + + SG::WriteCondHandle<DMTest::S3> out (m_outKey, ctx); + auto s3 = std::make_unique<DMTest::S3> (xint_rl + xint_ts); + ATH_CHECK( out.record (range, std::move(s3)) ); + + return StatusCode::SUCCESS; +} + + +} // namespace DMTest diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.h b/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.h new file mode 100644 index 000000000000..b4a9a1461938 --- /dev/null +++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondAlg2.h @@ -0,0 +1,63 @@ +// This file's extension implies that it's C, but it's really -*- C++ -*-. +/* + * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration. + */ +// $Id$ +/** + * @file DataModelTestDataCommon/src/CondAlg2.h + * @author scott snyder <snyder@bnl.gov> + * @date Nov, 2018 + * @brief Testing conditions algorithm taking both RL and TS inputs + * and producing mixed output. + */ + + +#ifndef DATAMODELTESTDATACOMMON_CONDALG2_H +#define DATAMODELTESTDATACOMMON_CONDALG2_H + + +#include "DataModelTestDataCommon/S3Cond.h" +#include "AthenaBaseComps/AthReentrantAlgorithm.h" +#include "AthenaPoolUtilities/AthenaAttributeList.h" +#include "StoreGate/ReadCondHandleKey.h" +#include "StoreGate/WriteCondHandleKey.h" + + +namespace DMTest { + + +class CondAlg2 + : public AthReentrantAlgorithm +{ +public: + /** + * @brief Constructor. + * @param name The algorithm name. + * @param pSvcLocator The service locator. + */ + CondAlg2 (const std::string &name, ISvcLocator *pSvcLocator); + + + /** + * @brief Algorithm initialization; called at the beginning of the job. + */ + virtual StatusCode initialize() override; + + + /** + * @brief Algorithm event processing. + */ + virtual StatusCode execute_r (const EventContext& ctx) const override; + + +private: + SG::ReadCondHandleKey<AthenaAttributeList> m_rltestKey; + SG::ReadCondHandleKey<AthenaAttributeList> m_tstestKey; + SG::WriteCondHandleKey<DMTest::S3> m_outKey; +}; + + +} // namespace DMTest + + +#endif // not DATAMODELTESTDATACOMMON_CONDALG2_H diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.cxx index 079279a66ec1..857844c074f0 100644 --- a/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.cxx +++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.cxx @@ -30,13 +30,19 @@ CondReaderAlg::CondReaderAlg (const std::string& name, ISvcLocator *pSvcLocator) m_chronoSvc ("ChronoStatSvc", name), m_attrListKey ("/DMTest/TestAttrList"), m_scondKey ("scond", "DMTest"), - m_s2Key ("/DMTest/S2") + m_s2Key ("/DMTest/S2"), + m_s3Key(""), + m_rltestKey (""), + m_tstestKey ("") { declareProperty ("ChronoSvc", m_chronoSvc); declareProperty ("EventInfoKey", m_eventInfoKey = "McEventInfo"); declareProperty ("AttrListKey", m_attrListKey); declareProperty ("SCondKey", m_scondKey); declareProperty ("S2Key", m_s2Key); + declareProperty ("S3Key", m_s3Key); + declareProperty ("RLTestKey", m_rltestKey); + declareProperty ("TSTestKey", m_tstestKey); declareProperty ("Spins", m_spins = 0); } @@ -54,6 +60,10 @@ StatusCode CondReaderAlg::initialize() // Allow running without POOL payload if ( !m_s2Key.key().empty()) ATH_CHECK( m_s2Key.initialize() ); + if ( !m_s3Key.key().empty()) ATH_CHECK( m_s3Key.initialize() ); + if ( !m_rltestKey.key().empty()) ATH_CHECK( m_rltestKey.initialize() ); + if ( !m_tstestKey.key().empty()) ATH_CHECK( m_tstestKey.initialize() ); + return StatusCode::SUCCESS; } @@ -79,6 +89,21 @@ StatusCode CondReaderAlg::execute (const EventContext& ctx) const ATH_MSG_INFO (" s2 " << s2->m_x ); } + if (!m_rltestKey.key().empty()) { + SG::ReadCondHandle<AthenaAttributeList> rl (m_rltestKey, ctx); + ATH_MSG_INFO (" rl " << (**rl)["xint"]); + } + + if (!m_tstestKey.key().empty()) { + SG::ReadCondHandle<AthenaAttributeList> ts (m_tstestKey, ctx); + ATH_MSG_INFO (" ts " << (**ts)["xint"]); + } + + if (!m_s3Key.key().empty()) { + SG::ReadCondHandle<DMTest::S3> s3 (m_s3Key, ctx); + ATH_MSG_INFO (" s3 " << s3->m_x ); + } + { std::string xint = "xint"; Chrono chrono (&*m_chronoSvc, "spin time"); diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.h b/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.h index 06781d9024b3..58d158d42ed7 100644 --- a/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.h +++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondReaderAlg.h @@ -1,6 +1,6 @@ // This file's extension implies that it's C, but it's really -*- C++ -*-. /* - * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration. + * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration. */ // $Id$ /** @@ -16,6 +16,7 @@ #include "DataModelTestDataCommon/S1Cond.h" +#include "DataModelTestDataCommon/S3Cond.h" #include "EventInfo/EventInfo.h" #include "AthenaBaseComps/AthReentrantAlgorithm.h" #include "AthenaPoolUtilities/AthenaAttributeList.h" @@ -58,6 +59,9 @@ private: SG::ReadCondHandleKey<AthenaAttributeList> m_attrListKey; SG::ReadCondHandleKey<DMTest::S1> m_scondKey; SG::ReadCondHandleKey<DMTest::S1> m_s2Key; + SG::ReadCondHandleKey<DMTest::S3> m_s3Key; + SG::ReadCondHandleKey<AthenaAttributeList> m_rltestKey; + SG::ReadCondHandleKey<AthenaAttributeList> m_tstestKey; size_t m_spins; }; diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.cxx index c7692d8d1785..ac4774c6a7f5 100644 --- a/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.cxx +++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.cxx @@ -35,6 +35,8 @@ CondWriterAlg::CondWriterAlg (const std::string &name, ISvcLocator *pSvcLocator) declareProperty ("EventInfoKey", m_eventInfoKey = "McEventInfo"); declareProperty ("AttrListKey", m_attrListKey = "/DMTest/TestAttrList"); declareProperty ("S2Key", m_s2Key = "/DMTest/S2"); + declareProperty ("RLTestKey", m_rltestKey = "/DMTest/RLTest"); + declareProperty ("TSTestKey", m_tstestKey = "/DMTest/TSTest"); } @@ -72,6 +74,61 @@ StatusCode CondWriterAlg::writeSCond (unsigned int count) } +StatusCode CondWriterAlg::writeRLTest (unsigned int count) +{ + // Bound in LBN. + static const unsigned int bounds[] = { 0, 1, 3, 4, 7, 8, 9 }; + + unsigned int lbn = count / 3; + const unsigned int* pos = std::find (std::begin(bounds), + std::end(bounds), + lbn); + if (pos != std::end(bounds)) { + unsigned int niov = pos - std::begin(bounds) + 1; + + auto attrList = std::make_unique<AthenaAttributeList>(); + attrList->extend ("xint", "int"); + (*attrList)["xint"].setValue(static_cast<int> (niov)); + ATH_CHECK( detStore()->overwrite (std::move (attrList), m_rltestKey) ); + + ATH_CHECK( m_regSvc->registerIOV ("AthenaAttributeList", + m_rltestKey, + "RL_noTag", + 0, 0, + lbn, IOVTime::MAXEVENT) ); + } + + return StatusCode::SUCCESS; +} + + +StatusCode CondWriterAlg::writeTSTest (unsigned int count) +{ + // Bound in count. + static const unsigned int bounds[] = { 0, 3, 6, 7, 10, 17, 19, 22, 26 }; + + const unsigned int* pos = std::find (std::begin(bounds), + std::end(bounds), + count); + if (pos != std::end(bounds)) { + unsigned int niov = pos - std::begin(bounds) + 1; + + auto attrList = std::make_unique<AthenaAttributeList>(); + attrList->extend ("xint", "int"); + (*attrList)["xint"].setValue(static_cast<int> (niov * 100)); + ATH_CHECK( detStore()->overwrite (std::move (attrList), m_tstestKey) ); + + ATH_CHECK( m_regSvc->registerIOV ("AthenaAttributeList", + m_tstestKey, + "TS_noTag", + static_cast<uint64_t>(count) * 1000000000, + IOVTime::MAXTIMESTAMP) ); + } + + return StatusCode::SUCCESS; +} + + /** * @brief Algorithm event processing. */ @@ -96,6 +153,9 @@ StatusCode CondWriterAlg::execute() ATH_CHECK( writeSCond (count) ); } + ATH_CHECK( writeRLTest (count) ); + ATH_CHECK( writeTSTest (count) ); + return StatusCode::SUCCESS; } diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.h b/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.h index 8d899ce2b429..dab470ced320 100644 --- a/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.h +++ b/Control/DataModelTest/DataModelTestDataCommon/src/CondWriterAlg.h @@ -1,6 +1,6 @@ // This file's extension implies that it's C, but it's really -*- C++ -*-. /* - * Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration. + * Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration. */ // $Id$ /** @@ -53,12 +53,16 @@ public: private: StatusCode writeSCond (unsigned int count); + StatusCode writeRLTest (unsigned int count); + StatusCode writeTSTest (unsigned int count); ServiceHandle<IIOVRegistrationSvc> m_regSvc; ToolHandle<IAthenaOutputStreamTool> m_streamer; SG::ReadHandleKey<EventInfo> m_eventInfoKey; std::string m_attrListKey; std::string m_s2Key; + std::string m_rltestKey; + std::string m_tstestKey; }; diff --git a/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx b/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx index 63c29a927ba4..ed7277f358bc 100644 --- a/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx +++ b/Control/DataModelTest/DataModelTestDataCommon/src/components/DataModelTestDataCommon_entries.cxx @@ -21,6 +21,7 @@ #include "../CondReaderAlg.h" #include "../xAODTestReadSymlinkTool.h" #include "../CondAlg1.h" +#include "../CondAlg2.h" #include "../MetaWriterAlg.h" #include "../MetaReaderAlg.h" @@ -33,6 +34,7 @@ DECLARE_COMPONENT( DMTest::CondWriterAlg ) DECLARE_COMPONENT( DMTest::CondWriterExtAlg ) DECLARE_COMPONENT( DMTest::CondReaderAlg ) DECLARE_COMPONENT( DMTest::CondAlg1 ) +DECLARE_COMPONENT( DMTest::CondAlg2 ) DECLARE_COMPONENT( DMTest::MetaWriterAlg ) DECLARE_COMPONENT( DMTest::MetaReaderAlg ) -- GitLab