Class: Rubcask::Server::Threaded
- Inherits:
-
AbstractServer
- Object
- AbstractServer
- Rubcask::Server::Threaded
- Includes:
- Protocol
- Defined in:
- lib/rubcask/server/threaded.rb
Overview
Thread-based server supporting Rubcask protocol If you are running on CRuby you should consider using Server::Async as it is generally more performant
Constant Summary
Constants included from Protocol
Protocol::ERROR, Protocol::NIL, Protocol::OK, Protocol::PING, Protocol::PONG, Protocol::SEPARATOR
Constants inherited from AbstractServer
AbstractServer::BLOCK_SIZE, AbstractServer::MAX_READ_SIZE
Instance Attribute Summary
Attributes inherited from AbstractServer
Instance Method Summary collapse
-
#connect ⇒ self
Creates sockets.
-
#initialize(dir, config: Server::Config.new) ⇒ Threaded
constructor
A new instance of Threaded.
-
#setup_shutdown_pipe ⇒ self
Prepares an IO pipe that is used in shutdown process Call if you need to shutdown the server from a different thread.
-
#shutdown ⇒ Object
Shuts down the server.
-
#start ⇒ Object
Starts the server.
Methods included from Protocol
create_call_message, encode_message, error_message, nil_message, ok_message, ping_message, pong_message
Constructor Details
#initialize(dir, config: Server::Config.new) ⇒ Threaded
Returns a new instance of Threaded.
19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/rubcask/server/threaded.rb', line 19 def initialize(dir, config: Server::Config.new) @dir = dir @config = config @hostname = config.hostname @port = config.port @logger = Logger.new($stdout) @logger.level = Logger::INFO @threads = ThreadGroup.new @connected = false @status = :stopped @listeners = [] end |
Instance Method Details
#connect ⇒ self
Creates sockets
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/rubcask/server/threaded.rb', line 34 def connect return if @connected @connected = true @listeners = Socket.tcp_server_sockets(@hostname, @port) if @config.keepalive @listeners.each do |s| s.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true) end end @listeners.each do |s| address = s.connect_address logger.info "Listening on #{address.ip_address}:#{address.ip_port}" end self end |
#setup_shutdown_pipe ⇒ self
Prepares an IO pipe that is used in shutdown process Call if you need to shutdown the server from a different thread
87 88 89 90 |
# File 'lib/rubcask/server/threaded.rb', line 87 def setup_shutdown_pipe @shutdown_pipe ||= IO.pipe self end |
#shutdown ⇒ Object
You probably want to use it in a signal trap
Shuts down the server
76 77 78 79 80 81 82 |
# File 'lib/rubcask/server/threaded.rb', line 76 def shutdown if @status == :running @status = :shutdown end @shutdown_pipe[1].write_nonblock("\0") @shutdown_pipe[1].close end |
#start ⇒ Object
It blocks the current thread
Starts the server
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/rubcask/server/threaded.rb', line 52 def start connect setup_shutdown_pipe @status = :running Thread.handle_interrupt(Exception => :never) do Thread.handle_interrupt(Exception => :immediate) do accept_loop end ensure cleanup_shutdown_pipe @status = :shutdown cleanup_listeners @threads.list.each(&:kill) @status = :stopped @connected = false logger.info "Closed server" end end |