~singpolyma/biboumi

3ea029dd98e41b32609571512359277259e81057 — Florent Le Coz 9 years ago 1604320
Remove inactive ad-hoc sessions after a given time

ref #2521
2 files changed, 24 insertions(+), 4 deletions(-)

M src/xmpp/adhoc_commands_handler.cpp
M src/xmpp/adhoc_commands_handler.hpp
M src/xmpp/adhoc_commands_handler.cpp => src/xmpp/adhoc_commands_handler.cpp +18 -4
@@ 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");
}

M src/xmpp/adhoc_commands_handler.hpp => src/xmpp/adhoc_commands_handler.hpp +6 -0
@@ 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