mirror of
https://github.com/discourse/discourse.git
synced 2025-09-06 10:50:21 +08:00
64 lines
1.1 KiB
Ruby
64 lines
1.1 KiB
Ruby
|
require 'socket'
|
||
|
|
||
|
class StatsSocket
|
||
|
|
||
|
def initialize(socket_path)
|
||
|
@socket_path = socket_path
|
||
|
@server = nil
|
||
|
end
|
||
|
|
||
|
def start
|
||
|
@server = UNIXServer.new(@socket_path)
|
||
|
@accept_thread = new_accept_thread
|
||
|
end
|
||
|
|
||
|
def stop
|
||
|
@server.close if @server
|
||
|
@server = nil
|
||
|
end
|
||
|
|
||
|
protected
|
||
|
|
||
|
def new_accept_thread
|
||
|
server = @server
|
||
|
Thread.new do
|
||
|
done = false
|
||
|
while !done
|
||
|
done = !accept_connection(server)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def accept_connection(server)
|
||
|
socket = nil
|
||
|
begin
|
||
|
socket = server.accept
|
||
|
rescue IOError
|
||
|
# socket was shut down or something catastrophic like that happened
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
line = socket.readline
|
||
|
socket.write get_response(line.strip)
|
||
|
socket.close
|
||
|
true
|
||
|
rescue IOError
|
||
|
# nothing to do here, case its normal on shutdown
|
||
|
rescue => e
|
||
|
Rails.logger.warn("Failed to handle connection in stats socket #{e}")
|
||
|
end
|
||
|
|
||
|
def get_response(command)
|
||
|
result =
|
||
|
case command
|
||
|
when "gc_stat"
|
||
|
GC.stat.to_json
|
||
|
else
|
||
|
"[\"UNKNOWN COMMAND\"]"
|
||
|
end
|
||
|
|
||
|
result << "\n"
|
||
|
end
|
||
|
|
||
|
end
|