Added threadsafe counting object
This commit is contained in:
parent
ddb35e06a2
commit
a93cb22fb5
40
app/models/cluster.rb
Normal file
40
app/models/cluster.rb
Normal file
|
@ -0,0 +1,40 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'securerandom'
|
||||
|
||||
# A collective for a tally
|
||||
class Cluster
|
||||
attr_reader :count, :name, :status, :uuid
|
||||
@@clusters = {}
|
||||
|
||||
def initialize(name)
|
||||
@uuid = SecureRandom.uuid
|
||||
@name = name
|
||||
@count = 0
|
||||
@status = :open
|
||||
@mutex = Mutex.new
|
||||
@@clusters[@uuid] = self
|
||||
end
|
||||
|
||||
def increment(var = 1)
|
||||
@mutex.synchronize do
|
||||
@count += var
|
||||
end
|
||||
end
|
||||
|
||||
def decrement(var = 1)
|
||||
@mutex.synchronize do
|
||||
@count -= var
|
||||
end
|
||||
end
|
||||
|
||||
class << self
|
||||
def get(uuid)
|
||||
@@clusters[uuid]
|
||||
end
|
||||
|
||||
def list
|
||||
@@clusters
|
||||
end
|
||||
end
|
||||
end
|
36
test/models/cluster_test.rb
Normal file
36
test/models/cluster_test.rb
Normal file
|
@ -0,0 +1,36 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'test_helper'
|
||||
require 'concurrent/set'
|
||||
|
||||
class ClusterTest < ActiveSupport::TestCase
|
||||
test 'Cluster has instance record of all cluster' do
|
||||
assert_equal 0, Cluster.list.size, 'starts off empty'
|
||||
Cluster.new('foo')
|
||||
Cluster.new('bar')
|
||||
assert_equal 2, Cluster.list.size, 'Increases as more are added'
|
||||
end
|
||||
|
||||
test 'cluster are addressable by the UUID' do
|
||||
Cluster.new('bar')
|
||||
cluster = Cluster.new('foo')
|
||||
assert_equal cluster, Cluster.get(cluster.uuid)
|
||||
end
|
||||
|
||||
test 'works' do
|
||||
cluster = Cluster.new('foo')
|
||||
cluster.increment
|
||||
assert_equal 1, cluster.count
|
||||
cluster.decrement
|
||||
assert_equal 0, cluster.count
|
||||
end
|
||||
|
||||
test 'is thread safe' do
|
||||
cluster = Cluster.new('foo')
|
||||
threads = []
|
||||
(1..500).each { |_x| threads << Thread.new { cluster.increment } }
|
||||
threads.each(&:join)
|
||||
|
||||
assert_equal 500, cluster.count
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user