diff --git a/controller/DB.hpp b/controller/DB.hpp index 4757bb406..4b2940cdc 100644 --- a/controller/DB.hpp +++ b/controller/DB.hpp @@ -82,6 +82,7 @@ public: virtual ~DB(); virtual bool waitForReady() = 0; + virtual bool isReady() = 0; inline bool hasNetwork(const uint64_t networkId) const { diff --git a/controller/EmbeddedNetworkController.cpp b/controller/EmbeddedNetworkController.cpp index ef52f6e07..6a4134c66 100644 --- a/controller/EmbeddedNetworkController.cpp +++ b/controller/EmbeddedNetworkController.cpp @@ -596,10 +596,11 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpGET( // Controller status char tmp[4096]; - OSUtils::ztsnprintf(tmp,sizeof(tmp),"{\n\t\"controller\": true,\n\t\"apiVersion\": %d,\n\t\"clock\": %llu\n}\n",ZT_NETCONF_CONTROLLER_API_VERSION,(unsigned long long)OSUtils::now()); + const bool dbOk = _db->isReady(); + OSUtils::ztsnprintf(tmp,sizeof(tmp),"{\n\t\"controller\": true,\n\t\"apiVersion\": %d,\n\t\"clock\": %llu,\n\t\"databaseReady\": %s\n}\n",ZT_NETCONF_CONTROLLER_API_VERSION,(unsigned long long)OSUtils::now(),dbOk ? "true" : "false"); responseBody = tmp; responseContentType = "application/json"; - return 200; + return dbOk ? 200 : 503; } diff --git a/controller/FileDB.cpp b/controller/FileDB.cpp index e78a64c91..8cbd60ceb 100644 --- a/controller/FileDB.cpp +++ b/controller/FileDB.cpp @@ -63,14 +63,10 @@ FileDB::FileDB(EmbeddedNetworkController *const nc,const Identity &myId,const ch } } -FileDB::~FileDB() -{ -} +FileDB::~FileDB() {} -bool FileDB::waitForReady() -{ - return true; -} +bool FileDB::waitForReady() { return true; } +bool FileDB::isReady() { return true; } void FileDB::save(nlohmann::json *orig,nlohmann::json &record) { diff --git a/controller/FileDB.hpp b/controller/FileDB.hpp index 1e275a364..1a3c12e98 100644 --- a/controller/FileDB.hpp +++ b/controller/FileDB.hpp @@ -31,6 +31,7 @@ public: virtual ~FileDB(); virtual bool waitForReady(); + virtual bool isReady(); virtual void save(nlohmann::json *orig,nlohmann::json &record); virtual void eraseNetwork(const uint64_t networkId); virtual void eraseMember(const uint64_t networkId,const uint64_t memberId); diff --git a/controller/RethinkDB.cpp b/controller/RethinkDB.cpp index f6c8a59ca..a46d033f3 100644 --- a/controller/RethinkDB.cpp +++ b/controller/RethinkDB.cpp @@ -263,9 +263,13 @@ RethinkDB::RethinkDB(EmbeddedNetworkController *const nc,const Identity &myId,co std::unique_ptr rdb; while (_run == 1) { try { - if (!rdb) + if (!rdb) { + _connected = 0; rdb = R::connect(this->_host,this->_port,this->_auth); + } + if (rdb) { + _connected = 1; R::Array batch; R::Object tmpobj; @@ -434,6 +438,11 @@ bool RethinkDB::waitForReady() return true; } +bool RethinkDB::isReady() +{ + return ((_ready)&&(_connected)); +} + void RethinkDB::save(nlohmann::json *orig,nlohmann::json &record) { if (!record.is_object()) // sanity check diff --git a/controller/RethinkDB.hpp b/controller/RethinkDB.hpp index b1049ac3d..60f04c5b8 100644 --- a/controller/RethinkDB.hpp +++ b/controller/RethinkDB.hpp @@ -41,6 +41,7 @@ public: virtual ~RethinkDB(); virtual bool waitForReady(); + virtual bool isReady(); virtual void save(nlohmann::json *orig,nlohmann::json &record); virtual void eraseNetwork(const uint64_t networkId); virtual void eraseMember(const uint64_t networkId,const uint64_t memberId); @@ -72,8 +73,7 @@ protected: std::thread _heartbeatThread; mutable std::mutex _readyLock; // locked until ready - std::atomic _ready; - std::atomic _run; + std::atomic _ready,_connected,_run; mutable volatile bool _waitNoticePrinted; };