1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-02-26 09:57:23 +03:00

F #4809: Moved zone server list to ZonePool. Added FedLogDB class

This commit is contained in:
Ruben S. Montero 2017-05-16 12:01:06 +02:00
parent 741a55d17e
commit b38874a042
6 changed files with 122 additions and 30 deletions

View File

@ -302,5 +302,54 @@ private:
time_t timestamp);
};
// -----------------------------------------------------------------------------
// This is a LogDB decoration, it replicates the DB write commands on slaves
// It should be passed as DB for federated pools.
// -----------------------------------------------------------------------------
class FedLogDB: public SqlDB
{
public:
FedLogDB(LogDB *db):_logdb(db){};
virtual ~FedLogDB(){};
int exec_wr(ostringstream& cmd);
int exec_local_wr(ostringstream& cmd)
{
return _logdb->exec_local_wr(cmd);
}
int exec_rd(ostringstream& cmd, Callbackable* obj)
{
return _logdb->exec_rd(cmd, obj);
}
char * escape_str(const string& str)
{
return _logdb->escape_str(str);
}
void free_str(char * str)
{
_logdb->free_str(str);
}
bool multiple_values_support()
{
return _logdb->multiple_values_support();
}
protected:
int exec(std::ostringstream& cmd, Callbackable* obj, bool quiet)
{
return -1;
}
private:
LogDB * _logdb;
}
#endif /*LOG_DB_H_*/

View File

@ -127,6 +127,25 @@ public:
return PoolSQL::dump(oss, "ZONE_POOL", Zone::table, where, limit);
};
/**
* Get the servers of a zone
* @param zone_id of the zone
* @param _serv list of servers and associated xml-rpc endpoints
* @return the number of servers in the zone
*/
unsigned int get_zone_servers(int zone_id,
std::map<unsigned int, std::string>& _serv);
/**
* Return the list of zones defined
* @param zone_ids of the zones
* @return 0 on success
*/
int list_zones(vector<int>& zone_ids)
{
return list( zone_ids, Zone::table);
}
/**
* ID for the special local zone in stand-alone mode
*/

View File

@ -101,7 +101,6 @@ RaftManager::RaftManager(int id, time_t log_purge, long long bcast,
// -------------------------------------------------------------------------
// Initialize Raft timers
// TODO: randomize election timeout
// -------------------------------------------------------------------------
purge_period_ms = log_purge * 1000;
xmlrpc_timeout_ms = xmlrpc;
@ -173,38 +172,12 @@ void RaftManager::finalize_action(const ActionRequest& ar)
static unsigned int get_zone_servers(std::map<unsigned int, std::string>& _serv)
{
unsigned int _num_servers;
Nebula& nd = Nebula::instance();
ZonePool * zpool = nd.get_zonepool();
int zone_id = nd.get_zone_id();
ZoneServers::zone_iterator zit;
Zone * zone = zpool->get(zone_id, true);
if ( zone == 0 )
{
_serv.clear();
return 0;
}
ZoneServers * followers = zone->get_servers();
for (zit = followers->begin(); zit != followers->end(); ++zit)
{
unsigned int id = (*zit)->get_id();
std::string edp = (*zit)->vector_value("ENDPOINT");
_serv.insert(make_pair(id, edp));
}
_num_servers = zone->servers_size();
zone->unlock();
return _num_servers;
return zpool->get_zone_servers(zone_id, _serv);
}
int RaftManager::get_leader_endpoint(std::string& endpoint)

View File

@ -295,8 +295,7 @@ void ZoneVoteRequest::request_execute(xmlrpc_c::paramList const& paramList,
NebulaLog::log("ReM", Log::INFO, oss);
raftm->follower(leader_term);
raftm->follower(candidate_term);
}
if ((log_term > candidate_log_term) || ((log_term == candidate_log_term) &&

View File

@ -427,3 +427,23 @@ int LogDB::purge_log()
return db->exec_wr(oss);
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int FedLogDB::exec_wr(ostringstream& cmd)
{
//FedReplicaManager * fedrm = Nebula::instance().get_fedrm();
int rc = _logdb->exec_wr(cmd);
if ( rc != 0 )
{
return rc;
}
//Replicate on slaves
// fedrm->replicate(cmd);
return rc;
}

View File

@ -202,3 +202,35 @@ int ZonePool::drop(PoolObjectSQL * objsql, string& error_msg)
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
unsigned int ZonePool::get_zone_servers(int zone_id,
std::map<unsigned int, std::string>& _serv)
{
unsigned int _num_servers;
ZoneServers::zone_iterator zit;
Zone * zone = get(zone_id, true);
if ( zone == 0 )
{
_serv.clear();
return 0;
}
ZoneServers * followers = zone->get_servers();
for (zit = followers->begin(); zit != followers->end(); ++zit)
{
unsigned int id = (*zit)->get_id();
std::string edp = (*zit)->vector_value("ENDPOINT");
_serv.insert(make_pair(id, edp));
}
_num_servers = zone->servers_size();
zone->unlock();
return _num_servers;
}