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