Send the snapshot over ApiBridge only if it changed

dependabot/npm_and_yarn/Src/WebController/UI/websocket-extensions-0.1.4
Grzegorz Rychlik 2019-11-14 17:49:30 +01:00
parent 08c3087aa7
commit 686bbdeb9c
3 changed files with 53 additions and 14 deletions

View File

@ -168,13 +168,17 @@ void MWR::C3::Core::GateRelay::RunApiBrige(std::string_view apiBrigdeIp, std::ui
Log({ "API bridge connection established on " + std::string{apiBrigdeIp} +':' + std::to_string(apiBrigdePort), MWR::C3::LogMessage::Severity::Information });
reconnectWait = 0s;
// Enter main loop.
auto sp = m_Profiler->GetSnapshotProxy();
while (m_IsAlive && connection.IsSending())
{
// Read socket.
std::this_thread::sleep_for(300ms);
auto newSnapshot = sp.GetSnapshotIfChanged();
if (newSnapshot)
{
try
{
connection.Send(Crypto::Encrypt(ByteView{ json{ { "messageType", "GetProfile" }, { "messageData", m_Profiler->Get().m_Gateway.CreateProfileSnapshot() }}.dump() }, m_SessionKeys.second));
connection.Send(Crypto::Encrypt(ByteView{ json{ { "messageType", "GetProfile" }, { "messageData", *newSnapshot }}.dump() }, m_SessionKeys.second));
}
catch (std::exception& exception)
{
@ -183,6 +187,7 @@ void MWR::C3::Core::GateRelay::RunApiBrige(std::string_view apiBrigdeIp, std::ui
}
}
}
}
catch (SocketsException& exception)
{
Log({ "Connection to Controller failed. "s + exception.what() + ". Reconnect after " + std::to_string(reconnectWait.count()) + "s", MWR::C3::LogMessage::Severity::Error });

View File

@ -172,18 +172,16 @@ MWR::ByteVector MWR::C3::Core::Profiler::Translate(std::string const& type, json
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void MWR::C3::Core::Profiler::DumpSnapshots()
{
std::optional<std::size_t> oldHash;
auto sp = GetSnapshotProxy();
while (true)
{
const auto snapshotTmpPath = std::filesystem::path(m_SnapshotPath).replace_extension(".tmp");
const auto snapshot = Get().m_Gateway.CreateProfileSnapshot().dump(4);
const auto snapshotHash = std::hash<std::string>{}(snapshot);
if (!oldHash || *oldHash != snapshotHash)
const auto newSnapshot = sp.GetSnapshotIfChanged();
if (newSnapshot)
{
oldHash = snapshotHash;
const auto snapshotTmpPath = std::filesystem::path(m_SnapshotPath).replace_extension(".tmp");
{
std::ofstream snapshotTmp{ snapshotTmpPath };
snapshotTmp << snapshot << std::endl;
snapshotTmp << newSnapshot->dump(4) << std::endl;
}
std::filesystem::rename(snapshotTmpPath, m_SnapshotPath);
}

View File

@ -536,6 +536,42 @@ namespace MWR::C3::Core
/// @returns binder id
uint32_t GetBinderTo(uint32_t);
/// Helper to wrap calls to CreateProfileShnapshot
class SnapshotProxy
{
public:
/// Create a snapshot proxy
/// @param profiler to wrap CreateProfileShnapshot calls
SnapshotProxy(Profiler& profiler) :
m_Profiler(profiler)
{
}
/// Create a snapshot
/// @return std::nullopt if snaphot hasn't change since the last call
std::optional<json> GetSnapshotIfChanged()
{
auto currentSnapshot = m_Profiler.Get().m_Gateway.CreateProfileSnapshot();
auto currentHash = std::hash<json>{}(currentSnapshot);
if (previousHash && currentHash == *previousHash)
return {};
previousHash = currentHash;
return currentSnapshot;
}
private:
/// Proxied profiler
Profiler& m_Profiler;
/// helper state variable
std::optional<size_t> previousHash;
};
/// Create Snapshot proxy for this profiler
/// @returns snapshot proxy for this profiler
SnapshotProxy GetSnapshotProxy() { return SnapshotProxy(*this); }
protected:
std::optional<Gateway> m_Gateway; ///< The "virtual gateway object".