mitchellh-lightcloud 0.7 → 0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/lightcloud.rb +1 -1
- data/lib/tyrant_client.rb +117 -0
- metadata +2 -1
data/lib/lightcloud.rb
CHANGED
@@ -0,0 +1,117 @@
|
|
1
|
+
######################################
|
2
|
+
# Tyrant Client
|
3
|
+
# Code ported from Python version written by Amir Salihefendic
|
4
|
+
######################################
|
5
|
+
# Copyright (c) 2009, Mitchell Hashimoto, mitchell.hashimoto@gmail.com
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'hash_ring'
|
10
|
+
require 'rufus/tokyo'
|
11
|
+
require 'rufus/tokyo/tyrant'
|
12
|
+
|
13
|
+
# = Tyrant Client
|
14
|
+
#
|
15
|
+
# Manages many tyrant clients and exposes basic get/set/delete
|
16
|
+
# functionality for them.
|
17
|
+
#
|
18
|
+
class TyrantClient
|
19
|
+
@@connections = {}
|
20
|
+
|
21
|
+
#
|
22
|
+
# Initializes a TyrantClient. servers is expected to be an array
|
23
|
+
# of servers in form of "host:port"
|
24
|
+
def initialize(servers)
|
25
|
+
@servers = servers.collect do |server|
|
26
|
+
parts = server.split(':')
|
27
|
+
[parts[0], parts[1].to_i]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
#--
|
32
|
+
# Get/Set/Delete
|
33
|
+
#++
|
34
|
+
def get(key)
|
35
|
+
db = self.get_db(key)
|
36
|
+
|
37
|
+
db[key]
|
38
|
+
end
|
39
|
+
|
40
|
+
def set(key, value)
|
41
|
+
db = self.get_db(key)
|
42
|
+
|
43
|
+
db[key] = value
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete(key)
|
48
|
+
db = self.get_db(key)
|
49
|
+
|
50
|
+
begin
|
51
|
+
db.delete(key)
|
52
|
+
return true
|
53
|
+
rescue
|
54
|
+
return false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
#--
|
59
|
+
# Helpers
|
60
|
+
#++
|
61
|
+
def get_db(key)
|
62
|
+
index = self.hash(key) % @servers.length
|
63
|
+
first_host, first_port = @servers[index]
|
64
|
+
|
65
|
+
begin
|
66
|
+
return self.get_connection(first_host, first_port)
|
67
|
+
rescue
|
68
|
+
# Didn't work, try out other servers
|
69
|
+
@servers.each do |server|
|
70
|
+
host, port = server
|
71
|
+
|
72
|
+
# The python code "continues" on error code 61. Not sure
|
73
|
+
# what that is so I'll ignore it here but TODO to go back
|
74
|
+
# and look at it
|
75
|
+
return self.get_connection(host, port)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def get_connection(host, port)
|
81
|
+
key = "#{host}#{port}"
|
82
|
+
|
83
|
+
return @@connections[key] unless @@connections[key].nil?
|
84
|
+
|
85
|
+
@@connections[key] = Rufus::Tokyo::Tyrant.new(host, port)
|
86
|
+
return @@connections[key]
|
87
|
+
end
|
88
|
+
|
89
|
+
def hash(key)
|
90
|
+
m = Digest::MD5.new
|
91
|
+
m.update(key)
|
92
|
+
b_key = m.digest
|
93
|
+
|
94
|
+
return ((b_key[7] << 24) |
|
95
|
+
(b_key[6] << 16) |
|
96
|
+
(b_key[5] << 8) |
|
97
|
+
(b_key[4]))
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# = TyrantNode
|
102
|
+
#
|
103
|
+
# Extends TyrantClient with proper to_s functionality
|
104
|
+
class TyrantNode < TyrantClient
|
105
|
+
#
|
106
|
+
# Creates a TyrantNode given a name and a list of servers. The list
|
107
|
+
# of servers should be in the format for the constructor of
|
108
|
+
# TyrantClient
|
109
|
+
def initialize(name, nodes)
|
110
|
+
@name = name
|
111
|
+
super(nodes)
|
112
|
+
end
|
113
|
+
|
114
|
+
def to_s
|
115
|
+
@name
|
116
|
+
end
|
117
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mitchellh-lightcloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.8"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mitchell Hashimoto
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- README.rdoc
|
48
48
|
- Rakefile
|
49
49
|
- lib/lightcloud.rb
|
50
|
+
- lib/tyrant_client.rb
|
50
51
|
- spec/spec_base.rb
|
51
52
|
- spec/lightcloud_spec.rb
|
52
53
|
has_rdoc: true
|