Memory.cpp
Go to the documentation of this file.
1 #include "Memory.h"
2 
5 
7 
9 {
10  void
11  Memory::_configure(const nlohmann::json& json)
12  {
13  std::lock_guard l(ltm_mutex);
14 
19  }
20 
21  Memory::Memory() : Memory(std::filesystem::path("/tmp/ltm"), {}, "MemoryExport", "Test")
22  {
23  }
24 
26 
27  const std::string& exportName,
28  const std::string& memoryName /* UNESCAPED */) :
29  Memory(p, {}, exportName, memoryName)
30  {
31  }
32 
35 
36  const std::string& exportName,
37  const std::string& memoryName /* UNESCAPED */) :
38  MemoryBase(exportName, MemoryID(memoryName, "")),
41  DiskMemoryItemMixin(p, exportName, MemoryID(memoryName, "")),
42  MongoDBStorageMixin(s, exportName, MemoryID(memoryName, ""))
43  {
44  ARMARX_INFO << "Creating a new memory at " << p.string() << " and " << exportName;
45  }
46 
47  void
48  Memory::_setExportName(const std::string& n)
49  {
52  }
53 
54  void
56  {
58  //MongoDBStorageMixin::start();
59  }
60 
61  void
63  {
66  ARMARX_IMPORTANT << "Storing of data finished, starting to generate and save statistics...";
68  }
69 
70  void
72  {
73  std::lock_guard l(ltm_mutex);
74 
79  }
80 
81  bool
82  Memory::forEachCoreSegment(std::function<void(CoreSegment&)> func) const
83  {
84  std::lock_guard l(ltm_mutex);
85 
86  // legacy: check fs
87  if (fullPathExists())
88  {
89  for (const auto& subdirName : getAllDirectories())
90  {
91 
92  std::string segmentName = util::fs::detail::unescapeName(subdirName);
93  ARMARX_INFO << VAROUT(id().withCoreSegmentName(segmentName));
95  getSettings(),
96  getExportName(),
97  id().withCoreSegmentName(segmentName),
98  processors);
99  func(c);
100  }
101  }
102 
103  ARMARX_INFO << "All CoreSegments handeled";
104 
105  return true;
106  }
107 
108  bool
109  Memory::hasCoreSegment(const std::string& name) const
110  {
111  std::lock_guard l(ltm_mutex);
112 
114  {
115  return true;
116  }
117 
118  // check if collection exists
119  /*if (connected() && collectionExists())
120  {
121  auto c = CoreSegment(getMemoryBasePath(),
122  getSettings(),
123  getExportName(),
124  id().withCoreSegmentName(name),
125  processors);
126 
127  return (bool)c.collectionExists();
128  }*/
129 
130  // legacy: check if segment is stored on hard drive without db
131  if (fullPathExists())
132  {
134  getSettings(),
135  getExportName(),
136  id().withCoreSegmentName(name),
137  processors);
138 
139  return c.fullPathExists();
140  }
141 
142  return false;
143  }
144 
145  std::unique_ptr<CoreSegment>
146  Memory::findCoreSegment(const std::string& coreSegmentName) const
147  {
148  std::lock_guard l(ltm_mutex);
149 
150  if (!hasCoreSegment(coreSegmentName))
151  {
152  return nullptr;
153  }
154 
155  return std::make_unique<CoreSegment>(getMemoryBasePath(),
156  getSettings(),
157  getExportName(),
158  id().withCoreSegmentName(coreSegmentName),
159  processors);
160  }
161 
162  void
164  {
168  }
169 
170  void
172  {
173  std::lock_guard l(ltm_mutex);
174 
175  m.id() = id().getMemoryID();
176 
177  ARMARX_INFO << VAROUT(id());
178 
180  [&m](auto& x)
181  {
183  x.loadAllReferences(s);
184  m.addCoreSegment(s);
185  });
186  }
187 
188  void
190  {
191  std::lock_guard l(ltm_mutex); // we cannot load a memory multiple times simultaneously
192 
193  if (/*(connected() && collectionExists()) ||*/ fullPathExists())
194  {
196  [&](auto& e)
197  {
198  //ARMARX_INFO << "resolve for CoreSegment " << e.id().str();
200  getSettings(),
201  getExportName(),
202  id().withCoreSegmentName(e.id().coreSegmentName),
203  processors);
204  c.resolve(e);
205  });
206  }
207  }
208 
209  void
211  {
213  }
214 
215  void
217  {
218  std::lock_guard l(ltm_mutex); // we cannot store a memory multiple times simultaneously
219 
220  if (id().memoryName.empty())
221  {
223  << "During storage of memory '" << memory.id().str()
224  << "' I noticed that the corresponding LTM has no id set. "
225  << "I set the id of the LTM to the same name, however this should not happen!";
226  setMemoryID(memory.id());
227  }
228 
229  /*if (!connected())
230  {
231  ARMARX_WARNING << "LTM NOT CONNECTED ALTHOUGH ENABLED " << id().str();
232  return;
233  }*/
234 
235  memory.forEachCoreSegment(
236  [&](const auto& core)
237  {
239  getSettings(),
240  getExportName(),
241  id().withCoreSegmentName(core.id().coreSegmentName),
242  processors);
243 
244  // 2. store data
245  c.store(core);
246 
247  // 3. update statistics
248  statistics.recordedCoreSegments++;
249  });
250 
251  // 4. update cache
252  //CachedBase::addToCache(memory);
253  }
254 
255  void
257  {
258  auto firstTimeStarted = this->statistics.firstStarted;
259  if (!firstTimeStarted.isValid())
260  {
261  //No statistics to be saved, as recording was never started
262  ARMARX_DEBUG << "No Statistics will be saved because firstStarted is invalid: "
263  << VAROUT(this->statistics.firstStarted);
264  return;
265  }
266 
267  ARMARX_INFO << "Preparing to save statistics for " << this->name();
268  try
269  {
270  auto first_stats = this->getFilterStatistics();
271  if (first_stats.empty())
272  {
273  //empty statistics mean no data was recorded and no statistics should be saved
274  ARMARX_DEBUG << "No Statistics will be saved because no actual data was recorded.";
275  return;
276  }
277  std::map<std::string,
278  std::map<std::string, ltm::processor::SnapshotFilter::FilterStatistics>>
279  information;
280  std::map<std::string, armarx::core::time::DateTime> times;
281 
282  try
283  {
284  times["Started LTM1"] = this->getStatistics().lastStarted;
285  times["Stopped LTM1"] = this->getStatistics().lastStopped;
286  information["LTM"] = first_stats;
287  }
288  catch (...)
289  {
290  ARMARX_INFO << "Something went wrong after getting the statistics";
291  }
292  auto exportPath = this->getMemoryBasePath();
293  auto exportName = this->getExportName();
294  auto recording_started = this->getStatistics().lastStarted;
295  auto recording_stopped = this->getStatistics().lastStopped;
296  test::save_statistics(information,
297  times,
298  recording_started,
299  recording_stopped,
300  exportPath,
301  exportName,
302  this->name());
303  }
304  catch (...)
305  {
306  ARMARX_INFO << "Something went wrong with the statistics saving process";
307  }
308  }
309 } // namespace armarx::armem::server::ltm
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::getStatistics
Statistics getStatistics() const
Definition: MemoryBase.h:240
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::stop
void stop()
Definition: MongoDBStorageMixin.cpp:212
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::stop
void stop()
Definition: BufferedMemoryMixin.h:70
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::setMixinMemoryID
void setMixinMemoryID(const MemoryID &id)
Definition: BufferedMemoryMixin.h:46
armarx::armem::server::ltm::Memory::_loadAllReferences
void _loadAllReferences(armem::wm::Memory &) final
Definition: Memory.cpp:171
armarx::armem::server::ltm::detail::mixin::CachedMemoryMixin< CoreSegment >::setMixinMemoryID
void setMixinMemoryID(const MemoryID &id)
Definition: CachedMemoryMixin.h:35
armarx::armem::server::ltm::Memory::_setExportName
void _setExportName(const std::string &n) final
Definition: Memory.cpp:48
armarx::armem::server::ltm::detail::MemoryItem::processors
std::shared_ptr< Processors > processors
Definition: MemoryItem.h:54
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:183
armarx::armem::server::ltm::Memory::Memory
Memory()
Definition: Memory.cpp:21
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::configureMixin
void configureMixin(const nlohmann::json &json)
configuration
Definition: MongoDBStorageMixin.cpp:456
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::getMemoryBasePath
Path getMemoryBasePath() const
Definition: DiskStorageMixin.cpp:77
armarx::armem::server::ltm::Memory::getAndSaveStatistics
void getAndSaveStatistics()
getAndSaveStatistics generates and saves statistics for a LTM recording
Definition: Memory.cpp:256
armarx::armem::server::ltm::Memory::_directlyStore
void _directlyStore(const armem::wm::Memory &) final
Definition: Memory.cpp:216
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::createPropertyDefinitions
void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix)
Definition: DiskStorageMixin.cpp:169
armarx::armem::server::ltm::Memory::createPropertyDefinitions
void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix) override
default parameters. Implementation should use the configuration to configure
Definition: Memory.cpp:163
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:43
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::setMixinMemoryID
void setMixinMemoryID(const MemoryID &n)
Definition: DiskStorageMixin.cpp:60
armarx::armem::server::ltm::Memory::_disable
void _disable() final
Definition: Memory.cpp:62
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::p
struct armarx::armem::server::ltm::detail::MemoryBase::Properties p
armarx::memory
Brief description of class memory.
Definition: memory.h:39
armarx::armem::server::ltm::Memory::_configure
void _configure(const nlohmann::json &config) final
configuration
Definition: Memory.cpp:11
armarx::armem::server::ltm::util::fs::detail::unescapeName
std::string unescapeName(const std::string &escapedName)
Definition: filesystem.cpp:31
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::statistics
Statistics statistics
Definition: MemoryBase.h:315
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >
armarx::armem::base::MemoryBase::forEachCoreSegment
bool forEachCoreSegment(CoreSegmentFunctionT &&func)
Definition: MemoryBase.h:186
armarx::armem::server::ltm::Memory
A memory storing data on the hard drive and in mongodb (needs 'armarx memory start' to start the mong...
Definition: Memory.h:18
memory_definitions.h
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::setMixinMemoryID
void setMixinMemoryID(const armem::MemoryID &)
setter
Definition: MongoDBStorageMixin.cpp:442
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::getAllDirectories
std::vector< Path > getAllDirectories() const
Definition: DiskStorageMixin.cpp:156
armarx::armem::server::ltm::Memory::_resolve
void _resolve(armem::wm::Memory &) final
Definition: Memory.cpp:189
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::addToBuffer
void addToBuffer(const armem::wm::Memory &memory)
Definition: BufferedMemoryMixin.h:132
armarx::armem::MemoryID
A memory ID.
Definition: MemoryID.h:47
armarx::armem::server::ltm::detail::MemoryItem::setMemoryID
void setMemoryID(const MemoryID &)
Definition: MemoryItem.cpp:30
armarx::armem::server::ltm::Memory::_setMemoryID
void _setMemoryID(const MemoryID &id) final
Definition: Memory.cpp:71
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::start
void start()
Definition: BufferedMemoryMixin.h:55
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::ltm_mutex
std::recursive_mutex ltm_mutex
Definition: MemoryBase.h:313
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
armarx::armem::wm::CoreSegment
Client-side working memory core segment.
Definition: memory_definitions.h:119
armarx::armem::server::ltm::detail::mixin::CachedMemoryMixin< CoreSegment >::configureMixin
void configureMixin(const nlohmann::json &json)
configuration
Definition: CachedMemoryMixin.h:29
armarx::armem::wm::Memory
Client-side working memory.
Definition: memory_definitions.h:133
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::setMixinExportName
void setMixinExportName(const std::string &n)
Definition: DiskStorageMixin.cpp:53
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::getSettings
MongoDBSettings getSettings() const
Definition: MongoDBStorageMixin.cpp:436
armarx::armem::base::MemoryBase::addCoreSegment
CoreSegmentT & addCoreSegment(const std::string &name, aron::type::ObjectPtr coreSegmentType=nullptr, const std::vector< PredictionEngine > &predictionEngines={})
Add an empty core segment with the given name, type and prediction engines.
Definition: MemoryBase.h:259
armarx::armem::server::ltm::Memory::forEachCoreSegment
bool forEachCoreSegment(std::function< void(CoreSegment &)> func) const final
iterate over all core segments of this ltm
Definition: Memory.cpp:82
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::createPropertyDefinitions
virtual void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix)
default parameters. Implementation should use the configuration to configure
Definition: MemoryBase.h:201
armarx::armem::server::ltm::detail::MemoryItem::getExportName
virtual std::string getExportName() const
Definition: MemoryItem.h:26
armarx::armem::server::ltm::detail::MemoryBase< CoreSegment >::getFilterStatistics
std::map< std::string, processor::SnapshotFilter::FilterStatistics > getFilterStatistics()
Definition: MemoryBase.h:246
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin
Definition: MongoDBStorageMixin.h:45
armarx::armem::server::ltm::detail::mixin::MongoDBStorageMixin::setMixinExportName
void setMixinExportName(const std::string &n)
Definition: MongoDBStorageMixin.cpp:450
armarx::armem::base::detail::MemoryItem::id
MemoryID & id()
Definition: MemoryItem.h:27
armarx::armem::server::ltm::detail::mixin::CachedMemoryMixin< CoreSegment >
armarx::armem::server::ltm
Definition: forward_declarations.h:20
Memory.h
armarx::armem::server::ltm::Memory::_enable
void _enable() final
Definition: Memory.cpp:55
armarx::armem::server::ltm::detail::MemoryItem::id
MemoryID id() const
Definition: MemoryItem.cpp:37
armarx::armem::MemoryID::getMemoryID
MemoryID getMemoryID() const
Definition: MemoryID.cpp:281
TimeUtil.h
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::configureMixin
void configureMixin(const nlohmann::json &json)
configuration
Definition: BufferedMemoryMixin.h:113
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:174
armarx::armem::server::ltm::CoreSegment
Definition: CoreSegment.h:13
std
Definition: Application.h:66
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:182
armarx::armem::laser_scans::constants::memoryName
const std::string memoryName
Definition: constants.h:28
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::fullPathExists
bool fullPathExists() const
Definition: DiskStorageMixin.cpp:106
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >
armarx::armem::server::ltm::detail::mixin::CachedMemoryMixin< CoreSegment >::cacheHasCoreSegment
bool cacheHasCoreSegment(const std::string &n) const
Definition: CachedMemoryMixin.h:50
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::createPropertyDefinitions
void createPropertyDefinitions(PropertyDefinitionsPtr &defs, const std::string &prefix)
Definition: BufferedMemoryMixin.h:124
armarx::armem::server::ltm::detail::mixin::MongoDBSettings
Definition: MongoDBStorageMixin.h:15
armarx::armem::server::ltm::detail::mixin::Path
std::filesystem::path Path
Definition: DiskStorageMixin.h:17
armarx::armem::server::ltm::Memory::findCoreSegment
std::unique_ptr< CoreSegment > findCoreSegment(const std::string &coreSegmentName) const final
find core segment
Definition: Memory.cpp:146
armarx::armem::server::ltm::Memory::_store
void _store(const armem::wm::Memory &) final
Definition: Memory.cpp:210
armarx::armem::server::ltm::Memory::hasCoreSegment
bool hasCoreSegment(const std::string &name) const final
check if core segment exists
Definition: Memory.cpp:109
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::armem::server::ltm::detail::mixin::DiskMemoryItemMixin::configureMixin
void configureMixin(const nlohmann::json &json)
Definition: DiskStorageMixin.cpp:68
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
armarx::armem::server::ltm::detail::MemoryItem::name
std::string name() const
Definition: MemoryItem.cpp:43