From d3bdd0f9b37d8050b6b348294d353b7981f6f9c5 Mon Sep 17 00:00:00 2001 From: Zofia Abramowska Date: Tue, 18 Nov 2014 17:04:33 +0100 Subject: [PATCH] Add invalidation mechanism for plugins Every time the cynara storage is changed all data stored in service and client plugins should be invalidated. Change-Id: I7537aa8a6d3ea28efed0f3e0f986ae51d7f9d344 --- src/client-common/cache/CapacityCache.cpp | 4 ++++ src/client-common/plugins/NaiveInterpreter.h | 2 ++ src/common/plugin/ExternalPluginInterface.h | 7 +++++++ src/common/plugin/PluginManager.cpp | 6 ++++++ src/common/plugin/PluginManager.h | 1 + src/service/logic/Logic.cpp | 1 + 6 files changed, 21 insertions(+) diff --git a/src/client-common/cache/CapacityCache.cpp b/src/client-common/cache/CapacityCache.cpp index 3174744..25ae6ad 100644 --- a/src/client-common/cache/CapacityCache.cpp +++ b/src/client-common/cache/CapacityCache.cpp @@ -87,6 +87,10 @@ int CapacityCache::get(const ClientSession &session, const PolicyKey &key) { void CapacityCache::clear(void) { m_keyUsage.clear(); m_keyValue.clear(); + m_pluginManager.invalidateAll(); + for (auto &plugin : m_plugins) { + plugin.second->invalidate(); + } } std::string CapacityCache::keyToString(const PolicyKey &key) { diff --git a/src/client-common/plugins/NaiveInterpreter.h b/src/client-common/plugins/NaiveInterpreter.h index 8099362..059554d 100644 --- a/src/client-common/plugins/NaiveInterpreter.h +++ b/src/client-common/plugins/NaiveInterpreter.h @@ -48,6 +48,8 @@ public: const std::vector &getSupportedPolicyTypes(void) { return s_supportedTypes; } + + void invalidate(void) {} private: static const std::vector s_supportedTypes; }; diff --git a/src/common/plugin/ExternalPluginInterface.h b/src/common/plugin/ExternalPluginInterface.h index bf3c7fe..ddd8363 100644 --- a/src/common/plugin/ExternalPluginInterface.h +++ b/src/common/plugin/ExternalPluginInterface.h @@ -52,6 +52,13 @@ public: * Policy type supported by plugin. */ virtual const std::vector &getSupportedPolicyTypes(void) = 0; + + /** + * Informs, that every data stored based on previously given input + * should be invalidated. + */ + virtual void invalidate(void) = 0; + virtual ~ExternalPluginInterface() {} }; diff --git a/src/common/plugin/PluginManager.cpp b/src/common/plugin/PluginManager.cpp index 8062683..c8a38c5 100644 --- a/src/common/plugin/PluginManager.cpp +++ b/src/common/plugin/PluginManager.cpp @@ -65,6 +65,12 @@ ExternalPluginPtr PluginManager::getPlugin(PolicyType pType) { return m_plugins[pType]; } +void PluginManager::invalidateAll(void) { + for (auto &plugin : m_plugins) { + plugin.second->invalidate(); + } +} + void PluginManager::loadPlugins(void) { struct dirent **nameList = NULL; int fileAmount = scandir(m_dir.c_str(), &nameList, pluginFilter, alphasort); diff --git a/src/common/plugin/PluginManager.h b/src/common/plugin/PluginManager.h index c2372e6..8de33ae 100644 --- a/src/common/plugin/PluginManager.h +++ b/src/common/plugin/PluginManager.h @@ -38,6 +38,7 @@ class PluginManager { public: PluginManager(const std::string &pluginDir); ExternalPluginPtr getPlugin(PolicyType pType); + void invalidateAll(void); ~PluginManager(); private: diff --git a/src/service/logic/Logic.cpp b/src/service/logic/Logic.cpp index 8f51af5..684eac3 100644 --- a/src/service/logic/Logic.cpp +++ b/src/service/logic/Logic.cpp @@ -324,6 +324,7 @@ void Logic::contextClosed(RequestContextPtr context) { void Logic::onPoliciesChanged(void) { m_storage->save(); m_socketManager->disconnectAllClients(); + m_pluginManager->invalidateAll(); //todo remove all saved contexts (if there will be any saved contexts) } -- 2.7.4