hash_ring 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/hash_ring/extconf.rb +1 -1
- data/ext/hash_ring/hash_ring.c +42 -16
- data/lib/hash_ring.rb +4 -28
- metadata +3 -3
data/ext/hash_ring/extconf.rb
CHANGED
data/ext/hash_ring/hash_ring.c
CHANGED
@@ -1,18 +1,21 @@
|
|
1
1
|
#include "ruby.h"
|
2
2
|
#include "hash_ring.h"
|
3
3
|
|
4
|
+
#define CHECK_RING(data) \
|
5
|
+
if (!data) \
|
6
|
+
rb_raise(rb_eRuntimeError, "uninitialized data");
|
7
|
+
|
4
8
|
VALUE cHashRing;
|
5
9
|
|
6
10
|
static VALUE hash_ring_dealloc(void * ring)
|
7
11
|
{
|
8
|
-
|
12
|
+
if (ring)
|
13
|
+
hash_ring_free(ring);
|
9
14
|
}
|
10
15
|
|
11
16
|
static VALUE hash_ring_alloc(VALUE klass)
|
12
17
|
{
|
13
|
-
|
14
|
-
VALUE obj = Data_Make_Struct(klass, hash_ring_t, NULL, hash_ring_dealloc, ring);
|
15
|
-
return obj;
|
18
|
+
return Data_Wrap_Struct(klass, NULL, hash_ring_dealloc, NULL);
|
16
19
|
}
|
17
20
|
|
18
21
|
static VALUE method_initialize(VALUE self, VALUE num_replicas, VALUE hash_function)
|
@@ -21,18 +24,24 @@ static VALUE method_initialize(VALUE self, VALUE num_replicas, VALUE hash_functi
|
|
21
24
|
Check_Type(hash_function, T_FIXNUM);
|
22
25
|
|
23
26
|
hash_ring_t * ring;
|
24
|
-
hash_ring_t
|
27
|
+
Data_Get_Struct(self, hash_ring_t, ring);
|
28
|
+
|
29
|
+
/* If this method is called twice, free the old ring. */
|
30
|
+
if (ring)
|
31
|
+
hash_ring_free(ring);
|
25
32
|
|
26
33
|
int nr_int = FIX2INT(num_replicas);
|
27
34
|
int hf_int = FIX2INT(hash_function);
|
28
35
|
|
29
|
-
|
36
|
+
ring = hash_ring_create(nr_int, hf_int);
|
30
37
|
|
31
|
-
|
38
|
+
VALUE ary = rb_ary_new();
|
32
39
|
|
33
|
-
|
40
|
+
rb_iv_set(self, "@num_replicas", num_replicas);
|
41
|
+
rb_iv_set(self, "@hash_function", hash_function);
|
42
|
+
rb_iv_set(self, "@nodes", ary);
|
34
43
|
|
35
|
-
|
44
|
+
DATA_PTR(self) = ring;
|
36
45
|
|
37
46
|
return self;
|
38
47
|
}
|
@@ -43,9 +52,17 @@ static VALUE method_add_node(VALUE self, VALUE name)
|
|
43
52
|
hash_ring_t *ring;
|
44
53
|
|
45
54
|
Data_Get_Struct(self, hash_ring_t, ring);
|
55
|
+
CHECK_RING(ring);
|
46
56
|
|
47
57
|
char * cname = StringValuePtr(name);
|
48
|
-
|
58
|
+
|
59
|
+
if(hash_ring_add_node(ring, cname, strlen(cname)) == 0){
|
60
|
+
VALUE ary = rb_iv_get(self, "@nodes");
|
61
|
+
rb_ary_push(ary, name);
|
62
|
+
rb_iv_set(self, "@nodes", ary);
|
63
|
+
} else {
|
64
|
+
return Qnil;
|
65
|
+
}
|
49
66
|
|
50
67
|
return self;
|
51
68
|
}
|
@@ -59,8 +76,15 @@ static VALUE method_remove_node(VALUE self, VALUE name)
|
|
59
76
|
char * cname = StringValuePtr(name);
|
60
77
|
|
61
78
|
Data_Get_Struct(self, hash_ring_t, ring);
|
79
|
+
CHECK_RING(ring);
|
62
80
|
|
63
|
-
hash_ring_remove_node(ring, cname, strlen(cname))
|
81
|
+
if(hash_ring_remove_node(ring, cname, strlen(cname)) == 0){
|
82
|
+
VALUE ary = rb_iv_get(self, "@nodes");
|
83
|
+
rb_ary_delete(ary, name);
|
84
|
+
rb_iv_set(self, "@nodes", ary);
|
85
|
+
} else {
|
86
|
+
return Qnil;
|
87
|
+
}
|
64
88
|
|
65
89
|
return self;
|
66
90
|
}
|
@@ -69,6 +93,7 @@ static VALUE method_print_ring(VALUE self)
|
|
69
93
|
{
|
70
94
|
hash_ring_t * ring;
|
71
95
|
Data_Get_Struct(self, hash_ring_t, ring);
|
96
|
+
CHECK_RING(ring);
|
72
97
|
|
73
98
|
hash_ring_print(ring);
|
74
99
|
return self;
|
@@ -81,6 +106,7 @@ static VALUE method_find_node(VALUE self, VALUE key){
|
|
81
106
|
|
82
107
|
hash_ring_t * ring;
|
83
108
|
Data_Get_Struct(self, hash_ring_t, ring);
|
109
|
+
CHECK_RING(ring);
|
84
110
|
|
85
111
|
hash_ring_node_t *node = hash_ring_find_node(ring, ckey, strlen(ckey));
|
86
112
|
|
@@ -101,9 +127,9 @@ void Init_hash_ring()
|
|
101
127
|
|
102
128
|
rb_define_alloc_func(cHashRing, hash_ring_alloc);
|
103
129
|
|
104
|
-
rb_define_method(cHashRing, "
|
105
|
-
rb_define_method(cHashRing, "
|
106
|
-
rb_define_method(cHashRing, "
|
107
|
-
rb_define_method(cHashRing, "
|
108
|
-
rb_define_method(cHashRing, "
|
130
|
+
rb_define_method(cHashRing, "initialize", method_initialize, 2);
|
131
|
+
rb_define_method(cHashRing, "add_node", method_add_node, 1);
|
132
|
+
rb_define_method(cHashRing, "remove_node", method_remove_node, 1);
|
133
|
+
rb_define_method(cHashRing, "find_node", method_find_node, 1);
|
134
|
+
rb_define_method(cHashRing, "print_ring", method_print_ring, 0);
|
109
135
|
}
|
data/lib/hash_ring.rb
CHANGED
@@ -1,37 +1,13 @@
|
|
1
|
-
require 'hash_ring/hash_ring'
|
2
|
-
|
3
1
|
class HashRing
|
4
|
-
VERSION = "0.0.
|
5
|
-
|
6
|
-
attr_accessor :nodes, :num_replicas, :hash_function
|
7
|
-
|
8
|
-
def initialize(num_replicas, hash_function)
|
9
|
-
@nodes = []
|
10
|
-
@num_replicas = num_replicas
|
11
|
-
@hash_function = hash_function
|
12
|
-
init(num_replicas, hash_function)
|
13
|
-
end
|
14
|
-
|
15
|
-
def add_node(name)
|
16
|
-
@nodes << name
|
17
|
-
@nodes.uniq!
|
18
|
-
self.addNode(name)
|
19
|
-
end
|
20
|
-
|
21
|
-
def remove_node(name)
|
22
|
-
@nodes.reject!{|n| n == name}
|
23
|
-
self.removeNode(name)
|
24
|
-
end
|
25
|
-
|
26
|
-
def find_node(name)
|
27
|
-
self.findNode(name)
|
28
|
-
end
|
2
|
+
VERSION = "0.0.2"
|
29
3
|
|
30
4
|
def print
|
31
|
-
self.
|
5
|
+
self.print_ring
|
32
6
|
end
|
33
7
|
|
34
8
|
def to_s
|
35
9
|
"<HashRing:#{self.object_id} @num_replicas=#{@num_replicas} @hash_function=#{@hash_function} @nodes=#{@nodes}>"
|
36
10
|
end
|
37
11
|
end
|
12
|
+
|
13
|
+
require 'hash_ring/hash_ring'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hash_ring
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,9 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-13 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
|
-
description: Wraps https://github.com/
|
14
|
+
description: Wraps https://github.com/chrismoos/hash-ring
|
15
15
|
email: michaelrbernstein@gmail.com
|
16
16
|
executables: []
|
17
17
|
extensions:
|