lib/fastdfs-client/tracker.rb in fastdfs-client-1.4.4 vs lib/fastdfs-client/tracker.rb in fastdfs-client-2.0.0
- old
+ new
@@ -3,26 +3,78 @@
module Fastdfs
module Client
class Tracker
- attr_accessor :options, :socket
+ include Delegation
- def initialize(host, port, options = {})
- @options = options
- @proxy = ClientProxy.new(host, port, @options[:socket])
- @socket = @proxy.socket
+ attr_accessor :options
+
+ delegate :upload, :delete, :get_metadata, :set_metadata, :download, to: :get_storage
+
+ def initialize(options = {})
+ @options = default_options_merge(options)
+ @proxies = @options[:trackers].map do |tracker|
+ opt = tracker.fs_symbolize_keys
+ ClientProxy.new(opt[:host], opt[:port], extract_proxy_options.merge(alive: true))
+ end
+
end
- def get_storage
- res = @proxy.dispose(CMD::STORE_WITHOUT_GROUP_ONE) do |body|
+ def get_storage(alive = false)
+ res = proxy.dispose(CMD::STORE_WITHOUT_GROUP_ONE) do |body|
storage_ip = body[ProtoCommon::IPADDR].strip
storage_port = body[ProtoCommon::PORT].unpack("C*").to_pack_long
store_path = body[ProtoCommon::TRACKER_BODY_LEN-1].unpack("C*")[0]
- Storage.new(storage_ip, storage_port, store_path, @options)
+ Storage.new(storage_ip, storage_port, store_path, extract_proxy_options.merge(alive: alive))
end
- res[:status] ? res[:result] : res
+ raise res[:err_msg] unless res[:status]
+ res[:result]
+ end
+
+ def pipeline
+ storage = get_storage(true)
+ yield storage
+ storage
+ ensure
+ storage.proxy.close
+ end
+
+ private
+ def default_options_merge(options = {})
+ opts = default_options.merge(options)
+ tracker = {host: opts.delete(:host), port: opts.delete(:port)}
+ if !tracker[:host].nil?
+ opts[:trackers] = [tracker]
+ elsif opts[:trackers].is_a?(Hash)
+ opts[:trackers] = [opts[:trackers]]
+ end
+ opts
+ end
+
+ def default_options
+ {
+ host: nil,
+ port: nil,
+ trackers: [
+ {host: "127.0.0.1", port: "22122"}
+ ],
+ connection_timeout: 3,
+ recv_timeout: 20
+ }
+ end
+
+ def extract_proxy_options
+ keys = [:connection_timeout, :recv_timeout]
+ @options.select{|key| keys.include?(key) }
+ end
+
+ def proxy
+ @proxy_index ||= -1
+ @proxy_index += 1
+ @proxy_index = 0 if @proxy_index >= @proxies.length
+ @proxies[@proxy_index]
end
end
end
end
\ No newline at end of file