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:
parent
741a55d17e
commit
b38874a042
@ -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_*/
|
||||
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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)
|
||||
|
@ -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) &&
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user