lib/shatter/service/base.rb in shatter-rb-0.0.2 vs lib/shatter/service/base.rb in shatter-rb-0.1.0
- old
+ new
@@ -1,73 +1,66 @@
# frozen_string_literal: true
-require 'singleton'
-require 'benchmark'
+
require "drb/drb"
-require "zk"
require "concurrent-ruby"
# Server Side of the drb
module Shatter
module Service
class Base
- include Concurrent::Async
-
- class ZooKeeperConnection
- include Singleton
- attr_reader :client
- def initialize
- @client = ZK.new(Shatter::Config.zookeeper_host)
+ class ReloadWrapper
+ def self.method_missing(method, *args, &)
+ Shatter::RELOAD_RW_LOCK.with_write_lock do
+ Shatter.reload
+ end
+ Shatter::RELOAD_RW_LOCK.with_read_lock do
+ Shatter::Service::Base.send(method, *args)
+ end
end
end
+ include Concurrent::Async
+
class << self
- attr_reader :service_definition
- attr_writer :service_definition
+ attr_accessor :service_definition
end
def self.response_for(uuid)
- ResponsePool.instance.pool[uuid]
+ Shatter::Service::ResponsePool.instance.pool[uuid]
end
def self.respond_to_missing?(method)
- @service_definition.instance_methods.include?(method.to_sym)
+ @service_definition.new.respond_to?(method)
end
def self.set_static_result_for(uuid, result)
- puts "Setting static content"
- populate_pool_with_result(Time.now, {uuid:, result:}, nil)
+ populate_pool_with_result(Time.now, { uuid:, result: }, nil)
end
def self.method_missing(method, *args, &)
- Shatter.logger.info "Mapping #{method}"
+ super unless respond_to_missing?(method)
uuid = args[0].is_a?(Hash) ? args[0][:uuid] : args[0].uuid
- return {error: 'missing uuid'} if uuid.nil?
+ return { error: "missing uuid" } if uuid.nil?
+
future = @service_definition.new.async.send(method, *args, &)
future.add_observer(self, :populate_pool_with_result)
end
- def self.populate_pool_with_result(time, value, err)
- if err
- Shatter.logger.info err
- end
- ResponsePool.instance.pool[value[:uuid]] = value
- zk = ZooKeeperConnection.instance.client
- key = nil
- key = Util.zookeeper_response_key(value[:uuid])
- my_ip = ENV["HOST_NAME"] || "localhost"
- host = "#{my_ip}:#{Shatter::Config.service_port}"
- Shatter.logger.info "Recording location of #{value[:uuid]} at #{host} #{value}"
- zk.create(key, host)
- my_ip
- rescue Exception => e
+ def self.populate_pool_with_result(_time, value, err)
+ Shatter.logger.info err if err
+ Shatter.logger.info "#{value[:uuid]} => #{value}" unless err
+ Shatter::Service::ResponsePool.instance.pool[value[:uuid]] = value
+ Shatter::Service::Discovery.populate_result_location(value[:uuid])
+ rescue StandardError => e
Shatter.logger.error e
raise e
end
def self.close
logger = Shatter.logger
- logger.info "Closing down DRb service"
+ logger.info "Closing down DRb service: #{@service_instance}"
+ @service_instance.stop_service
port = Shatter::Config.service_port
uri = "localhost:#{port}"
logger.info "Removing my existnce at #{port} to zookeeper"
Shatter::Service::Discovery.deregister_service(uri)
logger.info "Closed DRb service"
@@ -78,16 +71,16 @@
port = Shatter::Config.service_port
uri = "localhost:#{port}"
logger.info "Logging my existnce at #{uri} to zookeeper"
Shatter::Service::Discovery.register_service(uri)
logger.info "Starting DRb service"
- DRb.start_service("druby://#{uri}", self)
+ @service_instance = DRb.start_service("druby://#{uri}", Shatter::Config.reload_classes ? ReloadWrapper : self)
logger.info "DRb service started"
DRb.thread.join
end
def self.logger
Shatter.logger
end
end
end
-end
\ No newline at end of file
+end