hash_ring 0.0.1
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/ext/hash_ring/extconf.rb +9 -0
- data/ext/hash_ring/hash_ring.c +109 -0
- data/lib/hash_ring.rb +37 -0
- metadata +48 -0
@@ -0,0 +1,109 @@
|
|
1
|
+
#include "ruby.h"
|
2
|
+
#include "hash_ring.h"
|
3
|
+
|
4
|
+
VALUE cHashRing;
|
5
|
+
|
6
|
+
static VALUE hash_ring_dealloc(void * ring)
|
7
|
+
{
|
8
|
+
hash_ring_free(ring);
|
9
|
+
}
|
10
|
+
|
11
|
+
static VALUE hash_ring_alloc(VALUE klass)
|
12
|
+
{
|
13
|
+
hash_ring_t * ring;
|
14
|
+
VALUE obj = Data_Make_Struct(klass, hash_ring_t, NULL, hash_ring_dealloc, ring);
|
15
|
+
return obj;
|
16
|
+
}
|
17
|
+
|
18
|
+
static VALUE method_initialize(VALUE self, VALUE num_replicas, VALUE hash_function)
|
19
|
+
{
|
20
|
+
Check_Type(num_replicas, T_FIXNUM);
|
21
|
+
Check_Type(hash_function, T_FIXNUM);
|
22
|
+
|
23
|
+
hash_ring_t * ring;
|
24
|
+
hash_ring_t * new_ring;
|
25
|
+
|
26
|
+
int nr_int = FIX2INT(num_replicas);
|
27
|
+
int hf_int = FIX2INT(hash_function);
|
28
|
+
|
29
|
+
Data_Get_Struct(self, hash_ring_t, ring);
|
30
|
+
|
31
|
+
new_ring = hash_ring_create(nr_int, hf_int);
|
32
|
+
|
33
|
+
MEMCPY(ring, new_ring, hash_ring_t, 1);
|
34
|
+
|
35
|
+
hash_ring_free(new_ring);
|
36
|
+
|
37
|
+
return self;
|
38
|
+
}
|
39
|
+
|
40
|
+
static VALUE method_add_node(VALUE self, VALUE name)
|
41
|
+
{
|
42
|
+
Check_Type(name, T_STRING);
|
43
|
+
hash_ring_t *ring;
|
44
|
+
|
45
|
+
Data_Get_Struct(self, hash_ring_t, ring);
|
46
|
+
|
47
|
+
char * cname = StringValuePtr(name);
|
48
|
+
hash_ring_add_node(ring, cname, strlen(cname));
|
49
|
+
|
50
|
+
return self;
|
51
|
+
}
|
52
|
+
|
53
|
+
static VALUE method_remove_node(VALUE self, VALUE name)
|
54
|
+
{
|
55
|
+
Check_Type(name, T_STRING);
|
56
|
+
|
57
|
+
hash_ring_t * ring;
|
58
|
+
|
59
|
+
char * cname = StringValuePtr(name);
|
60
|
+
|
61
|
+
Data_Get_Struct(self, hash_ring_t, ring);
|
62
|
+
|
63
|
+
hash_ring_remove_node(ring, cname, strlen(cname));
|
64
|
+
|
65
|
+
return self;
|
66
|
+
}
|
67
|
+
|
68
|
+
static VALUE method_print_ring(VALUE self)
|
69
|
+
{
|
70
|
+
hash_ring_t * ring;
|
71
|
+
Data_Get_Struct(self, hash_ring_t, ring);
|
72
|
+
|
73
|
+
hash_ring_print(ring);
|
74
|
+
return self;
|
75
|
+
}
|
76
|
+
|
77
|
+
static VALUE method_find_node(VALUE self, VALUE key){
|
78
|
+
Check_Type(key, T_STRING);
|
79
|
+
|
80
|
+
char * ckey = StringValuePtr(key);
|
81
|
+
|
82
|
+
hash_ring_t * ring;
|
83
|
+
Data_Get_Struct(self, hash_ring_t, ring);
|
84
|
+
|
85
|
+
hash_ring_node_t *node = hash_ring_find_node(ring, ckey, strlen(ckey));
|
86
|
+
|
87
|
+
VALUE cs;
|
88
|
+
|
89
|
+
if(node == NULL){
|
90
|
+
rb_raise(rb_eRuntimeError, "No nodes found");
|
91
|
+
} else {
|
92
|
+
cs = rb_str_new(node->name, node->nameLen);
|
93
|
+
}
|
94
|
+
|
95
|
+
return cs;
|
96
|
+
}
|
97
|
+
|
98
|
+
void Init_hash_ring()
|
99
|
+
{
|
100
|
+
cHashRing = rb_define_class("HashRing", rb_cObject);
|
101
|
+
|
102
|
+
rb_define_alloc_func(cHashRing, hash_ring_alloc);
|
103
|
+
|
104
|
+
rb_define_method(cHashRing, "init", method_initialize, 2);
|
105
|
+
rb_define_method(cHashRing, "addNode", method_add_node, 1);
|
106
|
+
rb_define_method(cHashRing, "removeNode", method_remove_node, 1);
|
107
|
+
rb_define_method(cHashRing, "findNode", method_find_node, 1);
|
108
|
+
rb_define_method(cHashRing, "printRing", method_print_ring, 0);
|
109
|
+
}
|
data/lib/hash_ring.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'hash_ring/hash_ring'
|
2
|
+
|
3
|
+
class HashRing
|
4
|
+
VERSION = "0.0.1"
|
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
|
29
|
+
|
30
|
+
def print
|
31
|
+
self.printRing
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
"<HashRing:#{self.object_id} @num_replicas=#{@num_replicas} @hash_function=#{@hash_function} @nodes=#{@nodes}>"
|
36
|
+
end
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hash_ring
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael R. Bernstein
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-12 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Wraps https://github.com/mikeyk/hash-ring
|
15
|
+
email: michaelrbernstein@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions:
|
18
|
+
- ext/hash_ring/extconf.rb
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/hash_ring.rb
|
22
|
+
- ext/hash_ring/hash_ring.c
|
23
|
+
- ext/hash_ring/extconf.rb
|
24
|
+
homepage: http://github.com/mrb/hash_ring
|
25
|
+
licenses: []
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 1.8.10
|
45
|
+
signing_key:
|
46
|
+
specification_version: 3
|
47
|
+
summary: A wrapper for a fast C hash ring library
|
48
|
+
test_files: []
|