From 31e0950ace33f742d0b01e71c441bc4f204e05ab Mon Sep 17 00:00:00 2001 From: Alastair Pharo Date: Sat, 7 Sep 2019 20:36:19 +1000 Subject: [PATCH] Shared: add #server? method This method returns true when the wrapper is running in server mode --- lib/moneta/shared.rb | 18 +++++++++++++----- spec/moneta/proxies/shared/shared_tcp_spec.rb | 10 ++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/moneta/shared.rb b/lib/moneta/shared.rb index 9bd680ef..269017c1 100644 --- a/lib/moneta/shared.rb +++ b/lib/moneta/shared.rb @@ -23,7 +23,7 @@ def initialize(options = {}, &block) # (see Proxy#close) def close - if @server + if server? @server.stop @thread.join @server = @thread = nil @@ -34,13 +34,20 @@ def close end end + # Returns true if this wrapper is running as the server + # + # @return [Boolean] wrapper is a server + def server? + @server != nil + end + protected def wrap(*args) connect yield rescue Errno::ECONNRESET, Errno::EPIPE, IOError, SystemCallError - @connect_lock.synchronize { close unless @server } + @connect_lock.synchronize { close unless server? } tries ||= 0 (tries += 1) < 3 ? retry : raise end @@ -50,21 +57,22 @@ def connect @connect_lock.synchronize do @adapter ||= Adapters::Client.new(@options) end - rescue Errno::ECONNREFUSED, Errno::ENOENT => ex + rescue Errno::ECONNREFUSED, Errno::ENOENT, IOError => ex start_server tries ||= 0 warn "Moneta::Shared - Failed to connect: #{ex.message}" if tries > 0 - (tries += 1) < 3 ? retry : raise + (tries += 1) < 10 ? retry : raise end # TODO: Implement this using forking (MRI) and threading (JRuby) # to get maximal performance def start_server @connect_lock.synchronize do + return if server? begin raise "Adapter already set" if @adapter @adapter = Lock.new(@builder.build.last) - raise "Server already set" if @server + raise "Server already set" if server? @server = Server.new(@adapter, @options) @thread = Thread.new { @server.run } sleep 0.1 until @server.running? diff --git a/spec/moneta/proxies/shared/shared_tcp_spec.rb b/spec/moneta/proxies/shared/shared_tcp_spec.rb index 7d653f3c..2ec62bb3 100644 --- a/spec/moneta/proxies/shared/shared_tcp_spec.rb +++ b/spec/moneta/proxies/shared/shared_tcp_spec.rb @@ -22,6 +22,11 @@ # The first store initialised will be running the server context "running as the server" do + before do + store.load('dummy') + expect(store.server?).to be true + end + include_examples :shared_tcp it 'has the underlying adapter' do @@ -35,6 +40,11 @@ new_store.tap { |store| store.load('dummy') } # Makes a connection end + before do + store.load('dummy') + expect(store.server?).to be false + end + after do server_store.close end