Allow separate stacks registration through services operation
authorEduardo Ramos Testillano (eramedu) <eduardo.ramos.testillano@ericsson.com>
Fri, 15 May 2020 15:06:16 +0000 (17:06 +0200)
committerEduardo Ramos Testillano (eramedu) <eduardo.ramos.testillano@ericsson.com>
Fri, 15 May 2020 15:13:47 +0000 (17:13 +0200)
Until now, stacks could not be delta-loaded. All the stacks might be
loaded in a unique single xml file (or xml representation through
rest api). This was due to counterscope initialization restriction:
once a counter was registered (due to event received), you could not
initialize more counter scopes.

We removed this restriction (now commented on initializeCountersScope).
New scopes() method to know current registered ones in order to put
the correct start point at services load procedure.

The services "node" nodes always could be loaded separately, so, no
impact on functional behaviour for this.

Fixed: https://redmine.teslayout.com/issues/48

example/diameter/launcher/Launcher.cpp
include/anna/core/oam/Module.hpp
source/core/oam/CounterScope.cpp
source/core/oam/Module.cpp

index 2ad9a59..0fe55a0 100644 (file)
@@ -189,7 +189,8 @@ void Launcher::servicesFromXML(const anna::xml::Node* servicesNode, bool bindRes
   // We will register a scope per stack id registered. The counters will be dynamically registered at count method.
   anna::diameter::comm::ApplicationMessageOamModule & appMsgOamModule = anna::diameter::comm::ApplicationMessageOamModule::instantiate();
   appMsgOamModule.enableCounters(); // this special module is disabled by default (the only)
   // We will register a scope per stack id registered. The counters will be dynamically registered at count method.
   anna::diameter::comm::ApplicationMessageOamModule & appMsgOamModule = anna::diameter::comm::ApplicationMessageOamModule::instantiate();
   appMsgOamModule.enableCounters(); // this special module is disabled by default (the only)
-  static int scope_id = 3;
+  static int scope_id = 3 + appMsgOamModule.scopes();
+
   unsigned int id_value;
   std::string codecEngineName;
 
   unsigned int id_value;
   std::string codecEngineName;
 
index 533eaad..520bef2 100644 (file)
@@ -224,6 +224,10 @@ public:
    */
   virtual ~Module();
 
    */
   virtual ~Module();
 
+  /**
+  * Number of scopes registered
+  */
+  int scopes() const { return a_scopes.size(); }
 
   /**
   * Enable all the counters registered in this module (enabled by default at constructor).
 
   /**
   * Enable all the counters registered in this module (enabled by default at constructor).
index 76215f0..8900d3e 100644 (file)
@@ -33,7 +33,7 @@ using namespace anna;
    if (a_counters [index] == NULL) { \
       string msg (asString ()); \
       msg += functions::asText (" | CounterId: ", index); \
    if (a_counters [index] == NULL) { \
       string msg (asString ()); \
       msg += functions::asText (" | CounterId: ", index); \
-      msg += " | Counter Id is not defined"; \
+      msg += " | Counter Id is not defined yet"; \
       throw RuntimeException (msg, __FILE__, __LINE__); \
    }
 
       throw RuntimeException (msg, __FILE__, __LINE__); \
    }
 
index b7baf28..2fa403e 100644 (file)
@@ -229,8 +229,9 @@ void anna::oam::Module::initializeCounterScope(const int & scopeId, const std::s
   LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "initializeCounterScope", ANNA_FILE_LOCATION));
 
   // Order of use:
   LOGMETHOD(anna::TraceMethod tttm("anna::oam::Module", "initializeCounterScope", ANNA_FILE_LOCATION));
 
   // Order of use:
-  if(a_counters.size() != 0)  // any counter have been registered
-    throw anna::RuntimeException("After use of counter registration can't initialize more scope ids!. Do initializations firstly", ANNA_FILE_LOCATION);
+  // https://redmine.teslayout.com/issues/48
+  //if(a_counters.size() != 0)  // any counter have been registered
+  //  throw anna::RuntimeException("After use of counter registration can't initialize more scope ids!. Do initializations firstly", ANNA_FILE_LOCATION);
 
   // Scope range: 0 - 99
   if(scopeId < 0 || scopeId >= MaxScope) {
 
   // Scope range: 0 - 99
   if(scopeId < 0 || scopeId >= MaxScope) {
@@ -479,17 +480,17 @@ int anna::oam::Module::resetCounters(const int & scopeId) throw() {
 //------------------------------------- Module::RecordingGuard::RecordingGuard()
 //------------------------------------------------------------------------------
 anna::oam::Module::RecordingGuard::RecordingGuard(anna::oam::Module* module) :
 //------------------------------------- Module::RecordingGuard::RecordingGuard()
 //------------------------------------------------------------------------------
 anna::oam::Module::RecordingGuard::RecordingGuard(anna::oam::Module* module) :
-  a_module(module) {                                                
-  module->a_counterRecording = true;                                               
-}                                                                                   
-                                                                                    
+  a_module(module) {
+  module->a_counterRecording = true;
+}
+
 
 //------------------------------------------------------------------------------
 //------------------------------------ Module::RecordingGuard::~RecordingGuard()
 //------------------------------------------------------------------------------
 
 //------------------------------------------------------------------------------
 //------------------------------------ Module::RecordingGuard::~RecordingGuard()
 //------------------------------------------------------------------------------
-anna::oam::Module::RecordingGuard::~RecordingGuard() {                            
-  a_module->a_counterRecording = false;                                            
-}                                                                                   
+anna::oam::Module::RecordingGuard::~RecordingGuard() {
+  a_module->a_counterRecording = false;
+}
 
 
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
@@ -561,14 +562,25 @@ std::string anna::oam::Module::asString(void) const throw() {
 
     for(const_counter_iterator cnt_it = counter_begin(); cnt_it != counter_end(); cnt_it++) {
       ptrCounterData = (counter_data_t *) & ((*cnt_it).second);
 
     for(const_counter_iterator cnt_it = counter_begin(); cnt_it != counter_end(); cnt_it++) {
       ptrCounterData = (counter_data_t *) & ((*cnt_it).second);
+
+      // Counter registered ?
+      int offset = ptrCounterData->Offset;
+      unsigned long long int accValue = 0ULL;
+      try {
+        const anna::oam::CounterScope *csAux = scope(scope_it);
+        accValue = csAux->getAccValue(offset);
+      } catch(anna::RuntimeException &ex) {
+        ex.trace();
+        continue;
+      }
+
       // Counter:
       trace += "\n\tType: "; trace += anna::functions::asString((*cnt_it).first);
       trace += " | Description: '"; trace += ptrCounterData->Description; trace += "'";
       // Counter:
       trace += "\n\tType: "; trace += anna::functions::asString((*cnt_it).first);
       trace += " | Description: '"; trace += ptrCounterData->Description; trace += "'";
-      int offset = ptrCounterData->Offset;
       int realId = (1000 * scopeId) + offset;
       trace += " | ScopeId/Offset: "; trace += anna::functions::asString(scopeId); trace += "/"; trace += anna::functions::asString(offset);
       trace += " | RealId: "; trace += anna::functions::asString(realId);
       int realId = (1000 * scopeId) + offset;
       trace += " | ScopeId/Offset: "; trace += anna::functions::asString(scopeId); trace += "/"; trace += anna::functions::asString(offset);
       trace += " | RealId: "; trace += anna::functions::asString(realId);
-      unsigned long long int accValue = scope(scope_it)->getAccValue(offset);
+      accValue = scope(scope_it)->getAccValue(offset);
 
       if(accValue != 0ULL) {
         trace += " | AccumulatedAmount: ";
 
       if(accValue != 0ULL) {
         trace += " | AccumulatedAmount: ";
@@ -622,16 +634,26 @@ anna::xml::Node* anna::oam::Module::asXML(anna::xml::Node* parent) const throw()
 
     for(const_counter_iterator cnt_it = counter_begin(); cnt_it != counter_end(); cnt_it++) {
       ptrCounterData = (counter_data_t *) & ((*cnt_it).second);
 
     for(const_counter_iterator cnt_it = counter_begin(); cnt_it != counter_end(); cnt_it++) {
       ptrCounterData = (counter_data_t *) & ((*cnt_it).second);
+
+      // Counter registered ?
+      int offset = ptrCounterData->Offset;
+      unsigned long long int accValue = 0ULL;
+      try {
+        const anna::oam::CounterScope *csAux = scope(scope_it);
+        accValue = csAux->getAccValue(offset);
+      } catch(anna::RuntimeException &ex) {
+        ex.trace();
+        continue;
+      }
+
       // Counter:
       anna::xml::Node* counter = registeredCounters->createChild("Counter");
       counter->createAttribute("Type", anna::functions::asString((*cnt_it).first));
       counter->createAttribute("Description", ptrCounterData->Description);
       // Counter:
       anna::xml::Node* counter = registeredCounters->createChild("Counter");
       counter->createAttribute("Type", anna::functions::asString((*cnt_it).first));
       counter->createAttribute("Description", ptrCounterData->Description);
-      int offset = ptrCounterData->Offset;
       int realId = (1000 * scopeId) + offset;
       counter->createAttribute("ScopeId", anna::functions::asString(scopeId));
       counter->createAttribute("Offset", anna::functions::asString(offset));
       counter->createAttribute("RealId", anna::functions::asString(realId));
       int realId = (1000 * scopeId) + offset;
       counter->createAttribute("ScopeId", anna::functions::asString(scopeId));
       counter->createAttribute("Offset", anna::functions::asString(offset));
       counter->createAttribute("RealId", anna::functions::asString(realId));
-      unsigned long long int accValue = scope(scope_it)->getAccValue(offset);
 
       if(accValue != 0ULL)
         counter->createAttribute("AccumulatedAmount", anna::functions::asString("%llu", accValue));
 
       if(accValue != 0ULL)
         counter->createAttribute("AccumulatedAmount", anna::functions::asString("%llu", accValue));