From 3753f8bd8025131cc0b62da8942daefc376c1c46 Mon Sep 17 00:00:00 2001 From: "Eduardo Ramos Testillano (eramedu)" Date: Fri, 15 May 2020 17:06:16 +0200 Subject: [PATCH] Allow separate stacks registration through services operation 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 | 3 +- include/anna/core/oam/Module.hpp | 4 +++ source/core/oam/CounterScope.cpp | 2 +- source/core/oam/Module.cpp | 48 +++++++++++++++++++------- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/example/diameter/launcher/Launcher.cpp b/example/diameter/launcher/Launcher.cpp index 2ad9a59..0fe55a0 100644 --- a/example/diameter/launcher/Launcher.cpp +++ b/example/diameter/launcher/Launcher.cpp @@ -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) - static int scope_id = 3; + static int scope_id = 3 + appMsgOamModule.scopes(); + unsigned int id_value; std::string codecEngineName; diff --git a/include/anna/core/oam/Module.hpp b/include/anna/core/oam/Module.hpp index 533eaad..520bef2 100644 --- a/include/anna/core/oam/Module.hpp +++ b/include/anna/core/oam/Module.hpp @@ -224,6 +224,10 @@ public: */ 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). diff --git a/source/core/oam/CounterScope.cpp b/source/core/oam/CounterScope.cpp index 76215f0..8900d3e 100644 --- a/source/core/oam/CounterScope.cpp +++ b/source/core/oam/CounterScope.cpp @@ -33,7 +33,7 @@ using namespace anna; 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__); \ } diff --git a/source/core/oam/Module.cpp b/source/core/oam/Module.cpp index b7baf28..2fa403e 100644 --- a/source/core/oam/Module.cpp +++ b/source/core/oam/Module.cpp @@ -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: - 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) { @@ -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) : - a_module(module) { - module->a_counterRecording = true; -} - + a_module(module) { + module->a_counterRecording = true; +} + //------------------------------------------------------------------------------ //------------------------------------ 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); + + // 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 += "'"; - 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); - unsigned long long int accValue = scope(scope_it)->getAccValue(offset); + accValue = scope(scope_it)->getAccValue(offset); 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); + + // 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); - 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)); - unsigned long long int accValue = scope(scope_it)->getAccValue(offset); if(accValue != 0ULL) counter->createAttribute("AccumulatedAmount", anna::functions::asString("%llu", accValue)); -- 2.20.1