From cc6cc46099d2e006afc7f177c201ee9bac67267d Mon Sep 17 00:00:00 2001
From: "Ruben S. Montero" <rsmontero@opennebula.org>
Date: Fri, 23 Jun 2017 00:13:27 +0200
Subject: [PATCH] F #4809: Add replicated log index information on server zones

---
 include/FedReplicaManager.h          |  8 +++++++
 src/cli/one_helper/onezone_helper.rb | 31 +++++++++++++++++++++++-----
 src/host/HostPool.cc                 |  2 --
 src/raft/RaftManager.cc              | 11 ++++++++++
 4 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/include/FedReplicaManager.h b/include/FedReplicaManager.h
index 9a7e7e4bcd..e0142c1f1f 100644
--- a/include/FedReplicaManager.h
+++ b/include/FedReplicaManager.h
@@ -146,6 +146,14 @@ public:
         return frm_thread;
     };
 
+    /**
+     *  Return the last index of the fed log
+     */
+    int get_last_index() const
+    {
+        return last_index;
+    }
+
 private:
     friend void * frm_loop(void *arg);
 
diff --git a/src/cli/one_helper/onezone_helper.rb b/src/cli/one_helper/onezone_helper.rb
index 7d1c75ab74..32bf410794 100644
--- a/src/cli/one_helper/onezone_helper.rb
+++ b/src/cli/one_helper/onezone_helper.rb
@@ -147,14 +147,34 @@ class OneZoneHelper < OpenNebulaHelper::OneHelper
                      when "3" then "leader"
                      else "-"
                  end
-                s["TERM"]     = xml_doc.root.at_xpath("TERM").text
+                s["TERM"]      = xml_doc.root.at_xpath("TERM").text
                 s["VOTEDFOR"]  = xml_doc.root.at_xpath("VOTEDFOR").text
                 s["COMMIT"]    = xml_doc.root.at_xpath("COMMIT").text
-                s["LOG_INDEX"] = xml_doc.root.at_xpath("LOG_INDEX").text
+
+                s["LOG_INDEX"]    = xml_doc.root.at_xpath("LOG_INDEX").text
+                s["FEDLOG_INDEX"] = xml_doc.root.at_xpath("FEDLOG_INDEX").text
             }
 
             puts
-            CLIHelper.print_header(str_h1 % "SERVERS",false)
+            CLIHelper.print_header(str_h1 % "ZONE SERVERS",false)
+
+            CLIHelper::ShowTable.new(nil, self) do
+
+                column :"ID", "", :size=>2 do |d|
+                    d["ID"] if !d.nil?
+                end
+
+                column :"NAME", "", :left, :size=>15 do |d|
+                    d["NAME"] if !d.nil?
+                end
+
+                column :"ENDPOINT", "", :left, :size=>63 do |d|
+                    d["ENDPOINT"] if !d.nil?
+                end
+            end.show([zone_hash['ZONE']['SERVER_POOL']['SERVER']].flatten, {})
+
+            puts
+            CLIHelper.print_header(str_h1 % "RAFT & FEDERATION SYNC STATUS",false)
 
             CLIHelper::ShowTable.new(nil, self) do
 
@@ -186,9 +206,10 @@ class OneZoneHelper < OpenNebulaHelper::OneHelper
                     d["VOTEDFOR"] if !d.nil?
                 end
 
-                column :"ENDPOINT", "", :left, :size=>18 do |d|
-                    d["ENDPOINT"] if !d.nil?
+                column :"FED_INDEX", "", :left, :size=>10 do |d|
+                    d["FEDLOG_INDEX"] if !d.nil?
                 end
+
             end.show([zone_hash['ZONE']['SERVER_POOL']['SERVER']].flatten, {})
         end
 
diff --git a/src/host/HostPool.cc b/src/host/HostPool.cc
index bb88d3abf1..33c58b56c4 100644
--- a/src/host/HostPool.cc
+++ b/src/host/HostPool.cc
@@ -361,8 +361,6 @@ HostPool::HostVM * HostPool::get_host_vm(int oid)
 
 void HostPool::delete_host_vm(int oid)
 {
-    HostVM * hvm;
-
     map<int, HostVM *>::iterator it = host_vms.find(oid);
 
     if ( it != host_vms.end() )
diff --git a/src/raft/RaftManager.cc b/src/raft/RaftManager.cc
index d63ce4b5ab..fffa78b4e9 100644
--- a/src/raft/RaftManager.cc
+++ b/src/raft/RaftManager.cc
@@ -1176,6 +1176,8 @@ std::string& RaftManager::to_xml(std::string& raft_xml)
     Nebula& nd    = Nebula::instance();
     LogDB * logdb = nd.get_logdb();
 
+    FedReplicaManager * frm = nd.get_frm();
+
     unsigned int lindex, lterm;
 
     std::ostringstream oss;
@@ -1202,6 +1204,15 @@ std::string& RaftManager::to_xml(std::string& raft_xml)
             << "<LOG_TERM>"  << lterm  << "</LOG_TERM>";
     }
 
+    if ( nd.is_federation_enabled() )
+    {
+        oss << "<FEDLOG_INDEX>" << frm->get_last_index() << "</FEDLOG_INDEX>";
+    }
+    else
+    {
+        oss << "<FEDLOG_INDEX>-1</FEDLOG_INDEX>";
+    }
+
     oss << "</RAFT>";
 
 	pthread_mutex_unlock(&mutex);