class Pontoon::Goliath::HttpJsonRpcResponder

Constants

HEADERS

Public Class Methods

new(node) click to toggle source
# File lib/pontoon/goliath.rb, line 19
def initialize(node)
  @node = node
end

Public Instance Methods

append_entries_response(params) click to toggle source
# File lib/pontoon/goliath.rb, line 49
def append_entries_response(params)
  #STDOUT.write("\nnode #{@node.id} received append_entries from #{params['leader_id']}, term #{params['term']}\n")
  entries = params['entries'].map {|entry| Pontoon::LogEntry.new(entry['term'], entry['index'], entry['command'])}
  request = Pontoon::AppendEntriesRequest.new(
      params['term'],
      params['leader_id'],
      params['prev_log_index'],
      params['prev_log_term'],
      entries,
      params['commit_index'])
  #STDOUT.write("\nnode #{@node.id} received entries: #{request.entries.pretty_inspect}\n")
  response = @node.handle_append_entries(request)
  #STDOUT.write("\nnode #{@node.id} completed append_entries from #{params['leader_id']}, term #{params['term']} (#{response})\n")
  [200, HEADERS, { 'term' => response.term, 'success' => response.success }]
end
command_response(params) click to toggle source
# File lib/pontoon/goliath.rb, line 65
def command_response(params)
  request = Pontoon::CommandRequest.new(params['command'])
  response = @node.handle_command(request)
  [response.success ? 200 : 409, HEADERS, { 'success' => response.success }]
end
error_message(exception) click to toggle source
# File lib/pontoon/goliath.rb, line 79
def error_message(exception)
  "#{exception.message}\n\t#{exception.backtrace.join("\n\t")}".tap {|m| STDOUT.write("\n\n\t#{m}\n\n")}
end
error_response(code, exception) click to toggle source
# File lib/pontoon/goliath.rb, line 83
def error_response(code, exception)
  [code, HEADERS, { 'error' => error_message(exception) }]
end
handle_errors() { || ... } click to toggle source
# File lib/pontoon/goliath.rb, line 71
def handle_errors
  yield
rescue StandardError => se
  error_response(422, se)
rescue Exception => e
  error_response(500, e)
end
request_vote_response(params) click to toggle source
# File lib/pontoon/goliath.rb, line 38
def request_vote_response(params)
  #STDOUT.write("\nnode #{@node.id} received request_vote from #{params['candidate_id']}, term #{params['term']}\n")
  request = Pontoon::RequestVoteRequest.new(
      params['term'],
      params['candidate_id'],
      params['last_log_index'],
      params['last_log_term'])
  response = @node.handle_request_vote(request)
  [200, HEADERS, { 'term' => response.term, 'vote_granted' => response.vote_granted }]
end
response(env) click to toggle source
# File lib/pontoon/goliath.rb, line 25
def response(env)
  case env['REQUEST_PATH']
  when '/request_vote'
    handle_errors { request_vote_response(env['params']) }
  when '/append_entries'
    handle_errors { append_entries_response(env['params']) }
  when '/command'
    handle_errors { command_response(env['params']) }
  else
    error_response(404, 'not found')
  end
end