filecluster 0.3.12 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -43,7 +43,12 @@ module FC
43
43
  puts "Deadlock"
44
44
  sleep 0.1
45
45
  self.query(sql)
46
- else
46
+ elsif e.message.match('Lost connection to MySQL server during query')
47
+ puts "Lost connection to MySQL server during query"
48
+ FC::DB.connect.ping
49
+ sleep 0.1
50
+ self.query(sql)
51
+ else
47
52
  raise e
48
53
  end
49
54
  end
@@ -26,7 +26,7 @@ module FC
26
26
 
27
27
  if local_path.include?(item_name) && !options[:not_local]
28
28
  storage = policy.get_create_storages.detect do |s|
29
- s.host == FC::Storage.curr_host && local_path.index(s.path) == 0 && local_path.sub(s.path, '') == item_params[:name]
29
+ s.host == FC::Storage.curr_host && local_path.index(s.path) == 0 && local_path.sub(s.path, '').sub(/\/$/, '').sub(/^\//, '') == item_params[:name]
30
30
  end
31
31
  FC::Error.raise "local_path #{local_path} is not valid path for policy ##{policy.id}" unless storage
32
32
  end
@@ -48,8 +48,8 @@ module FC
48
48
  if storage
49
49
  item_storage = item.make_item_storage(storage, 'ready')
50
50
  item.reload
51
- else
52
- storage = policy.get_proper_storage_for_create(item.size)
51
+ else
52
+ storage = policy.get_proper_storage_for_create(item.size, File.realdirpath(local_path))
53
53
  FC::Error.raise 'No available storage', :item_id => item.id unless storage
54
54
 
55
55
  # mark delete item_storages on replace
@@ -35,9 +35,27 @@ module FC
35
35
  end
36
36
  end
37
37
 
38
- # get available storage for create by size
39
- def get_proper_storage_for_create(size, exclude = [])
40
- get_proper_storages_for_create(size, exclude).first
38
+ # get available storage for create by size and local item path
39
+ def get_proper_storage_for_create(size, local_path = nil)
40
+ storages = get_proper_storages_for_create(size)
41
+ # sort by current_host and free size
42
+ storages.sort do |a, b|
43
+ if FC::Storage.curr_host == a.host && FC::Storage.curr_host == b.host
44
+ if local_path && local_path.index(a.path) == 0
45
+ 1
46
+ elsif local_path && local_path.index(b.path) == 0
47
+ -1
48
+ else
49
+ a.free_rate <=> b.free_rate
50
+ end
51
+ elsif FC::Storage.curr_host == a.host
52
+ 1
53
+ elsif FC::Storage.curr_host == b.host
54
+ -1
55
+ else
56
+ a.free_rate <=> b.free_rate
57
+ end
58
+ end.last
41
59
  end
42
60
  end
43
61
  end
@@ -26,6 +26,18 @@ module FC
26
26
  super params
27
27
  end
28
28
 
29
+ def free
30
+ size_limit - size
31
+ end
32
+
33
+ def size_rate
34
+ size.to_f / size_limit
35
+ end
36
+
37
+ def free_rate
38
+ free.to_f / size_limit
39
+ end
40
+
29
41
  def get_copy_storages
30
42
  self.class.get_copy_storages_mutex.synchronize do
31
43
  unless @copy_storages_cache && Time.new.to_i - @get_copy_storages_time.to_i < self.class.storages_cache_time
@@ -1,3 +1,3 @@
1
1
  module FC
2
- VERSION = "0.3.12"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -8,6 +8,7 @@ def storages_list
8
8
  else
9
9
  storages.each do |storage|
10
10
  str = "#{colorize_string(storage.host, :yellow)} #{storage.name} #{size_to_human(storage.size)}/#{size_to_human(storage.size_limit)} "
11
+ str += "#{(storage.free_rate*100).to_i}% free "
11
12
  str += "#{storage.up? ? colorize_string('UP', :green) : colorize_string('DOWN', :red)}"
12
13
  str += " #{storage.check_time_delay} seconds ago" if storage.check_time
13
14
  puts str
@@ -23,7 +24,8 @@ def storages_show
23
24
  Host: #{storage.host}
24
25
  Path: #{storage.path}
25
26
  Url: #{storage.url}
26
- Size: #{size_to_human storage.size}
27
+ Size: #{size_to_human storage.size} (#{(storage.size_rate*100).to_i}%)
28
+ Free: #{size_to_human storage.free} (#{(storage.free_rate*100).to_i}%)
27
29
  Size limit: #{size_to_human storage.size_limit}
28
30
  Copy storages: #{storage.copy_storages}
29
31
  Check time: #{storage.check_time ? "#{Time.at(storage.check_time)} (#{storage.check_time_delay} seconds ago)" : ''}
@@ -53,12 +55,14 @@ def storages_add
53
55
  puts "Error: #{e.message}"
54
56
  exit
55
57
  end
58
+ free = size_limit - size
56
59
  puts %Q{\nStorage
57
60
  Name: #{name}
58
61
  Host: #{host}
59
62
  Path: #{path}
60
63
  Url: #{url}
61
- Size: #{size_to_human size}
64
+ Size: #{size_to_human size} (#{(size.to_f*100 / size_limit).to_i}%)
65
+ Free: #{size_to_human free} (#{(free.to_f*100 / size_limit).to_i}%)
62
66
  Size limit: #{size_to_human size_limit}
63
67
  Copy storages #{copy_storages}}
64
68
  s = Readline.readline("Continue? (y/n) ", false).strip.downcase
@@ -135,7 +139,8 @@ def storages_change
135
139
  Host: #{storage.host}
136
140
  Path: #{storage.path}
137
141
  Url: #{storage.url}
138
- Size: #{size_to_human storage.size}
142
+ Size: #{size_to_human storage.size} (#{(storage.size_rate*100).to_i}%)
143
+ Free: #{size_to_human storage.free} (#{(storage.free_rate*100).to_i}%)
139
144
  Size limit: #{size_to_human storage.size_limit}
140
145
  Copy storages: #{storage.copy_storages}}
141
146
  s = Readline.readline("Continue? (y/n) ", false).strip.downcase
@@ -16,11 +16,11 @@ class FunctionalTest < Test::Unit::TestCase
16
16
  `cp #{@@test_file_path.shellescape} #{@@test_dir_path.shellescape}/bbb/test2`
17
17
 
18
18
  @@storages = []
19
- @@storages << FC::Storage.new(:name => 'host1-sda', :host => 'host1', :path => '/tmp/host1-sda/', :size_limit => 1000000, :check_time => Time.new.to_i)
20
- @@storages << FC::Storage.new(:name => 'host1-sdb', :host => 'host1', :path => '/tmp/host1-sdb/', :size_limit => 1000000, :check_time => Time.new.to_i)
21
- @@storages << FC::Storage.new(:name => 'host2-sda', :host => 'host2', :path => '/tmp/host2-sda/', :size_limit => 1000000, :check_time => Time.new.to_i)
22
- @@storages << FC::Storage.new(:name => 'host2-sdb', :host => 'host2', :path => '/tmp/host2-sdb/', :size_limit => 1000000, :check_time => Time.new.to_i)
23
- @@storages << FC::Storage.new(:name => 'host3-sda', :host => 'host3', :path => '/tmp/host3-sda/', :size_limit => 1000000)
19
+ @@storages << FC::Storage.new(:name => 'host1-sda', :host => 'host1', :path => '/tmp/host1-sda/', :size => 0, :size_limit => 1000000, :check_time => Time.new.to_i)
20
+ @@storages << FC::Storage.new(:name => 'host1-sdb', :host => 'host1', :path => '/tmp/host1-sdb/', :size => 0, :size_limit => 1000000, :check_time => Time.new.to_i)
21
+ @@storages << FC::Storage.new(:name => 'host2-sda', :host => 'host2', :path => '/tmp/host2-sda/', :size => 10, :size_limit => 1000000, :check_time => Time.new.to_i)
22
+ @@storages << FC::Storage.new(:name => 'host2-sdb', :host => 'host2', :path => '/tmp/host2-sdb/', :size => 10, :size_limit => 1000000, :check_time => Time.new.to_i)
23
+ @@storages << FC::Storage.new(:name => 'host3-sda', :host => 'host3', :path => '/tmp/host3-sda/', :size => 100, :size_limit => 1000000)
24
24
  @@storages.each { |storage| storage.save}
25
25
 
26
26
  @@policies = []
@@ -113,6 +113,13 @@ class FunctionalTest < Test::Unit::TestCase
113
113
  should "item create_from_local inplace" do
114
114
  tmp_file_path = "/tmp/host2-sda/inplace test"
115
115
  `cp #{@@test_file_path.shellescape} #{tmp_file_path.shellescape}`
116
- assert_nothing_raised { @item = FC::Item.create_from_local(tmp_file_path, 'inplace test', @@policies[0]) }
116
+ assert_nothing_raised { FC::Item.create_from_local(tmp_file_path, 'inplace test', @@policies[0]) }
117
+ end
118
+
119
+ should "item create_from_local inplace for dir" do
120
+ tmp_dir_path = "/tmp/host2-sda/inplace test dir/"
121
+ `mkdir #{tmp_dir_path.shellescape}`
122
+ `cp #{@@test_file_path.shellescape} #{tmp_dir_path.shellescape}`
123
+ assert_nothing_raised { FC::Item.create_from_local(tmp_dir_path, '/inplace test dir/', @@policies[0]) }
117
124
  end
118
125
  end
@@ -4,14 +4,16 @@ class PolicyTest < Test::Unit::TestCase
4
4
  class << self
5
5
  def startup
6
6
  @@storages = []
7
- @@storages << FC::Storage.new(:name => 'rec1-sda', :host => 'rec1', :size => 0, :size_limit => 10)
8
- @@storages << FC::Storage.new(:name => 'rec2-sda', :host => 'rec2', :size => 0, :size_limit => 100)
9
- @@storages << FC::Storage.new(:name => 'rec2-sdb', :host => 'rec2', :size => 0, :size_limit => 100)
7
+ @@storages << FC::Storage.new(:name => 'rec1-sda', :host => 'rec1', :path => '/tmp/host1-sda/', :size => 0, :size_limit => 10)
8
+ @@storages << FC::Storage.new(:name => 'rec1-sdb', :host => 'rec1', :path => '/tmp/host1-sdb/', :size => 0, :size_limit => 10)
9
+ @@storages << FC::Storage.new(:name => 'rec2-sda', :host => 'rec2', :path => '/tmp/host2-sda/', :size => 30, :size_limit => 100)
10
+ @@storages << FC::Storage.new(:name => 'rec2-sdb', :host => 'rec2', :path => '/tmp/host2-sdb/', :size => 20, :size_limit => 100)
11
+ @@storages << FC::Storage.new(:name => 'rec2-sdc', :host => 'rec2', :path => '/tmp/host2-sdc/', :size => 10, :size_limit => 100)
12
+ @@storages << FC::Storage.new(:name => 'rec3-sda', :host => 'rec3', :path => '/tmp/host3-sda/', :size => 99, :size_limit => 1000)
13
+ @@storages << FC::Storage.new(:name => 'rec3-sdb', :host => 'rec3', :path => '/tmp/host3-sdb/', :size => 199, :size_limit => 1000)
10
14
  @@storages.each {|storage| storage.save}
11
- @@storage3 = FC::Storage.new(:name => 'rec3-sda', :host => 'rec3', :size => 8, :size_limit => 10)
12
- @@storage3.save
13
-
14
- @@policy = FC::Policy.new(:create_storages => 'rec1-sda,rec2-sda,rec2-sdb', :copies => 1, :name => 'policy 1')
15
+
16
+ @@policy = FC::Policy.new(:create_storages => 'rec1-sda,rec2-sda,rec2-sdb,rec2-sdc,rec3-sda,rec3-sdb', :copies => 1, :name => 'policy 1')
15
17
  @@policy.save
16
18
  end
17
19
  def shutdown
@@ -22,32 +24,50 @@ class PolicyTest < Test::Unit::TestCase
22
24
 
23
25
  should "get_create_storages" do
24
26
  FC::Policy.storages_cache_time = 10
25
- assert_same_elements @@storages.map(&:id), @@policy.get_create_storages.map(&:id)
27
+ assert_equal 6, @@policy.get_create_storages.size
26
28
  @@policy.create_storages = 'rec1-sda,rec2-sda'
27
29
  @@policy.save
28
- assert_equal @@storages.size, @@policy.get_create_storages.size
30
+ assert_equal 6, @@policy.get_create_storages.size
29
31
  FC::Policy.storages_cache_time = 0
30
32
  assert_equal 2, @@policy.get_create_storages.size
33
+ @@policy.create_storages = 'rec1-sda,rec2-sda,rec2-sdb,rec2-sdc,rec3-sda,rec3-sdb'
34
+ @@policy.save
35
+ end
36
+
37
+ should "filter_by_host" do
38
+ FC::Storage.stubs(:curr_host).returns('rec2')
39
+ FC::Policy.new(:create_storages => 'rec3-sda,rec2-sda', :copy_storages => 'rec1-sda,rec2-sda', :copies => 1, :name => 'policy 2').save
40
+ FC::Policy.new(:create_storages => 'rec1-sda,rec3-sda', :copy_storages => 'rec1-sda,rec2-sda', :copies => 1, :name => 'policy 3').save
41
+ assert_same_elements ['policy 1', 'policy 2'], FC::Policy.filter_by_host.map{|p| p.name}
31
42
  end
32
43
 
33
44
  should "get_proper_storage_for_create" do
34
- @@storages.each {|storage| storage.check_time = 0; storage.save}
35
- @@storage3.check_time = 0
36
- @@storage3.save
37
45
  FC::Policy.storages_cache_time = 0
46
+ @@storages.each {|storage| storage.check_time = 0; storage.save}
38
47
  assert_nil @@policy.get_proper_storage_for_create(1), 'all storages down'
39
48
  @@storages[0].update_check_time
40
- assert_equal @@storages[0].id, @@policy.get_proper_storage_for_create(5).id, 'first storages up'
49
+ assert_kind_of FC::Storage, @@policy.get_proper_storage_for_create(5), 'first storages up'
50
+ assert_equal 'rec1-sda', @@policy.get_proper_storage_for_create(5).name, 'first storages up'
41
51
  assert_nil @@policy.get_proper_storage_for_create(20), 'first storage full'
42
- @@storages[1].update_check_time
43
- assert_equal @@storages[1].id, @@policy.get_proper_storage_for_create(20).id, 'second storages up'
52
+ @@storages[2].update_check_time
53
+ assert_equal 'rec2-sda', @@policy.get_proper_storage_for_create(20).name, 'second storages up'
44
54
  assert_nil @@policy.get_proper_storage_for_create(1000), 'all storages full'
45
55
  end
46
56
 
47
- should "filter_by_host" do
57
+ should "get_proper_storage_for_create for local path" do
58
+ FC::Policy.storages_cache_time = 0
59
+ @@storages.each {|storage| storage.update_check_time}
48
60
  FC::Storage.stubs(:curr_host).returns('rec2')
49
- FC::Policy.new(:create_storages => 'rec3-sda,rec2-sda', :copy_storages => 'rec1-sda,rec2-sda', :copies => 1, :name => 'policy 2').save
50
- FC::Policy.new(:create_storages => 'rec1-sda,rec3-sda', :copy_storages => 'rec1-sda,rec2-sda', :copies => 1, :name => 'policy 3').save
51
- assert_same_elements ['policy 1', 'policy 2'], FC::Policy.filter_by_host.map{|p| p.name}
61
+ assert_equal 'rec2-sdb', @@policy.get_proper_storage_for_create(9, '/tmp/host2-sdb/test').name, 'current host, local path match'
62
+ @@storages[3].check_time = 0;
63
+ @@storages[3].save
64
+ assert_equal 'rec2-sdc', @@policy.get_proper_storage_for_create(9, '/tmp/host2-sdb/test').name, 'current host, most free storage'
65
+ FC::Storage.stubs(:curr_host).returns('rec3')
66
+ @@storages[5].check_time = 0;
67
+ @@storages[5].save
68
+ assert_equal 'rec3-sdb', @@policy.get_proper_storage_for_create(9, '/tmp/host3-sdc/test').name, 'current host, single storage'
69
+ FC::Storage.stubs(:curr_host).returns('rec5')
70
+ assert_equal 'rec1-sda', @@policy.get_proper_storage_for_create(9, '/tmp/host3-sdc/test').name, 'not current host, most free storage'
71
+ assert_equal 'rec2-sdc', @@policy.get_proper_storage_for_create(10, '/tmp/host3-sdc/test').name, 'not current host, big file, most free storage with free space'
52
72
  end
53
- end
73
+ end
@@ -69,4 +69,12 @@ class StorageTest < Test::Unit::TestCase
69
69
  assert_equal 'rec2-sda', @@storages[2].get_proper_storage_for_copy(20).name, 'second storages up, big file'
70
70
  assert_nil @@storages[2].get_proper_storage_for_copy(1000), 'second storages up, huge file'
71
71
  end
72
+
73
+ should "free and rate" do
74
+ storage = @@storages[0]
75
+ storage.size = 1
76
+ assert_equal 9, storage.free, 'first storage free must be size_limit - size'
77
+ assert_equal 9.to_f/10, storage.free_rate, 'first storage free_rate must be free/size_limit'
78
+ assert_equal 1.to_f/10, storage.size_rate, 'first storage free must be size/size_limit'
79
+ end
72
80
  end
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.3.12
4
+ version: 0.4.0
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: 2014-09-18 00:00:00.000000000 Z
12
+ date: 2014-11-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mysql2
@@ -181,7 +181,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
181
  version: '0'
182
182
  segments:
183
183
  - 0
184
- hash: -2800763299588068596
184
+ hash: -1129513891376945174
185
185
  required_rubygems_version: !ruby/object:Gem::Requirement
186
186
  none: false
187
187
  requirements:
@@ -190,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
190
  version: '0'
191
191
  segments:
192
192
  - 0
193
- hash: -2800763299588068596
193
+ hash: -1129513891376945174
194
194
  requirements: []
195
195
  rubyforge_project:
196
196
  rubygems_version: 1.8.24