From 6fdb4406006555b2efcade84780b0eb68eec25a7 Mon Sep 17 00:00:00 2001
From: Joana Plewnia <joana.plewnia@kit.edu>
Date: Mon, 3 Feb 2025 18:46:54 +0100
Subject: [PATCH] added check for enough available disk space only tested in
 simulation

---
 .../ltm/detail/mixins/DiskStorageMixin.cpp    | 54 ++++++++++++++++++-
 .../ltm/detail/mixins/DiskStorageMixin.h      |  2 +
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/DiskStorageMixin.cpp b/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/DiskStorageMixin.cpp
index 83f1e87f6..52e563378 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/DiskStorageMixin.cpp
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/DiskStorageMixin.cpp
@@ -144,12 +144,62 @@ namespace armarx::armem::server::ltm::detail::mixin
         util::fs::ensureFileExists(p, createIfNotExistent);
     }
 
+    bool
+    DiskMemoryItemMixin::enoughDiskSpaceLeft() const
+    {
+        std::string path_to_disk = "/dev/mapper/ubuntu--vg-root\\";
+
+        if (std::filesystem::exists(path_to_disk))
+        {
+            try
+            {
+                auto space_info = std::filesystem::space(path_to_disk);
+                int const conversion_factor = 1024;
+
+                auto available_space = space_info.available /
+                                       (conversion_factor * conversion_factor * conversion_factor);
+                ARMARX_DEBUG << "Capacity: "
+                             << space_info.capacity /
+                                    (conversion_factor * conversion_factor * conversion_factor)
+                             << " GB\n";
+                ARMARX_DEBUG << "Free space: "
+                             << space_info.free /
+                                    (conversion_factor * conversion_factor * conversion_factor)
+                             << " GB\n";
+                ARMARX_DEBUG << "Available space: "
+                             << space_info.available /
+                                    (conversion_factor * conversion_factor * conversion_factor)
+                             << " GB\n";
+
+                return static_cast<bool>(available_space >= 50);
+            }
+            catch (const std::filesystem::filesystem_error& e)
+            {
+                ARMARX_WARNING << "Error: " << e.what() << '\n';
+                return false;
+            }
+        }
+        else
+        {
+            ARMARX_DEBUG << "Cannot find path to disk and thus cannot check if enough space is "
+                            "still available";
+            return true;
+        }
+    }
+
     void
     DiskMemoryItemMixin::writeDataToFile(const std::string& filename,
                                          const std::vector<unsigned char>& data) const
     {
-        auto p = getFullPath() / filename;
-        util::fs::writeDataToFile(p, data);
+        if (enoughDiskSpaceLeft())
+        {
+            auto p = getFullPath() / filename;
+            util::fs::writeDataToFile(p, data);
+        }
+        else
+        {
+            ARMARX_DEBUG << "Canot store snapshot as not enough disk space available";
+        }
     }
 
     std::vector<unsigned char>
diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/DiskStorageMixin.h b/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/DiskStorageMixin.h
index bf02aa5df..96962ea21 100644
--- a/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/DiskStorageMixin.h
+++ b/source/RobotAPI/libraries/armem/server/ltm/detail/mixins/DiskStorageMixin.h
@@ -32,6 +32,7 @@ namespace armarx::armem::server::ltm::detail::mixin
         bool memoryBasePathExists() const;
         bool fullPathExists() const;
         bool fileExists(const std::string& filename) const;
+        bool enoughDiskSpaceLeft() const;
 
         void ensureMemoryBasePathExists(bool createIfNotExistent = false) const;
         void ensureFullPathExists(bool createIfNotExistent = false) const;
@@ -72,6 +73,7 @@ namespace armarx::armem::server::ltm::detail::mixin
     private:
         std::filesystem::path memoryBasePath;
         std::string memoryBasePathString;
+        std::string pathToHome;
         std::string exportName;
         armem::MemoryID _id;
     };
-- 
GitLab