class Raft::Goliath::HttpJsonRpcResponder
Constants
- HEADERS
Public Class Methods
new(node)
click to toggle source
# File lib/raft/goliath.rb, line 19 def initialize(node) @node = node end
Public Instance Methods
append_entries_response(params)
click to toggle source
# File lib/raft/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| Raft::LogEntry.new(entry['term'], entry['index'], entry['command'])} request = Raft::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/raft/goliath.rb, line 65 def command_response(params) request = Raft::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/raft/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/raft/goliath.rb, line 83 def error_response(code, exception) [code, HEADERS, { 'error' => error_message(exception) }] end
handle_errors() { || ... }
click to toggle source
# File lib/raft/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/raft/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 = Raft::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/raft/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