Class: Archipelago::Exxon::Valdez

Inherits:
Client::Base show all
Defined in:
lib/archipelago/exxon.rb

Instance Attribute Summary collapse

Attributes inherited from Client::Base

#jockey

Instance Method Summary collapse

Methods inherited from Client::Base

#stop!

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(options = {})
  super(options)

  start_service_updater
end

Instance Attribute Details

#tankersObject (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(options = {})
  super(options)

  @parts = options[:parts] || PARTS
  @tanker_description = TANKER_DESCRIPTION.merge(options[: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