From f3d893b9212e476e25389f6151ffc6ef69fe74ef Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Sat, 25 Jul 2020 11:29:58 +0300 Subject: [PATCH] Improve net connection detection --- .../net/cpp/include/ftl/net/universe.hpp | 3 +++ components/net/cpp/src/universe.cpp | 19 +++++++++++++++---- components/streams/src/feed.cpp | 9 +++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp index 6cc631a06..193d29ace 100644 --- a/components/net/cpp/include/ftl/net/universe.hpp +++ b/components/net/cpp/include/ftl/net/universe.hpp @@ -85,6 +85,9 @@ class Universe : public ftl::Configurable { * @param addr URI giving protocol, interface and port */ Peer *connect(const std::string &addr); + + bool isConnected(const ftl::URI &uri); + bool isConnected(const std::string &s); size_t numberOfPeers() const { return peers_.size(); } diff --git a/components/net/cpp/src/universe.cpp b/components/net/cpp/src/universe.cpp index 7a6b3404e..4fdba608f 100644 --- a/components/net/cpp/src/universe.cpp +++ b/components/net/cpp/src/universe.cpp @@ -148,15 +148,26 @@ bool Universe::listen(const string &addr) { return l->isListening(); } +bool Universe::isConnected(const ftl::URI &uri) { + UNIQUE_LOCK(net_mutex_,lk); + return (peer_by_uri_.find(uri.getBaseURI()) != peer_by_uri_.end()); +} + +bool Universe::isConnected(const std::string &s) { + ftl::URI uri(s); + return isConnected(uri); +} + Peer *Universe::connect(const string &addr) { + ftl::URI u(addr); + // Check if already connected or if self { UNIQUE_LOCK(net_mutex_,lk); - if (peer_by_uri_.find(addr) != peer_by_uri_.end()) { - return peer_by_uri_[addr]; + if (peer_by_uri_.find(u.getBaseURI()) != peer_by_uri_.end()) { + return peer_by_uri_.at(u.getBaseURI()); } - ftl::URI u(addr); if (u.getHost() == "localhost" || u.getHost() == "127.0.0.1") { for (const auto *l : listeners_) { if (l->port() == u.getPort()) { @@ -173,7 +184,7 @@ Peer *Universe::connect(const string &addr) { if (p->status() != Peer::kInvalid) { UNIQUE_LOCK(net_mutex_,lk); peers_.push_back(p); - peer_by_uri_[addr] = p; + peer_by_uri_[u.getBaseURI()] = p; } _installBindings(p); diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp index 47c388ca3..a06e43b04 100644 --- a/components/streams/src/feed.cpp +++ b/components/streams/src/feed.cpp @@ -600,8 +600,13 @@ bool Feed::sourceAvailable(const std::string &uri) { bool Feed::sourceActive(const std::string &suri) { ftl::URI uri(suri); - SHARED_LOCK(mtx_, lk); - return fsid_lookup_.count(uri.getBaseURI()) > 0; + + if (uri.getScheme() == ftl::URI::SCHEME_TCP || uri.getScheme() == ftl::URI::SCHEME_WS) { + return net_->isConnected(uri); + } else { + SHARED_LOCK(mtx_, lk); + return fsid_lookup_.count(uri.getBaseURI()) > 0; + } } std::string Feed::getName(const std::string &puri) { -- GitLab