From 6976ffa7cf8741a0bdc573502f77ca6461821b37 Mon Sep 17 00:00:00 2001 From: O B Date: Sun, 10 Mar 2024 13:52:32 -0700 Subject: [PATCH 1/2] Updated Checkpoint::updateDataItems() to remove orphans from observations map. Updated CircularBuffer::updateDataItems() to remove orphans from m_slidingBuffer --- src/mtconnect/buffer/checkpoint.hpp | 12 ++++++++++-- src/mtconnect/buffer/circular_buffer.hpp | 25 ++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/mtconnect/buffer/checkpoint.hpp b/src/mtconnect/buffer/checkpoint.hpp index 7e2e6c5e4..3b20558a3 100644 --- a/src/mtconnect/buffer/checkpoint.hpp +++ b/src/mtconnect/buffer/checkpoint.hpp @@ -174,9 +174,17 @@ namespace mtconnect::buffer { /// @param[in] diMap the map of data ids to data item pointers void updateDataItems(std::unordered_map &diMap) { - for (auto &o : m_observations) + auto iter = m_observations.begin(); + while( iter != m_observations.end() ) { - o.second->updateDataItem(diMap); + auto item = *iter; + if( item.second->isOrphan() ) { + iter = m_observations.erase(iter); + } + else { + item.second->updateDataItem(diMap); + iter++; + } } } diff --git a/src/mtconnect/buffer/circular_buffer.hpp b/src/mtconnect/buffer/circular_buffer.hpp index 2bb859a62..b4d059232 100644 --- a/src/mtconnect/buffer/circular_buffer.hpp +++ b/src/mtconnect/buffer/circular_buffer.hpp @@ -27,6 +27,9 @@ #include "mtconnect/config.hpp" #include "mtconnect/observation/observation.hpp" #include "mtconnect/utilities.hpp" +#include "mtconnect/logging.hpp" +#include "mtconnect/entity/requirement.hpp" + namespace mtconnect::buffer { using SequenceNumber_t = uint64_t; @@ -82,11 +85,29 @@ namespace mtconnect::buffer { /// @param diMap the map of data item ids to new data item entities void updateDataItems(std::unordered_map &diMap) { - for (auto &o : m_slidingBuffer) + std::vector::iterator> orphanBufferItems; + + auto iter = m_slidingBuffer.begin(); + while( iter != m_slidingBuffer.end() ) { - o->updateDataItem(diMap); + observation::ObservationPtr o = *iter; + if( o->isOrphan() ) { + orphanBufferItems.push_back(iter); + } + else { + o->updateDataItem(diMap); + } + iter++; + } + + // remove orphans from the slidingBuffer + while(!orphanBufferItems.empty()) { + auto orphanIterIter = orphanBufferItems.back(); + m_slidingBuffer.erase(orphanIterIter); + orphanBufferItems.pop_back(); } + // checkpoints will remove orphans from its observations m_first.updateDataItems(diMap); m_latest.updateDataItems(diMap); From 8cddce6f97c0976b46d74bc17040aef29a3107f2 Mon Sep 17 00:00:00 2001 From: O B Date: Tue, 19 Mar 2024 21:32:00 -0700 Subject: [PATCH 2/2] Updated CircularBuffer::updateDataItems() to skip orphaned dataItems instead of deleting them. --- src/mtconnect/buffer/circular_buffer.hpp | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/mtconnect/buffer/circular_buffer.hpp b/src/mtconnect/buffer/circular_buffer.hpp index b4d059232..4d30aab4e 100644 --- a/src/mtconnect/buffer/circular_buffer.hpp +++ b/src/mtconnect/buffer/circular_buffer.hpp @@ -85,26 +85,12 @@ namespace mtconnect::buffer { /// @param diMap the map of data item ids to new data item entities void updateDataItems(std::unordered_map &diMap) { - std::vector::iterator> orphanBufferItems; - - auto iter = m_slidingBuffer.begin(); - while( iter != m_slidingBuffer.end() ) + for (auto &o : m_slidingBuffer) { - observation::ObservationPtr o = *iter; if( o->isOrphan() ) { - orphanBufferItems.push_back(iter); - } - else { - o->updateDataItem(diMap); + continue; } - iter++; - } - - // remove orphans from the slidingBuffer - while(!orphanBufferItems.empty()) { - auto orphanIterIter = orphanBufferItems.back(); - m_slidingBuffer.erase(orphanIterIter); - orphanBufferItems.pop_back(); + o->updateDataItem(diMap); } // checkpoints will remove orphans from its observations