diff --git a/build b/build index 7813681..62f9457 100644 --- a/build +++ b/build @@ -1 +1 @@ -5 \ No newline at end of file +6 \ No newline at end of file diff --git a/src/RESTAPI/RESTAPI_board_handler.cpp b/src/RESTAPI/RESTAPI_board_handler.cpp index 5e71dbb..b9077ea 100644 --- a/src/RESTAPI/RESTAPI_board_handler.cpp +++ b/src/RESTAPI/RESTAPI_board_handler.cpp @@ -90,7 +90,7 @@ namespace OpenWifi { } if(StorageService()->BoardsDB().UpdateRecord("id",Existing.info.id,Existing)) { - VenueCoordinator()->ModifyBoard(Existing.info.id); + VenueCoordinator()->UpdateBoard(Existing.info.id); AnalyticsObjects::BoardInfo NewBoard; StorageService()->BoardsDB().GetRecord("id",Existing.info.id,NewBoard); Poco::JSON::Object Answer; diff --git a/src/VenueCoordinator.cpp b/src/VenueCoordinator.cpp index 91ca02e..03e79da 100644 --- a/src/VenueCoordinator.cpp +++ b/src/VenueCoordinator.cpp @@ -13,9 +13,25 @@ namespace OpenWifi { int VenueCoordinator::Start() { GetBoardList(); Worker_.start(*this); + + ReconcileTimerCallback_ = std::make_unique>(*this,&VenueCoordinator::onReconcileTimer); + ReconcileTimerTimer_.setStartInterval( 3 * 60 * 1000 ); + ReconcileTimerTimer_.setPeriodicInterval(3 * 60 * 1000); // 1 hours + ReconcileTimerTimer_.start(*ReconcileTimerCallback_, MicroService::instance().TimerPool()); + return 0; } + void VenueCoordinator::onReconcileTimer([[maybe_unused]] Poco::Timer &timer) { + std::lock_guard G(Mutex_); + + Logger().information("Starting to reconcile board information."); + for(const auto &[board_id, watcher]:Watchers_) { + UpdateBoard(board_id); + } + Logger().information("Finished reconciling board information."); + } + void VenueCoordinator::GetBoardList() { BoardsToWatch_.clear(); auto F = [&](const AnalyticsObjects::BoardInfo &B) ->bool { @@ -121,7 +137,7 @@ namespace OpenWifi { } } - void VenueCoordinator::ModifyBoard(const std::string &id) { + void VenueCoordinator::UpdateBoard(const std::string &id) { AnalyticsObjects::BoardInfo B; if(StorageService()->BoardsDB().GetRecord("id",id,B)) { std::vector Devices; diff --git a/src/VenueCoordinator.h b/src/VenueCoordinator.h index 19fa17a..9408245 100644 --- a/src/VenueCoordinator.h +++ b/src/VenueCoordinator.h @@ -3,9 +3,12 @@ // #pragma once + #include "framework/MicroService.h" #include "VenueWatcher.h" +#include "Poco/Timer.h" + namespace OpenWifi { class VenueCoordinator : public SubSystemServer, Poco::Runnable { @@ -21,7 +24,7 @@ namespace OpenWifi { void run() override; void StopBoard(const std::string &id); - void ModifyBoard(const std::string &id); + void UpdateBoard(const std::string &id); void AddBoard(const std::string &id); bool GetDevicesForBoard(const AnalyticsObjects::BoardInfo &B, std::vector & Devices, bool & VenueExists); @@ -30,13 +33,17 @@ namespace OpenWifi { bool Watching(const std::string &id); void RetireBoard(const AnalyticsObjects::BoardInfo &B); - private: - Poco::Thread Worker_; - std::atomic_bool Running_=false; - std::set BoardsToWatch_; - std::map> Watchers_; + void onReconcileTimer(Poco::Timer & timer); - std::map> ExistingBoards_; + private: + Poco::Thread Worker_; + std::atomic_bool Running_=false; + std::set BoardsToWatch_; + std::map> Watchers_; + std::unique_ptr> ReconcileTimerCallback_; + Poco::Timer ReconcileTimerTimer_; + + std::map> ExistingBoards_; VenueCoordinator() noexcept: SubSystemServer("VenueCoordinator", "VENUE-COORD", "venue.coordinator") diff --git a/src/VenueWatcher.h b/src/VenueWatcher.h index af47e23..e7af7ba 100644 --- a/src/VenueWatcher.h +++ b/src/VenueWatcher.h @@ -69,9 +69,11 @@ namespace OpenWifi { void GetDevices(std::vector & DI); void GetBandwidth(uint64_t start, uint64_t end, uint64_t interval , AnalyticsObjects::BandwidthAnalysis & BW); - + inline std::string Venue() const { + return venue_id_; + } private: - std::recursive_mutex Mutex_; + std::mutex Mutex_; std::string boardId_; std::string venue_id_; Poco::NotificationQueue Queue_;