Skip to content

Commit

Permalink
Merge branch 'feature-2143-api_call'
Browse files Browse the repository at this point in the history
  • Loading branch information
Ruben S. Montero committed Jun 26, 2018
2 parents fb7e22f + 8eadc0f commit 484e412
Show file tree
Hide file tree
Showing 7 changed files with 104 additions and 1 deletion.
6 changes: 6 additions & 0 deletions include/RaftManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,12 @@ class RaftManager : public ActionListener
*/
void delete_server(int follower_id);

/**
* Reset index for a follower.
* @param follower_id id of server
*/
void reset_index(int follower_id);

private:
friend void * raft_manager_loop(void *arg);

Expand Down
16 changes: 16 additions & 0 deletions include/RequestManagerZone.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,22 @@ class ZoneDeleteServer : public RequestManagerZone
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

class ZoneResetServer : public RequestManagerZone
{
public:
ZoneResetServer():
RequestManagerZone("one.zone.resetserver", "Reset server log index",
"A:sis"){};

~ZoneResetServer(){};

void request_execute(xmlrpc_c::paramList const& _paramList,
RequestAttributes& att);
};

/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

class ZoneReplicateLog : public RequestManagerZone
{
public:
Expand Down
12 changes: 12 additions & 0 deletions src/cli/onezone
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,18 @@ cmd=CommandParser::CmdParser.new(ARGV) do
end

end

resetserver_desc = <<-EOT.unindent
Reset follower log index. This should be trigger when a follower DB has
been reset.
EOT

command :"server-reset", resetserver_desc, :zoneid, :serverid do
helper.perform_action(args[0], options, "server reset") do |o|
o.reset_server(args[1].to_i)
end
end

update_desc = <<-EOT.unindent
Update the template contents. If a path is not provided the editor will
be launched to modify the current content.
Expand Down
13 changes: 12 additions & 1 deletion src/oca/ruby/opennebula/zone.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ class Zone < PoolElement
:rename => "zone.rename",
:delete => "zone.delete",
:addserver => "zone.addserver",
:delserver => "zone.delserver"
:delserver => "zone.delserver",
:resetserver => "zone.resetserver"
}

# Creates a Zone description with just its identifier
Expand Down Expand Up @@ -168,6 +169,16 @@ def delete_servers(server_id)
return call(ZONE_METHODS[:delserver], @pe_id, server_id)
end

# Reset index for a follower
#
# @param id [Int] Server ID
#
# @return [nil, OpenNebula::Error] nil in case of success, Error
# otherwise
def reset_server(server_id)
return call(ZONE_METHODS[:resetserver], @pe_id, server_id)
end

private

# These methods adds elements to the given node of the zone
Expand Down
24 changes: 24 additions & 0 deletions src/raft/RaftManager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ void RaftManager::add_server(int follower_id, const std::string& endpoint)
}

num_servers++;

servers.insert(std::make_pair(follower_id, endpoint));

next.insert(std::make_pair(follower_id, log_index + 1));
Expand Down Expand Up @@ -1290,4 +1291,27 @@ std::string& RaftManager::to_xml(std::string& raft_xml)
return raft_xml;
}

/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

void RaftManager::reset_index(int follower_id)
{
std::map<int, unsigned int>::iterator next_it;

unsigned int log_index, log_term;

LogDB * logdb = Nebula::instance().get_logdb();

logdb->get_last_record_index(log_index, log_term);

pthread_mutex_lock(&mutex);

next_it = next.find(follower_id);

if ( next_it != next.end() )
{
next_it->second = log_index + 1;
}

pthread_mutex_unlock(&mutex);
}
2 changes: 2 additions & 0 deletions src/rm/RequestManager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,7 @@ void RequestManager::register_xml_methods()
xmlrpc_c::methodPtr zone_rename(zone_rename_pt);
xmlrpc_c::methodPtr zone_addserver(new ZoneAddServer());
xmlrpc_c::methodPtr zone_delserver(new ZoneDeleteServer());
xmlrpc_c::methodPtr zone_resetserver(new ZoneResetServer());
xmlrpc_c::methodPtr zone_replicatelog(new ZoneReplicateLog());
xmlrpc_c::methodPtr zone_voterequest(new ZoneVoteRequest());
xmlrpc_c::methodPtr zone_raftstatus(new ZoneRaftStatus());
Expand All @@ -826,6 +827,7 @@ void RequestManager::register_xml_methods()

RequestManagerRegistry.addMethod("one.zone.addserver", zone_addserver);
RequestManagerRegistry.addMethod("one.zone.delserver", zone_delserver);
RequestManagerRegistry.addMethod("one.zone.resetserver", zone_resetserver);

RequestManagerRegistry.addMethod("one.zonepool.info",zonepool_info);

Expand Down
32 changes: 32 additions & 0 deletions src/rm/RequestManagerZone.cc
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,38 @@ void ZoneDeleteServer::request_execute(xmlrpc_c::paramList const& paramList,
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

void ZoneResetServer::request_execute(xmlrpc_c::paramList const& paramList,
RequestAttributes& att)
{
Nebula& nd = Nebula::instance();

int id = xmlrpc_c::value_int(paramList.getInt(1));
int zs_id = xmlrpc_c::value_int(paramList.getInt(2));

string error_str;

if ( id != nd.get_zone_id() )
{
att.resp_msg = "Servers have to be deleted through the target zone"
" endpoints";
failure_response(ACTION, att);

return;
}

if ( basic_authorization(id, att) == false )
{
return;
}

nd.get_raftm()->reset_index(zs_id);

success_response(id, att);
}

/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */

void ZoneReplicateLog::request_execute(xmlrpc_c::paramList const& paramList,
RequestAttributes& att)
{
Expand Down

0 comments on commit 484e412

Please sign in to comment.