Browse Source

Refactoring the code, adding more tests

master v0.1.0-rc2
Archivist 5 years ago
parent
commit
9c7ddc1c61
2 changed files with 43 additions and 28 deletions
  1. +2
    -0
      spec/crystal-scatter_spec.cr
  2. +41
    -28
      src/crystal-scatter/metaring.cr

+ 2
- 0
spec/crystal-scatter_spec.cr View File

@ -20,10 +20,12 @@ describe Crystal::Scatter do
(1..1000).each do |numb|
slices = mr.get_slices_for(numb.to_s)
slices_history = mr.get_slices_for(numb.to_s,2)
set = Set(String).new
slices.each do |sl|
set<<sl.url
end
slices_history.slices.size.should eq(2)
set.size.should eq(3)
end
end

+ 41
- 28
src/crystal-scatter/metaring.cr View File

@ -1,4 +1,5 @@
require "./ring.cr"
require "json"
require "mutex"
require "openssl"
@ -12,6 +13,18 @@ module Crystal::Scatter
end
end
class SliceInfo
JSON.mapping(
slices: Array(Array(Slice)),
last: Int32,
shards: UInt32
)
def initialize(@slices, @last, @shards)
end
end
class MetaRing
getter rings : Array(Ring)
getter ring_graph : RingGraph
@ -44,12 +57,31 @@ module Crystal::Scatter
return tag
end
private def hash_and_split(data)
h = hash_impl data
space=UInt64::MAX/@shards
targets = Array(UInt64).new
(1..@shards).each do
targets << h
h+=space
end
return targets
end
private def get_slice_from_hash(ring : Ring, h : UInt64)
value = ring.find do |slice|
h>=slice.s_begin && slice.s_end>=h
end
return value.not_nil!
end
private def unfold_ring(ring : Ring, targets : Array(UInt64))
slices = Array(Slice).new
targets.each do |h|
slices << get_slice_from_hash(ring, h)
end
return slices
end
def add(element : Daemon)
@lock.synchronize do
@ -78,44 +110,25 @@ module Crystal::Scatter
ring? = @rings.last
end
ring = ring?.not_nil!
h = hash_impl data
space=UInt64::MAX/@shards
targets = Array(UInt64).new
(1..@shards).each do
targets << h
h+=space
end
slices = Array(Slice).new
targets.each do |h|
slices << get_slice_from_hash(ring, h)
end
targets = hash_and_split(data)
slices = unfold_ring(ring,targets)
return slices
end
def get_slices_for(data : String, n_last o">= 1 : Int32)
def get_slices_for(data : String, n_last : UInt32)
n_rings = Array(Ring).new
sllast = 0
@lock.synchronize do
sllast = @rings.size - 1
t = @rings.size-n_last
n_rings = @rings.skip( t > 0 ? t : 1 )
n_rings = @rings.skip( t >= 0 ? t : 1 )
end
h = hash_impl data
space=UInt64::MAX/@shards
targets = Array(UInt64).new
(1..@shards).each do
targets << h
h+=space
end
targets = hash_and_split(data)
ret = Array(Array(Slice)).new
n_rings.each do |ring|
slices = Array(Slice).new
targets.each do |h|
slices << get_slice_from_hash(ring, h)
end
ret << slices
ret << unfold_ring(ring,targets)
end
return ret
return SliceInfo.new ret, sllast, @shards
end
end
end

Loading…
Cancel
Save