summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controller/DB.hpp1
-rw-r--r--controller/EmbeddedNetworkController.cpp5
-rw-r--r--controller/FileDB.cpp10
-rw-r--r--controller/FileDB.hpp1
-rw-r--r--controller/RethinkDB.cpp11
-rw-r--r--controller/RethinkDB.hpp4
6 files changed, 20 insertions, 12 deletions
diff --git a/controller/DB.hpp b/controller/DB.hpp
index 4757bb40..4b2940cd 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 ef52f6e0..6a4134c6 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 e78a64c9..8cbd60ce 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 1e275a36..1a3c12e9 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 f6c8a59c..a46d033f 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<R::Connection> 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 b1049ac3..60f04c5b 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<int> _ready;
- std::atomic<int> _run;
+ std::atomic<int> _ready,_connected,_run;
mutable volatile bool _waitNoticePrinted;
};