diff options
author | Florent Le Coz <louiz@louiz.org> | 2014-06-11 00:28:26 +0200 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2014-06-11 00:49:39 +0200 |
commit | 3ea029dd98e41b32609571512359277259e81057 (patch) | |
tree | 28317dfafe81ba44f33ba8ce88873569f5144c0a | |
parent | 1604320a2398901aa7662ece857e9bd217e8b06a (diff) | |
download | biboumi-3ea029dd98e41b32609571512359277259e81057.tar.gz biboumi-3ea029dd98e41b32609571512359277259e81057.tar.bz2 biboumi-3ea029dd98e41b32609571512359277259e81057.tar.xz biboumi-3ea029dd98e41b32609571512359277259e81057.zip |
Remove inactive ad-hoc sessions after a given time
ref #2521
-rw-r--r-- | src/xmpp/adhoc_commands_handler.cpp | 22 | ||||
-rw-r--r-- | src/xmpp/adhoc_commands_handler.hpp | 6 |
2 files changed, 24 insertions, 4 deletions
diff --git a/src/xmpp/adhoc_commands_handler.cpp b/src/xmpp/adhoc_commands_handler.cpp index 8657944..d288b40 100644 --- a/src/xmpp/adhoc_commands_handler.cpp +++ b/src/xmpp/adhoc_commands_handler.cpp @@ -1,12 +1,15 @@ #include <xmpp/adhoc_commands_handler.hpp> #include <xmpp/xmpp_component.hpp> +#include <utils/timed_events.hpp> #include <logger/logger.hpp> #include <config/config.hpp> #include <xmpp/jid.hpp> #include <iostream> +using namespace std::string_literals; + AdhocCommandsHandler::AdhocCommandsHandler(XmppComponent* xmpp_component): xmpp_component(xmpp_component), commands{ @@ -70,10 +73,9 @@ XmlNode&& AdhocCommandsHandler::handle_request(const std::string& executor_jid, this->sessions.emplace(std::piecewise_construct, std::forward_as_tuple(sessionid, executor_jid), std::forward_as_tuple(command_it->second, executor_jid)); - // TODO add a timed event to have an expiration date that deletes - // this session. We could have a nasty client starting commands - // but never finishing the last step, and that would fill the map - // with dummy sessions. + TimedEventsManager::instance().add_event(TimedEvent(std::chrono::steady_clock::now() + 3600s, + std::bind(&AdhocCommandsHandler::remove_session, this, sessionid, executor_jid), + "adhocsession"s + sessionid + executor_jid)); } auto session_it = this->sessions.find(std::make_pair(sessionid, executor_jid)); if (session_it == this->sessions.end()) @@ -97,6 +99,7 @@ XmlNode&& AdhocCommandsHandler::handle_request(const std::string& executor_jid, { this->sessions.erase(session_it); command_node["status"] = "completed"; + TimedEventsManager::instance().cancel("adhocsession"s + sessionid + executor_jid); } else { @@ -115,3 +118,14 @@ XmlNode&& AdhocCommandsHandler::handle_request(const std::string& executor_jid, log_debug("Number of existing sessions: " << this->sessions.size()); return std::move(command_node); } + +void AdhocCommandsHandler::remove_session(const std::string& session_id, const std::string& initiator_jid) +{ + auto session_it = this->sessions.find(std::make_pair(session_id, initiator_jid)); + if (session_it != this->sessions.end()) + { + this->sessions.erase(session_it); + return ; + } + log_error("Tried to remove ad-hoc session for [" << session_id << ", " << initiator_jid << "] but none found"); +} diff --git a/src/xmpp/adhoc_commands_handler.hpp b/src/xmpp/adhoc_commands_handler.hpp index f443325..87d4d3d 100644 --- a/src/xmpp/adhoc_commands_handler.hpp +++ b/src/xmpp/adhoc_commands_handler.hpp @@ -37,6 +37,12 @@ public: * it as our return value. */ XmlNode&& handle_request(const std::string& executor_jid, XmlNode command_node); + /** + * Remove the session from the list. This is done to avoid filling the + * memory with waiting session (for example due to a client that starts + * multi-steps command but never finishes them). + */ + void remove_session(const std::string& session_id, const std::string& initiator_jid); private: /** * A pointer to the XmppComponent, to access to basically anything in the |