From 4bdfbea1fabb3c7abb026240cfa222433e9be00b Mon Sep 17 00:00:00 2001
From: armar-user <armar-user@kit.edu>
Date: Tue, 27 Jul 2021 17:22:41 +0200
Subject: [PATCH] changes to ltm

---
 .../RobotStateMemory/RobotStateMemory.cpp     |  1 +
 .../core/base/detail/MemoryContainerBase.h    |  2 +-
 .../armem/core/longtermmemory/Memory.cpp      | 63 ++++++++++++++++++-
 .../armem/core/longtermmemory/Memory.h        |  9 +++
 .../armem/server/MemoryToIceAdapter.cpp       |  2 +-
 5 files changed, 73 insertions(+), 4 deletions(-)

diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
index 2867abe0a..c269bd56e 100644
--- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
+++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp
@@ -69,6 +69,7 @@ namespace armarx::armem::server::robot_state
         const std::string prefix = "mem.";
 
         workingMemory.name() = "RobotState";
+        longtermMemory.name() = "RobotState";
         defs->optional(workingMemory.name(), prefix + "MemoryName", "Name of this memory server.");
 
         const std::string robotUnitPrefix{sensorValuePrefix};
diff --git a/source/RobotAPI/libraries/armem/core/base/detail/MemoryContainerBase.h b/source/RobotAPI/libraries/armem/core/base/detail/MemoryContainerBase.h
index 1a6a21665..518e3f877 100644
--- a/source/RobotAPI/libraries/armem/core/base/detail/MemoryContainerBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/detail/MemoryContainerBase.h
@@ -96,7 +96,7 @@ namespace armarx::armem::base::detail
         {
             DerivedT d;
             this->_copySelfEmpty(d);
-            return d;
+            return std::move(d);
         }
 
 
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.cpp b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.cpp
index 570a86158..95ad5af75 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.cpp
@@ -10,6 +10,54 @@
 namespace armarx::armem::ltm
 {
 
+    Memory::Memory(const Memory& other) :
+        Base(other),
+        dbsettings(other.dbsettings),
+        alwaysTransferSettings(other.alwaysTransferSettings),
+        periodicTransferSettings(other.periodicTransferSettings),
+        onFullTransferSettings(other.onFullTransferSettings),
+        mongoDBMutex()
+    {
+        // Do not copy _mutex.
+    }
+
+
+    Memory::Memory(Memory&& other) :
+        Base(other),
+        dbsettings(other.dbsettings),
+        alwaysTransferSettings(other.alwaysTransferSettings),
+        periodicTransferSettings(other.periodicTransferSettings),
+        onFullTransferSettings(other.onFullTransferSettings)
+    {
+        // Do not move _mutex.
+    }
+
+
+    Memory& Memory::operator=(const Memory& other)
+    {
+        Base::operator=(other);
+        dbsettings = other.dbsettings;
+        alwaysTransferSettings = other.alwaysTransferSettings;
+        periodicTransferSettings = other.periodicTransferSettings;
+        onFullTransferSettings = other.onFullTransferSettings;
+
+        // Don't copy _mutex.
+        return *this;
+    }
+
+
+    Memory& Memory::operator=(Memory&& other)
+    {
+        Base::operator=(other);
+        dbsettings = std::move(other.dbsettings);
+        alwaysTransferSettings = std::move(other.alwaysTransferSettings);
+        periodicTransferSettings = std::move(other.periodicTransferSettings);
+        onFullTransferSettings = std::move(other.onFullTransferSettings);
+
+        // Don't move _mutex.
+        return *this;
+    }
+
     bool Memory::checkConnection() const
     {
         // Check connection:
@@ -67,22 +115,32 @@ namespace armarx::armem::ltm
             return;
         }
 
+        std::scoped_lock l(mongoDBMutex);
         ARMARX_INFO << "(Re)Establishing connection to: " << dbsettings.toString();
         _container.clear();
 
         ARMARX_TRACE;
         mongocxx::client& client = MongoDBConnectionManager::EstablishConnection(dbsettings);
         ARMARX_TRACE;
-        if (not(bool) client)
+        if (!client)
         {
             ARMARX_ERROR << "A client has died. Could not reload.";
             return;
         }
+
+        auto databases = client.list_databases();
+        for (const auto& doc : databases)
+        {
+            nlohmann::json json = nlohmann::json::parse(bsoncxx::to_json(doc));
+            ARMARX_INFO << "Found the database: " << json.at("name");
+        }
+
         mongocxx::database db = client[dbsettings.database];
+        ARMARX_INFO << "Getting collection for id: " << id().str();
         mongocxx::collection coll = db[id().str()];
 
         mongocxx::cursor cursor = coll.find({});
-        for (auto doc : cursor)
+        for (const auto& doc : cursor)
         {
             nlohmann::json json = nlohmann::json::parse(bsoncxx::to_json(doc));
             ARMARX_INFO << "Memory: Found foreign key: " << json.at("foreign_key");
@@ -115,6 +173,7 @@ namespace armarx::armem::ltm
             return;
         }
 
+        std::scoped_lock l(mongoDBMutex);
         ARMARX_INFO << "Merge memory with name '" << m.name() << "' into the LTM with name '" << name() << "'";
 
         TIMING_START(LTM_Append);
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
index a11404eca..43b67c82c 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/Memory.h
@@ -55,6 +55,12 @@ namespace armarx::armem::ltm
             Mode mode;
         };
 
+
+        Memory(const Memory& other);
+        Memory(Memory&& other);
+        Memory& operator=(const Memory& other);
+        Memory& operator=(Memory&& other);
+
         // PropertyDefinitions related to LTM
         void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
 
@@ -88,6 +94,9 @@ namespace armarx::armem::ltm
         PeriodicTransferSettings periodicTransferSettings;
         OnFullTransferSettings onFullTransferSettings;
 
+    private:
+        mutable std::mutex mongoDBMutex;
+
 
     };
 }
diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
index b8634f385..0d6685c45 100644
--- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
+++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp
@@ -177,7 +177,7 @@ namespace armarx::armem::server
                 {
                     if (longtermMemory->alwaysTransferSettings.enabled)
                     {
-                        wm::Memory tmp("tmp");
+                        wm::Memory tmp(longtermMemory->name());
                         tmp.update(update);
                         longtermMemory->append(tmp);
                     }
-- 
GitLab