Class: Archipelago::Exxon::Valdez
- Inherits:
-
Client::Base
- Object
- Client::Base
- Archipelago::Exxon::Valdez
- Defined in:
- lib/archipelago/exxon.rb
Instance Attribute Summary collapse
-
#tankers ⇒ Object
readonly
Returns the value of attribute tankers.
Attributes inherited from Client::Base
Instance Method Summary collapse
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object
-
#initialize(options = {}) ⇒ Valdez
constructor
A new instance of Valdez.
- #responsible_tanker(key) ⇒ Object
- #responsible_tankers(key, n) ⇒ Object
- #setup(options = {}) ⇒ Object
- #update_services! ⇒ Object
Methods inherited from Client::Base
Constructor Details
#initialize(options = {}) ⇒ Valdez
Returns a new instance of Valdez.
42 43 44 45 46 |
# File 'lib/archipelago/exxon.rb', line 42 def initialize( = {}) super() start_service_updater end |
Instance Attribute Details
#tankers ⇒ Object (readonly)
Returns the value of attribute tankers.
41 42 43 |
# File 'lib/archipelago/exxon.rb', line 41 def tankers @tankers end |
Instance Method Details
#[](key) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/archipelago/exxon.rb', line 63 def [](key) return_value = nil split_parts = [] followers = responsible_tankers(key, (1 << @parts) - 1) while split_parts.size < @parts split_parts << followers.shift.get_part(key) end begin return_value = Archipelago::Raider.join(*split_parts.compact) rescue Archipelago::Raider::NotEnoughBulkError => e if followers.empty? raise e else split_parts << followers.shift.get_part(key) retry end end return return_value end |
#[]=(key, value) ⇒ Object
55 56 57 58 59 60 61 |
# File 'lib/archipelago/exxon.rb', line 55 def []=(key, value) split_parts = Archipelago::Raider.split(value, @parts) followers = responsible_tankers(key, split_parts.size) 0.upto(followers.size - 1) do |n| followers[n].store_part(key, split_parts[n]) end end |
#responsible_tanker(key) ⇒ Object
109 110 111 |
# File 'lib/archipelago/exxon.rb', line 109 def responsible_tanker(key) return responsible_tankers(key, 1).first end |
#responsible_tankers(key, n) ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/archipelago/exxon.rb', line 89 def responsible_tankers(key, n) raise NoRemoteDatabaseAvailableException.new(self) if @tankers.empty? responsible_ids = [] key_id = Digest::SHA1.hexdigest(Marshal.dump(key)) sorted_tanker_ids = @tankers.keys.sort 0.upto(sorted_tanker_ids.size - 1) do |index| id = sorted_tanker_ids[index] if id > key_id responsible_ids = get_some(sorted_tanker_ids, index, n) end end responsible_ids = get_some(sorted_tanker_ids, 0, n) return responsible_ids.collect do |id| @tankers[id][:service] end end |
#setup(options = {}) ⇒ Object
48 49 50 51 52 53 |
# File 'lib/archipelago/exxon.rb', line 48 def setup( = {}) super() @parts = [:parts] || PARTS @tanker_description = TANKER_DESCRIPTION.merge([:tanker_description] || {}) end |
#update_services! ⇒ Object
85 86 87 |
# File 'lib/archipelago/exxon.rb', line 85 def update_services! @tankers = @jockey.lookup(Archipelago::Disco::Query.new(@tanker_description), 0) end |