/usr/lib/ruby/vendor_ruby/moneta/shared.rb is in ruby-moneta 0.7.20-2.2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | module Moneta
# Shares a store between processes
#
# @example Share a store
# Moneta.build do
# use :Transformer, :key => :marshal, :value => :marshal
# use :Shared do
# adapter :GDBM, :file => 'shared.db'
# end
# end
#
# @api public
class Shared < Wrapper
# @param [Hash] options
# @option options [Integer] :port (9000) TCP port
# @option options [String] :host Server hostname
# @option options [String] :socket Unix socket file name
def initialize(options = {}, &block)
@options = options
@builder = Builder.new(&block)
end
# (see Proxy#close)
def close
if @server
@server.stop
@thread.join
@server = @thread = nil
end
if @adapter
@adapter.close
@adapter = nil
end
end
protected
def wrap(*args)
connect
yield
end
def connect
@adapter ||= Adapters::Client.new(@options)
rescue Errno::ECONNREFUSED, Errno::ENOENT => ex
start_server
tries ||= 0
warn "Moneta::Shared - Failed to connect: #{ex.message}" if tries > 0
(tries += 1) < 3 ? retry : raise
end
# TODO: Implement this using forking (MRI) and threading (JRuby)
# to get maximal performance
def start_server
@adapter = Lock.new(@builder.build.last)
@server = Server.new(@adapter, @options)
@thread = Thread.new { @server.run }
sleep 0.1 until @server.running?
rescue Exception => ex
@adapter.close if @adapter
@adapter = nil
@server = nil
@thread = nil
warn "Moneta::Shared - Failed to start server: #{ex.message}"
end
end
end
|