summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/MetricsAdminI.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-09-14 13:44:07 +0200
committerBenoit Foucher <benoit@zeroc.com>2012-09-14 13:44:07 +0200
commitb0813ac3b91f6e29d241c5ba49d62756e821aaaf (patch)
tree97e47bd463c808ece95ea75ddcbe04475c0beb55 /cpp/src/Ice/MetricsAdminI.cpp
parentJava & C# PropertiesAdmin fixes (diff)
downloadice-b0813ac3b91f6e29d241c5ba49d62756e821aaaf.tar.bz2
ice-b0813ac3b91f6e29d241c5ba49d62756e821aaaf.tar.xz
ice-b0813ac3b91f6e29d241c5ba49d62756e821aaaf.zip
Fixed to remove need for calling updateViews after map registration
Diffstat (limited to 'cpp/src/Ice/MetricsAdminI.cpp')
-rw-r--r--cpp/src/Ice/MetricsAdminI.cpp150
1 files changed, 103 insertions, 47 deletions
diff --git a/cpp/src/Ice/MetricsAdminI.cpp b/cpp/src/Ice/MetricsAdminI.cpp
index 493f0a30e40..53448eb1173 100644
--- a/cpp/src/Ice/MetricsAdminI.cpp
+++ b/cpp/src/Ice/MetricsAdminI.cpp
@@ -236,11 +236,9 @@ MetricsViewI::MetricsViewI(const string& name) : _name(name)
{
}
-void
-MetricsViewI::update(const PropertiesPtr& properties,
- const map<string, MetricsMapFactoryPtr>& factories,
- set<MetricsMapFactoryPtr>& updatedMaps,
- const Ice::LoggerPtr& logger)
+bool
+MetricsViewI::addOrUpdateMap(const PropertiesPtr& properties, const string& mapName,
+ const MetricsMapFactoryPtr& factory, const Ice::LoggerPtr& logger)
{
//
// Add maps to views configured with the given map.
@@ -248,53 +246,61 @@ MetricsViewI::update(const PropertiesPtr& properties,
const string viewPrefix = "IceMX.Metrics." + _name + ".";
const string mapsPrefix = viewPrefix + "Map.";
PropertyDict mapsProps = properties->getPropertiesForPrefix(mapsPrefix);
- for(map<string, MetricsMapFactoryPtr>::const_iterator p = factories.begin(); p != factories.end(); ++p)
+
+ string mapPrefix;
+ PropertyDict mapProps;
+ if(!mapsProps.empty())
{
- const string& mapName = p->first;
- string mapPrefix;
- PropertyDict mapProps;
- if(!mapsProps.empty())
+ mapPrefix = mapsPrefix + mapName + ".";
+ mapProps = properties->getPropertiesForPrefix(mapPrefix);
+ if(mapProps.empty())
{
- mapPrefix = mapsPrefix + mapName + ".";
- mapProps = properties->getPropertiesForPrefix(mapPrefix);
- if(mapProps.empty())
- {
- // This map isn't configured anymore for this view.
- updatedMaps.insert(p->second);
- _maps.erase(mapName);
- continue;
- }
- }
- else
- {
- mapPrefix = viewPrefix;
- mapProps = properties->getPropertiesForPrefix(mapPrefix);
+ // This map isn't configured for this view.
+ _maps.erase(mapName);
+ return true;
}
+ }
+ else
+ {
+ mapPrefix = viewPrefix;
+ mapProps = properties->getPropertiesForPrefix(mapPrefix);
+ }
- map<string, MetricsMapIPtr>::iterator q = _maps.find(mapName);
- if(q != _maps.end() && q->second->getProperties() == mapProps)
- {
- continue; // The map configuration didn't change, no need to re-create.
- }
+ map<string, MetricsMapIPtr>::iterator q = _maps.find(mapName);
+ if(q != _maps.end() && q->second->getProperties() == mapProps)
+ {
+ return false; // The map configuration didn't change, no need to re-create.
+ }
- try
- {
- _maps[mapName] = p->second->create(mapPrefix, properties);
- }
- catch(const std::exception& ex)
- {
- Ice::Warning warn(logger);
- warn << "unexpected exception while creating metrics map:\n" << ex;
- _maps.erase(mapName);
- }
- catch(const string& msg)
- {
- Ice::Warning warn(logger);
- warn << msg;
- _maps.erase(mapName);
- }
- updatedMaps.insert(p->second);
+ try
+ {
+ _maps[mapName] = factory->create(mapPrefix, properties);
+ }
+ catch(const std::exception& ex)
+ {
+ Ice::Warning warn(logger);
+ warn << "unexpected exception while creating metrics map:\n" << ex;
+ _maps.erase(mapName);
+ }
+ catch(const string& msg)
+ {
+ Ice::Warning warn(logger);
+ warn << msg;
+ _maps.erase(mapName);
}
+ return true;
+}
+
+bool
+MetricsViewI::removeMap(const string& mapName)
+{
+ map<string, MetricsMapIPtr>::iterator q = _maps.find(mapName);
+ if(q != _maps.end())
+ {
+ _maps.erase(q);
+ return true;
+ }
+ return false;
}
MetricsView
@@ -404,7 +410,14 @@ MetricsAdminI::updateViews()
{
q = views.insert(make_pair(viewName, q->second)).first;
}
- q->second->update(_properties, _factories, updatedMaps, _logger);
+
+ for(map<string, MetricsMapFactoryPtr>::const_iterator p = _factories.begin(); p != _factories.end(); ++p)
+ {
+ if(q->second->addOrUpdateMap(_properties, p->first, p->second, _logger))
+ {
+ updatedMaps.insert(p->second);
+ }
+ }
}
_views.swap(views);
@@ -433,6 +446,28 @@ MetricsAdminI::updateViews()
}
}
+void
+MetricsAdminI::unregisterMap(const std::string& mapName)
+{
+ bool updated;
+ MetricsMapFactoryPtr factory;
+ {
+ Lock sync(*this);
+ map<string, MetricsMapFactoryPtr>::iterator p = _factories.find(mapName);
+ if(p == _factories.end())
+ {
+ return;
+ }
+ factory = p->second;
+ _factories.erase(p);
+ updated = removeMap(mapName);
+ }
+ if(updated)
+ {
+ factory->update();
+ }
+}
+
StringSeq
MetricsAdminI::getMetricsViewNames(const Current&)
{
@@ -532,3 +567,24 @@ MetricsAdminI::updated(const PropertyDict& props)
}
}
+bool
+MetricsAdminI::addOrUpdateMap(const std::string& mapName, const MetricsMapFactoryPtr& factory)
+{
+ bool updated = false;
+ for(std::map<string, MetricsViewIPtr>::const_iterator p = _views.begin(); p != _views.end(); ++p)
+ {
+ updated |= p->second->addOrUpdateMap(_properties, mapName, factory, _logger);
+ }
+ return updated;
+}
+
+bool
+MetricsAdminI::removeMap(const std::string& mapName)
+{
+ bool updated = false;
+ for(std::map<string, MetricsViewIPtr>::const_iterator p = _views.begin(); p != _views.end(); ++p)
+ {
+ updated |= p->second->removeMap(mapName);
+ }
+ return updated;
+}