From 900589b1db7e47d9235a04f9b4c0c82fd27875d1 Mon Sep 17 00:00:00 2001 From: getroot Date: Tue, 24 Sep 2024 22:43:08 +0900 Subject: [PATCH] Added logic to retry when registration to OriginMapStore fails --- .../origin_map_client/origin_map_client.cpp | 45 ++++++++++++++++++- .../origin_map_client/origin_map_client.h | 2 + 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/projects/modules/origin_map_client/origin_map_client.cpp b/src/projects/modules/origin_map_client/origin_map_client.cpp index 395b5f7c9..78c9dc17d 100644 --- a/src/projects/modules/origin_map_client/origin_map_client.cpp +++ b/src/projects/modules/origin_map_client/origin_map_client.cpp @@ -26,6 +26,7 @@ OriginMapClient::OriginMapClient(const ov::String &redis_host, const ov::String _update_timer.Push( [this](void *paramter) -> ov::DelayQueueAction { + RetryRegister(); NofifyStreamsAlive(); return ov::DelayQueueAction::Repeat; }, @@ -47,6 +48,38 @@ bool OriginMapClient::NofifyStreamsAlive() return true; } +bool OriginMapClient::RetryRegister() +{ + std::unique_lock lock(_origin_map_mutex); + if (_origin_map_candidates.size() == 0) + { + return true; + } + + auto origin_map_candidates = _origin_map_candidates; + lock.unlock(); + + std::vector keys_to_remove; + for (auto &[key, value] : origin_map_candidates) + { + if (Register(key, value) == true) + { + keys_to_remove.push_back(key); + } + } + + if (keys_to_remove.size() > 0) + { + std::lock_guard lock(_origin_map_mutex); + for (auto &key : keys_to_remove) + { + _origin_map_candidates.erase(key); + } + } + + return true; +} + bool OriginMapClient::Register(const ov::String &app_stream_name, const ov::String &origin_host) { if (ConnectRedis() == false) @@ -78,8 +111,13 @@ bool OriginMapClient::Register(const ov::String &app_stream_name, const ov::Stri } else { - logte("<%s> stream is already registered with different origin host.", app_stream_name.CStr()); + logte("<%s> stream is already registered with different origin host (%s)", app_stream_name.CStr(), reply->str); freeReplyObject(reply); + lock.unlock(); + + std::lock_guard origin_map_lock(_origin_map_mutex); + _origin_map_candidates[app_stream_name] = origin_host; + return false; } } @@ -99,6 +137,11 @@ bool OriginMapClient::Register(const ov::String &app_stream_name, const ov::Stri else if (reply->type == REDIS_REPLY_NIL) { logte("<%s> stream is already registered.", app_stream_name.CStr()); + freeReplyObject(reply); + lock.unlock(); + + std::lock_guard origin_map_lock(_origin_map_mutex); + _origin_map_candidates[app_stream_name] = origin_host; return false; } diff --git a/src/projects/modules/origin_map_client/origin_map_client.h b/src/projects/modules/origin_map_client/origin_map_client.h index 69edb68ed..845980f35 100644 --- a/src/projects/modules/origin_map_client/origin_map_client.h +++ b/src/projects/modules/origin_map_client/origin_map_client.h @@ -38,6 +38,7 @@ class OriginMapClient bool ConnectRedis(); bool NofifyStreamsAlive(); + bool RetryRegister(); ov::String _redis_ip; uint16_t _redis_port; @@ -46,6 +47,7 @@ class OriginMapClient ov::DelayQueue _update_timer{"OMapC"}; std::map _origin_map; + std::map _origin_map_candidates; std::mutex _origin_map_mutex; redisContext *_redis_context = nullptr;