From 3314e7e6eb1f43201a2b37264d909d301526d08f Mon Sep 17 00:00:00 2001
From: Susumu Oda <susumu.oda@cern.ch>
Date: Thu, 23 May 2019 09:31:12 +0000
Subject: [PATCH] Fix ATLASRECTS-4966 by downgrading ERROR messages to WARNING
 messages and limiting the number of such WARNINGs.

---
 .../src/SCT_FlaggedConditionTool.cxx          | 32 ++++++++++++++++---
 .../src/SCT_FlaggedConditionTool.h            | 10 ++++--
 2 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_FlaggedConditionTool.cxx b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_FlaggedConditionTool.cxx
index 31d6a016fa5..333d74c08f3 100644
--- a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_FlaggedConditionTool.cxx
+++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_FlaggedConditionTool.cxx
@@ -64,7 +64,13 @@ bool SCT_FlaggedConditionTool::isGood(const Identifier& elementId, InDetConditio
 bool SCT_FlaggedConditionTool::isGood(const IdentifierHash& hashId, const EventContext& ctx) const {
   const SCT_FlaggedCondData* badIds{getCondData(ctx)};
   if (badIds==nullptr) {
-    ATH_MSG_ERROR("SCT_FlaggedCondData cannot be retrieved. (isGood)");
+    if (m_numWarnForFailures<m_maxNumWarnForFailures) {
+      ATH_MSG_WARNING("SCT_FlaggedCondData cannot be retrieved. (isGood)");
+      m_numWarnForFailures++;
+      if (m_numWarnForFailures==m_maxNumWarnForFailures) {
+        ATH_MSG_WARNING("Disabling this type of messages from " << name());
+      }
+    }
     return false;
   }
 
@@ -84,7 +90,13 @@ const std::string& SCT_FlaggedConditionTool::details(const IdentifierHash& hashI
 
   const SCT_FlaggedCondData* badIds{getCondData(ctx)};
   if (badIds==nullptr) {
-    ATH_MSG_ERROR("SCT_FlaggedCondData cannot be retrieved. (details)");
+    if (m_numWarnForFailures<m_maxNumWarnForFailures) {
+      ATH_MSG_WARNING("SCT_FlaggedCondData cannot be retrieved. (details)");
+      m_numWarnForFailures++;
+      if (m_numWarnForFailures==m_maxNumWarnForFailures) {
+        ATH_MSG_WARNING("Disabling this type of messages from " << name());
+      }
+    }
     return nullString;
   }
 
@@ -112,7 +124,13 @@ const std::string& SCT_FlaggedConditionTool::details(const Identifier& Id) const
 int SCT_FlaggedConditionTool::numBadIds(const EventContext& ctx) const {
   const SCT_FlaggedCondData* badIds{getCondData(ctx)};
   if (badIds==nullptr) {
-    ATH_MSG_ERROR("SCT_FlaggedCondData cannot be retrieved. (numBadIds)");
+    if (m_numWarnForFailures<m_maxNumWarnForFailures) {
+      ATH_MSG_WARNING("SCT_FlaggedCondData cannot be retrieved. (numBadIds)");
+      m_numWarnForFailures++;
+      if (m_numWarnForFailures==m_maxNumWarnForFailures) {
+        ATH_MSG_WARNING("Disabling this type of messages from " << name());
+      }
+    }
     return -1;
   }
 
@@ -136,7 +154,13 @@ const SCT_FlaggedCondData* SCT_FlaggedConditionTool::getBadIds() const {
 const SCT_FlaggedCondData* SCT_FlaggedConditionTool::getCondData(const EventContext& ctx) const {
   SG::ReadHandle<SCT_FlaggedCondData> condData{m_badIds, ctx};
   if (not condData.isValid()) {
-    ATH_MSG_ERROR("Failed to get " << m_badIds.key());
+    if (m_numWarnForFailures<m_maxNumWarnForFailures) {
+      ATH_MSG_WARNING("Failed to get " << m_badIds.key());
+      m_numWarnForFailures++;
+      if (m_numWarnForFailures==m_maxNumWarnForFailures) {
+        ATH_MSG_WARNING("Disabling this type of messages from " << name());
+      }
+    }
     return nullptr;
   }
   return condData.cptr();
diff --git a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_FlaggedConditionTool.h b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_FlaggedConditionTool.h
index 552c4419bfd..60c54b3686e 100644
--- a/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_FlaggedConditionTool.h
+++ b/InnerDetector/InDetConditions/SCT_ConditionsTools/src/SCT_FlaggedConditionTool.h
@@ -1,3 +1,5 @@
+// -*- C++ -*-
+
 /*
   Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
@@ -11,14 +13,15 @@
 #ifndef SCT_FlaggedConditionTool_h
 #define SCT_FlaggedConditionTool_h
  
-// Gaudi
-
 // Athena
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "SCT_ConditionsTools/ISCT_FlaggedConditionTool.h"
 #include "InDetConditionsSummaryService/InDetHierarchy.h"
 #include "StoreGate/ReadHandleKey.h"
 
+// STL
+#include <atomic>
+
 // Forward declarations
 class SCT_ID;
 
@@ -67,6 +70,9 @@ public:
   // SCT_FlaggedCondData_TRIG created by SCT_TrgClusterization for InDetTrigInDetSCT_FlaggedConditionTool
   SG::ReadHandleKey<SCT_FlaggedCondData> m_badIds{this, "SCT_FlaggedCondData", "SCT_FlaggedCondData", "SCT flagged conditions data"};
 
+  UnsignedIntegerProperty m_maxNumWarnForFailures{this, "MaxNumWarnForFailures", 5};
+  mutable std::atomic_uint m_numWarnForFailures{0};
+
   const SCT_ID* m_sctID{nullptr}; //!< ID helper for SCT
 
   const SCT_FlaggedCondData* getCondData(const EventContext& ctx) const;
-- 
GitLab