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  std::string segmentName = util::fs::detail::unescapeName(subdirName);
93  getSettings(),
94  getExportName(),
95  id().withCoreSegmentName(segmentName),
96  processors);
97  func(c);
98  }
99  }
100  else
101  {
102  ARMARX_WARNING << "Could not load the core segments of LTM " << id().str() << " as the path " << getFullPath().string() << " does not exist.";
103  }
104 
105  ARMARX_INFO << "All CoreSegments handeled";
106 
107  return true;
108  }
109 
110  bool
111  Memory::hasCoreSegment(const std::string& name) const
112  {
113  std::lock_guard l(ltm_mutex);
114 
116  {
117  return true;
118  }
119 
120  // check if collection exists
121  /*if (connected() && collectionExists())
122  {
123  auto c = CoreSegment(getMemoryBasePath(),
124  getSettings(),
125  getExportName(),
126  id().withCoreSegmentName(name),
127  processors);
128 
129  return (bool)c.collectionExists();
130  }*/
131 
132  // legacy: check if segment is stored on hard drive without db
133  if (fullPathExists())
134  {
136  getSettings(),
137  getExportName(),
138  id().withCoreSegmentName(name),
139  processors);
140 
141  return c.fullPathExists();
142  }
143 
144  return false;
145  }
146 
147  std::unique_ptr<CoreSegment>
148  Memory::findCoreSegment(const std::string& coreSegmentName) const
149  {
150  std::lock_guard l(ltm_mutex);
151 
152  if (!hasCoreSegment(coreSegmentName))
153  {
154  return nullptr;
155  }
156 
157  return std::make_unique<CoreSegment>(getMemoryBasePath(),
158  getSettings(),
159  getExportName(),
160  id().withCoreSegmentName(coreSegmentName),
161  processors);
162  }
163 
164  void
166  {
170  }
171 
172  void
174  {
175  std::lock_guard l(ltm_mutex);
176 
177  m.id() = id().getMemoryID().cleanID();
178 
179  ARMARX_INFO << VAROUT(id());
180 
182  [&m](auto& x)
183  {
185  x.loadAllReferences(s);
186  m.addCoreSegment(s);
187  });
188  }
189 
190  void
192  {
193  std::lock_guard l(ltm_mutex); // we cannot load a memory multiple times simultaneously
194 
195  if (/*(connected() && collectionExists()) ||*/ fullPathExists())
196  {
198  [&](auto& e)
199  {
200  //ARMARX_INFO << "resolve for CoreSegment " << e.id().str();
202  getSettings(),
203  getExportName(),
204  id().withCoreSegmentName(e.id().coreSegmentName),
205  processors);
206  c.resolve(e);
207  });
208  }
209  }
210 
211  void
213  {
215  }
216 
217  void
219  {
220  std::lock_guard l(ltm_mutex); // we cannot store a memory multiple times simultaneously
221 
222  if (id().memoryName.empty())
223  {
225  << "During storage of memory '" << memory.id().str()
226  << "' I noticed that the corresponding LTM has no id set. "
227  << "I set the id of the LTM to the same name, however this should not happen!";
228  setMemoryID(memory.id());
229  }
230 
231  /*if (!connected())
232  {
233  ARMARX_WARNING << "LTM NOT CONNECTED ALTHOUGH ENABLED " << id().str();
234  return;
235  }*/
236 
237  memory.forEachCoreSegment(
238  [&](const auto& core)
239  {
241  getSettings(),
242  getExportName(),
243  id().withCoreSegmentName(core.id().coreSegmentName),
244  processors);
245 
246  // 2. store data
247  c.store(core);
248 
249  // 3. update statistics
250  statistics.recordedCoreSegments++;
251  });
252 
253  // 4. update cache
254  //CachedBase::addToCache(memory);
255  }
256 
257  void
259  {
260  auto firstTimeStarted = this->statistics.firstStarted;
261  if (!firstTimeStarted.isValid())
262  {
263  //No statistics to be saved, as recording was never started
264  ARMARX_DEBUG << "No Statistics will be saved because firstStarted is invalid: "
265  << VAROUT(this->statistics.firstStarted);
266  return;
267  }
268 
269  ARMARX_INFO << "Preparing to save statistics for " << this->name();
270  try
271  {
272  auto first_stats = this->getFilterStatistics();
273  if (first_stats.empty())
274  {
275  //empty statistics mean no data was recorded and no statistics should be saved
276  ARMARX_DEBUG << "No Statistics will be saved because no actual data was recorded.";
277  return;
278  }
279  std::map<std::string,
280  std::map<std::string, ltm::processor::SnapshotFilter::FilterStatistics>>
281  information;
282  std::map<std::string, armarx::core::time::DateTime> times;
283 
284  try
285  {
286  times["Started LTM1"] = this->getStatistics().lastStarted;
287  times["Stopped LTM1"] = this->getStatistics().lastStopped;
288  information["LTM"] = first_stats;
289  }
290  catch (...)
291  {
292  ARMARX_INFO << "Something went wrong after getting the statistics";
293  }
294  auto exportPath = this->getMemoryBasePath();
295  auto exportName = this->getExportName();
296  auto recording_started = this->getStatistics().lastStarted;
297  auto recording_stopped = this->getStatistics().lastStopped;
298  test::save_statistics(information,
299  times,
300  recording_started,
301  recording_stopped,
302  exportPath,
303  exportName,
304  this->name());
305  }
306  catch (...)
307  {
308  ARMARX_INFO << "Something went wrong with the statistics saving process";
309  }
310  }
311 } // 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:81
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::setMixinMemoryID
void setMixinMemoryID(const MemoryID &id)
Definition: BufferedMemoryMixin.h:57
armarx::armem::server::ltm::Memory::_loadAllReferences
void _loadAllReferences(armem::wm::Memory &) final
Definition: Memory.cpp:173
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:258
armarx::armem::server::ltm::Memory::_directlyStore
void _directlyStore(const armem::wm::Memory &) final
Definition: Memory.cpp:218
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:165
armarx::armem::MemoryID::str
std::string str(bool escapeDelimiters=true) const
Get a string representation of this memory ID.
Definition: MemoryID.cpp:102
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:191
armarx::armem::server::ltm::detail::mixin::BufferedMemoryMixin< CoreSegment >::addToBuffer
void addToBuffer(const armem::wm::Memory &memory)
Definition: BufferedMemoryMixin.h:143
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:66
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::cleanID
MemoryID cleanID() const
Definition: MemoryID.cpp:132
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:124
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:135
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:148
armarx::armem::server::ltm::Memory::_store
void _store(const armem::wm::Memory &) final
Definition: Memory.cpp:212
armarx::armem::server::ltm::Memory::hasCoreSegment
bool hasCoreSegment(const std::string &name) const final
check if core segment exists
Definition: Memory.cpp:111
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::mixin::DiskMemoryItemMixin::getFullPath
Path getFullPath() const
Definition: DiskStorageMixin.cpp:89
armarx::armem::server::ltm::detail::MemoryItem::name
std::string name() const
Definition: MemoryItem.cpp:43