Class: Fraggle::Block::Client

Inherits:
Object
  • Object
show all
Includes:
Request::Verb
Defined in:
lib/fraggle/block/client.rb

Defined Under Namespace

Classes: OutOfNodes

Constant Summary

Constants included from Request::Verb

Request::Verb::ACCESS, Request::Verb::DEL, Request::Verb::GET, Request::Verb::GETDIR, Request::Verb::NOP, Request::Verb::REV, Request::Verb::SET, Request::Verb::STAT, Request::Verb::WAIT, Request::Verb::WALK

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(addrs = []) ⇒ Client

Returns a new instance of Client.



13
14
15
16
17
18
19
# File 'lib/fraggle/block/client.rb', line 13

def initialize(addrs = [])
  @addrs = addrs
  if not @addrs or @addrs.length == 0
    raise "No doozer servers to connect to"
  end
  connect
end

Instance Attribute Details

#addrsObject

Returns the value of attribute addrs.



10
11
12
# File 'lib/fraggle/block/client.rb', line 10

def addrs
  @addrs
end

#connectionObject (readonly)

Returns the value of attribute connection.



11
12
13
# File 'lib/fraggle/block/client.rb', line 11

def connection
  @connection
end

Instance Method Details

#connectObject



73
74
75
76
77
78
79
80
81
82
# File 'lib/fraggle/block/client.rb', line 73

def connect
  begin
    host, port = @addrs.shift.split(':')
    @connection = connection_to(host, port.to_i)
    find_all_of_the_nodes
  rescue => e
    retry if @addrs.any?
    raise OutOfNodes, "where did they go?"
  end
end

#connection_to(host, port) ⇒ Object



84
85
86
# File 'lib/fraggle/block/client.rb', line 84

def connection_to(host, port)
  Connection.new(host, port)
end

#del(path, rev) ⇒ Object



41
42
43
44
# File 'lib/fraggle/block/client.rb', line 41

def del(path, rev)
  request = Request.new(:path => path, :rev => rev, :verb => DEL)
  send(request).first
end

#disconnectObject



64
65
66
# File 'lib/fraggle/block/client.rb', line 64

def disconnect
  @connection.disconnect
end

#find_all_of_the_nodesObject



88
89
90
91
92
93
# File 'lib/fraggle/block/client.rb', line 88

def find_all_of_the_nodes
  response = rev()
  walk('/ctl/node/*/addr', response.rev).each do |node|
    @addrs << node.value unless @addrs.include? node.value
  end
end

#get(path, rev = nil) ⇒ Object



26
27
28
29
# File 'lib/fraggle/block/client.rb', line 26

def get(path, rev = nil)
  request = Request.new(:path => path, :rev => rev, :verb => GET)
  send(request).first
end

#getdir(path, rev = nil, offset = nil, limit = nil) ⇒ Object



31
32
33
34
# File 'lib/fraggle/block/client.rb', line 31

def getdir(path, rev = nil, offset = nil, limit = nil)
  request = Request.new(:path => path, :rev => rev, :offset => offset, :limit => limit, :verb => GETDIR)
  send(request)
end

#reconnectObject



68
69
70
71
# File 'lib/fraggle/block/client.rb', line 68

def reconnect
  disconnect
  connect
end

#revObject



21
22
23
24
# File 'lib/fraggle/block/client.rb', line 21

def rev
  request = Request.new(:verb => REV)
  send(request).first
end

#set(path, value, rev) ⇒ Object



36
37
38
39
# File 'lib/fraggle/block/client.rb', line 36

def set(path, value, rev)
  request = Request.new(:path => path, :value => value, :rev => rev, :verb => SET)
  send(request).first
end

#walk(path, rev = nil, offset = 0) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/fraggle/block/client.rb', line 46

def walk(path, rev = nil, offset = 0)
  all_responses = []
  done = false
  while not done
    request = Request.new(:path => path, :rev => rev, :verb => WALK, :offset => offset)
    responses = send(request)
    responses.each do |response|
      if response.err_code == Response::Err::RANGE
        done = true
        break
      end
      all_responses.push response
      offset += 1
    end
  end
  return all_responses
end