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 83f1e87f6aa53e9dd56891eaf8d05bb88b719d75..52e563378fa14a12f9dfacd6bb87418227a770a2 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 bf02aa5dfdae044416a0d15e91cbdf18f6b1dd83..96962ea213ef091d4214c3ce51202b0cd834009e 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; };