filecluster 0.2.5 → 0.2.6

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.
@@ -33,7 +33,10 @@ class GlobalDaemonThread < BaseThread
33
33
  all_policies.each do |policy|
34
34
  metaclass = class << policy; self; end
35
35
  metaclass.send(:define_method, :get_copy_storages) do
36
- @copy_storages_cache ||= self.copy_storages.split(',').map{|storage_name| all_storages.detect{|s| storage_name == s.name} }
36
+ self.class.get_copy_storages_mutex.synchronize do
37
+ @copy_storages_cache ||= self.copy_storages.split(',').map{|storage_name| all_storages.detect{|s| storage_name == s.name} }
38
+ end
39
+ @copy_storages_cache
37
40
  end
38
41
  end
39
42
 
data/lib/fc/policy.rb CHANGED
@@ -5,9 +5,11 @@ module FC
5
5
  set_table :policies, 'name, create_storages, copy_storages, copies'
6
6
 
7
7
  class << self
8
- attr_accessor :storages_cache_time
8
+ attr_accessor :storages_cache_time, :get_create_storages_mutex, :get_copy_storages_mutex
9
9
  end
10
10
  @storages_cache_time = 20 # ttl for storages cache
11
+ @get_create_storages_mutex = Mutex.new
12
+ @get_copy_storages_mutex = Mutex.new
11
13
 
12
14
  def self.filter_by_host(host = nil)
13
15
  host = FC::Storage.curr_host unless host
@@ -17,17 +19,25 @@ module FC
17
19
  end
18
20
 
19
21
  def get_create_storages
20
- return @create_storages_cache if @create_storages_cache && Time.new.to_i - @get_create_storages_time.to_i < self.class.storages_cache_time
21
- @get_create_storages_time = Time.new.to_i
22
- names = create_storages.split(',').map{|s| "'#{s}'"}.join(',')
23
- @create_storages_cache = FC::Storage.where("name IN (#{names}) ORDER BY FIELD(name, #{names})")
22
+ self.class.get_create_storages_mutex.synchronize do
23
+ unless @create_storages_cache && Time.new.to_i - @get_create_storages_time.to_i < self.class.storages_cache_time
24
+ @get_create_storages_time = Time.new.to_i
25
+ names = create_storages.split(',').map{|s| "'#{s}'"}.join(',')
26
+ @create_storages_cache = FC::Storage.where("name IN (#{names}) ORDER BY FIELD(name, #{names})")
27
+ end
28
+ end
29
+ @create_storages_cache
24
30
  end
25
31
 
26
32
  def get_copy_storages
27
- return @copy_storages_cache if @copy_storages_cache && Time.new.to_i - @get_copy_storages_time.to_i < self.class.storages_cache_time
28
- @get_copy_storages_time = Time.new.to_i
29
- names = copy_storages.split(',').map{|s| "'#{s}'"}.join(',')
30
- @copy_storages_cache = FC::Storage.where("name IN (#{names}) ORDER BY FIELD(name, #{names})")
33
+ self.class.get_copy_storages_mutex.synchronize do
34
+ unless @copy_storages_cache && Time.new.to_i - @get_copy_storages_time.to_i < self.class.storages_cache_time
35
+ @get_copy_storages_time = Time.new.to_i
36
+ names = copy_storages.split(',').map{|s| "'#{s}'"}.join(',')
37
+ @copy_storages_cache = FC::Storage.where("name IN (#{names}) ORDER BY FIELD(name, #{names})")
38
+ end
39
+ end
40
+ @copy_storages_cache
31
41
  end
32
42
 
33
43
  # get available storage for create by size
@@ -53,8 +63,8 @@ module FC
53
63
  storages = (storages[storage_index..-1]+storages[0..storage_index-1]).select do |s|
54
64
  !exclude.include?(s.name) && s.up? && s.size + size < s.size_limit
55
65
  end
56
- storage = storages.select{|s| storage_host == s.host}.sort{|a,b| b.copy_id.to_i <=> a.copy_id.to_i}.first
57
- storage = storages.sort{|a,b| b.copy_id.to_i <=> a.copy_id.to_i}.first unless storage
66
+ storage = storages.select{|s| storage_host == s.host}.sort{|a,b| (copy_id.to_i - a.copy_id.to_i).abs <=> (copy_id.to_i - b.copy_id.to_i).abs}.first
67
+ storage = storages.sort{|a,b| (copy_id.to_i - a.copy_id.to_i).abs <=> (copy_id.to_i - b.copy_id.to_i).abs}.first unless storage
58
68
  storage
59
69
  end
60
70
  end
data/lib/fc/var.rb CHANGED
@@ -5,14 +5,17 @@ module FC
5
5
  class << self
6
6
  attr_accessor :cache_time
7
7
  end
8
+ @mutex = Mutex.new
8
9
  @cache_time = 120 # ttl for get_all
9
10
  @all_vars = {}
10
11
 
11
12
  def self.set(name, val)
12
- FC::DB.query("UPDATE #{FC::DB.prefix}vars SET val='#{Mysql2::Client.escape(val.to_s)}' WHERE name='#{Mysql2::Client.escape(name.to_s)}'")
13
- FC::DB.query("INSERT IGNORE INTO #{FC::DB.prefix}vars SET val='#{Mysql2::Client.escape(val.to_s)}', name='#{Mysql2::Client.escape(name.to_s)}'")
14
- @all_vars[name.to_s] = val.to_s
15
- @all_vars[name.to_sym] = val.to_s
13
+ @mutex.synchronize do
14
+ FC::DB.query("UPDATE #{FC::DB.prefix}vars SET val='#{Mysql2::Client.escape(val.to_s)}' WHERE name='#{Mysql2::Client.escape(name.to_s)}'")
15
+ FC::DB.query("INSERT IGNORE INTO #{FC::DB.prefix}vars SET val='#{Mysql2::Client.escape(val.to_s)}', name='#{Mysql2::Client.escape(name.to_s)}'")
16
+ @all_vars[name.to_s] = val.to_s
17
+ @all_vars[name.to_sym] = val.to_s
18
+ end
16
19
  end
17
20
 
18
21
  def self.get(name, default_value = nil)
@@ -20,13 +23,15 @@ module FC
20
23
  end
21
24
 
22
25
  def self.get_all
23
- if !@get_all_read_time || Time.new.to_i - @get_all_read_time > cache_time
24
- @all_vars = {}
25
- FC::DB.query("SELECT * FROM #{FC::DB.prefix}vars").each do |row|
26
- @all_vars[row['name']] = row['val']
27
- @all_vars[row['name'].to_sym] = row['val']
26
+ @mutex.synchronize do
27
+ if !@get_all_read_time || Time.new.to_i - @get_all_read_time > cache_time
28
+ @all_vars = {}
29
+ FC::DB.query("SELECT * FROM #{FC::DB.prefix}vars").each do |row|
30
+ @all_vars[row['name']] = row['val']
31
+ @all_vars[row['name'].to_sym] = row['val']
32
+ end
33
+ @get_all_read_time = Time.new.to_i
28
34
  end
29
- @get_all_read_time = Time.new.to_i
30
35
  end
31
36
  @all_vars
32
37
  end
data/lib/fc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module FC
2
- VERSION = "0.2.5"
2
+ VERSION = "0.2.6"
3
3
  end
data/test/policy_test.rb CHANGED
@@ -70,11 +70,11 @@ class PolicyTest < Test::Unit::TestCase
70
70
 
71
71
  @@policy.copy_storages = 'rec3-sda,rec1-sda,rec2-sda'
72
72
  @@policy.save
73
- assert_equal 'rec3-sda', @@policy.get_proper_storage_for_copy(1).name, 'first storage in copy_storages'
73
+ assert_equal 'rec1-sda', @@policy.get_proper_storage_for_copy(1).name, 'storage with min copy_id in copy_storages'
74
74
  assert_equal 'rec2-sda', @@policy.get_proper_storage_for_copy(1, 2).name, 'storage by copy_id'
75
75
  @@policy.copy_storages = 'rec1-sda,rec3-sda'
76
76
  @@policy.save
77
- assert_equal 'rec3-sda', @@policy.get_proper_storage_for_copy(1, 2).name, 'storage by copy_id'
77
+ assert_equal 'rec1-sda', @@policy.get_proper_storage_for_copy(1, 2).name, 'storage by copy_id'
78
78
  @@policy.copy_storages = 'rec3-sda,rec1-sda,rec2-sda,rec2-sdb'
79
79
  @@policy.save
80
80
  assert_equal 'rec2-sda', @@policy.get_proper_storage_for_copy(1, 4).name, 'storage by copy_id'
@@ -87,7 +87,7 @@ class PolicyTest < Test::Unit::TestCase
87
87
  @@policy.save
88
88
  @@storages[0].check_time = 0
89
89
  @@storages[0].save
90
- assert_equal 'rec3-sda', @@policy.get_proper_storage_for_copy(1, 1).name, 'storage by copy_id'
90
+ assert_equal 'rec2-sda', @@policy.get_proper_storage_for_copy(1, 1).name, 'storage by copy_id'
91
91
  end
92
92
 
93
93
  should "filter_by_host" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filecluster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-24 00:00:00.000000000 Z
12
+ date: 2013-08-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rb-readline
@@ -192,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
192
192
  version: '0'
193
193
  segments:
194
194
  - 0
195
- hash: -2450197837742993053
195
+ hash: 3411895741076242860
196
196
  required_rubygems_version: !ruby/object:Gem::Requirement
197
197
  none: false
198
198
  requirements:
@@ -201,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
201
  version: '0'
202
202
  segments:
203
203
  - 0
204
- hash: -2450197837742993053
204
+ hash: 3411895741076242860
205
205
  requirements: []
206
206
  rubyforge_project:
207
207
  rubygems_version: 1.8.24