filecluster 0.2.9 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/lib/daemon/global_daemon_thread.rb +4 -4
- data/lib/fc/db.rb +6 -13
- data/lib/fc/policy.rb +4 -37
- data/lib/fc/storage.rb +22 -2
- data/lib/fc/version.rb +1 -1
- data/lib/manage/policies.rb +2 -10
- data/lib/manage/storages.rb +41 -28
- data/test/daemon_test.rb +5 -5
- data/test/db_test.rb +5 -13
- data/test/policy_test.rb +5 -51
- data/test/{storage_sync.rb → storage_sync_test.rb} +9 -5
- data/test/storage_test.rb +45 -1
- metadata +6 -6
data/README.md
CHANGED
@@ -31,7 +31,7 @@ Selecting available storage to store item by policy.create_storages (from left t
|
|
31
31
|
|
32
32
|
## Copy policy
|
33
33
|
|
34
|
-
Selecting available storage to copy item by
|
34
|
+
Selecting available storage to copy item by storage.copy_storages (from left to right).
|
35
35
|
|
36
36
|
## Variables
|
37
37
|
|
@@ -30,11 +30,11 @@ class GlobalDaemonThread < BaseThread
|
|
30
30
|
all_policies = FC::Policy.where
|
31
31
|
|
32
32
|
# policies.get_storages => all_policies.select
|
33
|
-
|
34
|
-
metaclass = class <<
|
33
|
+
all_storages.each do |storage|
|
34
|
+
metaclass = class << storage; self; end
|
35
35
|
metaclass.send(:define_method, :get_copy_storages) do
|
36
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} }
|
37
|
+
@copy_storages_cache ||= self.copy_storages.to_s.split(',').map{|storage_name| all_storages.detect{|s| storage_name == s.name} }
|
38
38
|
end
|
39
39
|
@copy_storages_cache
|
40
40
|
end
|
@@ -57,7 +57,7 @@ class GlobalDaemonThread < BaseThread
|
|
57
57
|
$log.warn("GlobalDaemonThread: ItemStorage count >= policy.copies for item #{row['item_id']}")
|
58
58
|
else
|
59
59
|
src_storage = all_storages.detect{|s| item_storages.first == s.name}
|
60
|
-
storage =
|
60
|
+
storage = src_storage.get_proper_storage_for_copy(row['size'], item_storages) if src_storage
|
61
61
|
if storage
|
62
62
|
FC::Item.new(:id => row['item_id']).make_item_storage(storage, 'copy')
|
63
63
|
else
|
data/lib/fc/db.rb
CHANGED
@@ -85,21 +85,17 @@ module FC
|
|
85
85
|
size bigint NOT NULL DEFAULT 0,
|
86
86
|
size_limit bigint NOT NULL DEFAULT 0,
|
87
87
|
check_time int DEFAULT NULL,
|
88
|
-
|
88
|
+
copy_storages text NOT NULL DEFAULT '',
|
89
89
|
PRIMARY KEY (id), UNIQUE KEY (name), KEY (host)
|
90
90
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
|
91
91
|
})
|
92
92
|
proc = %{
|
93
|
-
# update policy.create_storages
|
93
|
+
# update policy.create_storages on storage delete and update
|
94
94
|
UPDATE #{@prefix}policies,
|
95
95
|
(SELECT #{@prefix}policies.id, GROUP_CONCAT(#{@prefix}storages.name ORDER BY FIND_IN_SET(#{@prefix}storages.name, create_storages)) as storages FROM #{@prefix}policies LEFT JOIN #{@prefix}storages ON
|
96
|
-
FIND_IN_SET(#{@prefix}storages.name, create_storages) GROUP BY #{@prefix}policies.id) as policy_create
|
97
|
-
|
98
|
-
|
99
|
-
SET
|
100
|
-
#{@prefix}policies.create_storages = policy_create.storages,
|
101
|
-
#{@prefix}policies.copy_storages = policy_copy.storages
|
102
|
-
WHERE policy_create.id = #{@prefix}policies.id AND policy_copy.id = #{@prefix}policies.id;
|
96
|
+
FIND_IN_SET(#{@prefix}storages.name, create_storages) GROUP BY #{@prefix}policies.id) as policy_create
|
97
|
+
SET #{@prefix}policies.create_storages = policy_create.storages
|
98
|
+
WHERE policy_create.id = #{@prefix}policies.id;
|
103
99
|
}
|
104
100
|
proc_update = %{
|
105
101
|
IF OLD.name <> NEW.name THEN
|
@@ -114,17 +110,14 @@ module FC
|
|
114
110
|
id int NOT NULL AUTO_INCREMENT,
|
115
111
|
name varchar(255) NOT NULL DEFAULT '',
|
116
112
|
create_storages text NOT NULL DEFAULT '',
|
117
|
-
copy_storages text NOT NULL DEFAULT '',
|
118
113
|
copies int NOT NULL DEFAULT 0,
|
119
114
|
PRIMARY KEY (id), UNIQUE KEY (name)
|
120
115
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
|
121
116
|
})
|
122
117
|
proc = %{
|
123
|
-
# update policy.create_storages
|
118
|
+
# update policy.create_storages on policy change - guarantee valid policy.storages
|
124
119
|
SELECT GROUP_CONCAT(name ORDER BY FIND_IN_SET(name, NEW.create_storages)) INTO @create_storages_list FROM #{@prefix}storages WHERE FIND_IN_SET(name, NEW.create_storages);
|
125
|
-
SELECT GROUP_CONCAT(name ORDER BY FIND_IN_SET(name, NEW.copy_storages)) INTO @copy_storages_list FROM #{@prefix}storages WHERE FIND_IN_SET(name, NEW.copy_storages);
|
126
120
|
SET NEW.create_storages = @create_storages_list;
|
127
|
-
SET NEW.copy_storages = @copy_storages_list;
|
128
121
|
}
|
129
122
|
FC::DB.connect.query("CREATE TRIGGER fc_policies_before_insert BEFORE INSERT on #{@prefix}policies FOR EACH ROW BEGIN #{proc} END")
|
130
123
|
FC::DB.connect.query("CREATE TRIGGER fc_policies_before_update BEFORE UPDATE on #{@prefix}policies FOR EACH ROW BEGIN #{proc} END")
|
data/lib/fc/policy.rb
CHANGED
@@ -2,14 +2,13 @@
|
|
2
2
|
|
3
3
|
module FC
|
4
4
|
class Policy < DbBase
|
5
|
-
set_table :policies, 'name, create_storages,
|
5
|
+
set_table :policies, 'name, create_storages, copies'
|
6
6
|
|
7
7
|
class << self
|
8
|
-
attr_accessor :storages_cache_time, :get_create_storages_mutex
|
8
|
+
attr_accessor :storages_cache_time, :get_create_storages_mutex
|
9
9
|
end
|
10
10
|
@storages_cache_time = 20 # ttl for storages cache
|
11
11
|
@get_create_storages_mutex = Mutex.new
|
12
|
-
@get_copy_storages_mutex = Mutex.new
|
13
12
|
|
14
13
|
def self.filter_by_host(host = nil)
|
15
14
|
host = FC::Storage.curr_host unless host
|
@@ -22,50 +21,18 @@ module FC
|
|
22
21
|
self.class.get_create_storages_mutex.synchronize do
|
23
22
|
unless @create_storages_cache && Time.new.to_i - @get_create_storages_time.to_i < self.class.storages_cache_time
|
24
23
|
@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})")
|
24
|
+
names = create_storages.to_s.split(',').map{|s| "'#{s}'"}.join(',')
|
25
|
+
@create_storages_cache = names.empty? ? [] : FC::Storage.where("name IN (#{names}) ORDER BY FIELD(name, #{names})")
|
27
26
|
end
|
28
27
|
end
|
29
28
|
@create_storages_cache
|
30
29
|
end
|
31
30
|
|
32
|
-
def get_copy_storages
|
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
|
41
|
-
end
|
42
|
-
|
43
31
|
# get available storage for create by size
|
44
32
|
def get_proper_storage_for_create(size, exclude = [])
|
45
33
|
get_create_storages.detect do |storage|
|
46
34
|
!exclude.include?(storage.name) && storage.up? && storage.size + size < storage.size_limit
|
47
35
|
end
|
48
36
|
end
|
49
|
-
|
50
|
-
# get available storage for copy by copy_id and size
|
51
|
-
def get_proper_storage_for_copy(size, copy_id = nil, exclude = [])
|
52
|
-
storages = get_copy_storages
|
53
|
-
storage_index = 0
|
54
|
-
storage_host = nil
|
55
|
-
while s = storages[storage_index]
|
56
|
-
if copy_id.to_i == s.copy_id.to_i && !exclude.include?(s.name)
|
57
|
-
storage_index -= 1 while storage_index > 0 && storages[storage_index-1].host == s.host
|
58
|
-
storage_host = s.host
|
59
|
-
break
|
60
|
-
end
|
61
|
-
storage_index += 1
|
62
|
-
end
|
63
|
-
storages = (storages[storage_index..-1]+storages[0..storage_index-1]).select do |s|
|
64
|
-
!exclude.include?(s.name) && s.up? && s.size + size < s.size_limit
|
65
|
-
end
|
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
|
68
|
-
storage
|
69
|
-
end
|
70
37
|
end
|
71
38
|
end
|
data/lib/fc/storage.rb
CHANGED
@@ -3,12 +3,14 @@ require 'shellwords'
|
|
3
3
|
|
4
4
|
module FC
|
5
5
|
class Storage < DbBase
|
6
|
-
set_table :storages, 'name, host, path, url, size, size_limit, check_time,
|
6
|
+
set_table :storages, 'name, host, path, url, size, size_limit, check_time, copy_storages'
|
7
7
|
|
8
8
|
class << self
|
9
|
-
attr_accessor :check_time_limit
|
9
|
+
attr_accessor :check_time_limit, :storages_cache_time, :get_copy_storages_mutex
|
10
10
|
end
|
11
11
|
@check_time_limit = 120 # ttl for up status check
|
12
|
+
@storages_cache_time = 20 # ttl for storages cache
|
13
|
+
@get_copy_storages_mutex = Mutex.new
|
12
14
|
|
13
15
|
def self.curr_host
|
14
16
|
@uname || @uname = `uname -n`.chomp
|
@@ -24,6 +26,17 @@ module FC
|
|
24
26
|
super params
|
25
27
|
end
|
26
28
|
|
29
|
+
def get_copy_storages
|
30
|
+
self.class.get_copy_storages_mutex.synchronize do
|
31
|
+
unless @copy_storages_cache && Time.new.to_i - @get_copy_storages_time.to_i < self.class.storages_cache_time
|
32
|
+
@get_copy_storages_time = Time.new.to_i
|
33
|
+
names = copy_storages.to_s.split(',').map{|s| "'#{s}'"}.join(',')
|
34
|
+
@copy_storages_cache = names.empty? ? [] : FC::Storage.where("name IN (#{names}) ORDER BY FIELD(name, #{names})")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
@copy_storages_cache
|
38
|
+
end
|
39
|
+
|
27
40
|
def update_check_time
|
28
41
|
self.check_time = Time.new.to_i
|
29
42
|
save
|
@@ -94,5 +107,12 @@ module FC
|
|
94
107
|
raise r if $?.exitstatus != 0
|
95
108
|
r.to_i
|
96
109
|
end
|
110
|
+
|
111
|
+
# get available storage for copy by size
|
112
|
+
def get_proper_storage_for_copy(size, exclude = [])
|
113
|
+
get_copy_storages.select do |storage|
|
114
|
+
!exclude.include?(storage.name) && storage.up? && storage.size + size < storage.size_limit
|
115
|
+
end.first
|
116
|
+
end
|
97
117
|
end
|
98
118
|
end
|
data/lib/fc/version.rb
CHANGED
data/lib/manage/policies.rb
CHANGED
@@ -4,7 +4,7 @@ def policies_list
|
|
4
4
|
puts "No storages."
|
5
5
|
else
|
6
6
|
policies.each do |policy|
|
7
|
-
puts "##{policy.id} #{policy.name}, create storages: #{policy.create_storages},
|
7
|
+
puts "##{policy.id} #{policy.name}, create storages: #{policy.create_storages}, copies: #{policy.copies}"
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -16,7 +16,6 @@ def policies_show
|
|
16
16
|
ID: #{policy.id}
|
17
17
|
Name: #{policy.name}
|
18
18
|
Create storages: #{policy.create_storages}
|
19
|
-
Copy storages: #{policy.copy_storages}
|
20
19
|
Copies: #{policy.copies}
|
21
20
|
Items: #{count}}
|
22
21
|
end
|
@@ -26,15 +25,13 @@ def policies_add
|
|
26
25
|
puts "Add Policy"
|
27
26
|
name = stdin_read_val('Name')
|
28
27
|
create_storages = stdin_read_val('Create storages')
|
29
|
-
copy_storages = stdin_read_val('Copy storages')
|
30
28
|
copies = stdin_read_val('Copies').to_i
|
31
29
|
|
32
30
|
storages = FC::Storage.where.map(&:name)
|
33
31
|
create_storages = create_storages.split(',').select{|s| storages.member?(s.strip)}.join(',').strip
|
34
|
-
copy_storages = copy_storages.split(',').select{|s| storages.member?(s.strip)}.join(',').strip
|
35
32
|
|
36
33
|
begin
|
37
|
-
policy = FC::Policy.new(:name => name, :create_storages => create_storages, :
|
34
|
+
policy = FC::Policy.new(:name => name, :create_storages => create_storages, :copies => copies)
|
38
35
|
rescue Exception => e
|
39
36
|
puts "Error: #{e.message}"
|
40
37
|
exit
|
@@ -42,7 +39,6 @@ def policies_add
|
|
42
39
|
puts %Q{\nPolicy
|
43
40
|
Name: #{name}
|
44
41
|
Create storages: #{create_storages}
|
45
|
-
Copy storages: #{copy_storages}
|
46
42
|
Copies: #{copies}}
|
47
43
|
s = Readline.readline("Continue? (y/n) ", false).strip.downcase
|
48
44
|
puts ""
|
@@ -77,22 +73,18 @@ def policies_change
|
|
77
73
|
puts "Change policy ##{policy.id} #{policy.name}"
|
78
74
|
name = stdin_read_val("Name (now #{policy.name})", true)
|
79
75
|
create_storages = stdin_read_val("Create storages (now #{policy.create_storages})", true)
|
80
|
-
copy_storages = stdin_read_val("Copy storages (now #{policy.copy_storages})", true)
|
81
76
|
copies = stdin_read_val("Copies (now #{policy.copies})", true)
|
82
77
|
|
83
78
|
storages = FC::Storage.where.map(&:name)
|
84
79
|
create_storages = create_storages.split(',').select{|s| storages.member?(s.strip)}.join(',').strip unless create_storages.empty?
|
85
|
-
copy_storages = copy_storages.split(',').select{|s| storages.member?(s.strip)}.join(',').strip unless copy_storages.empty?
|
86
80
|
|
87
81
|
policy.name = name unless name.empty?
|
88
82
|
policy.create_storages = create_storages unless create_storages.empty?
|
89
|
-
policy.copy_storages = copy_storages unless copy_storages.empty?
|
90
83
|
policy.copies = copies.to_i unless copies.empty?
|
91
84
|
|
92
85
|
puts %Q{\nStorage
|
93
86
|
Name: #{policy.name}
|
94
87
|
Create storages: #{policy.create_storages}
|
95
|
-
Copy storages: #{policy.copy_storages}
|
96
88
|
Copies: #{policy.copies}}
|
97
89
|
s = Readline.readline("Continue? (y/n) ", false).strip.downcase
|
98
90
|
puts ""
|
data/lib/manage/storages.rb
CHANGED
@@ -25,7 +25,7 @@ def storages_show
|
|
25
25
|
Url: #{storage.url}
|
26
26
|
Size: #{size_to_human storage.size}
|
27
27
|
Size limit: #{size_to_human storage.size_limit}
|
28
|
-
Copy
|
28
|
+
Copy storages: #{storage.copy_storages}
|
29
29
|
Check time: #{storage.check_time ? "#{Time.at(storage.check_time)} (#{storage.check_time_delay} seconds ago)" : ''}
|
30
30
|
Status: #{storage.up? ? colorize_string('UP', :green) : colorize_string('DOWN', :red)}
|
31
31
|
Items storages: #{count}}
|
@@ -39,11 +39,13 @@ def storages_add
|
|
39
39
|
path = stdin_read_val('Path')
|
40
40
|
url = stdin_read_val('Url')
|
41
41
|
size_limit = human_to_size stdin_read_val('Size limit') {|val| "Size limit not is valid size." unless human_to_size(val)}
|
42
|
-
|
42
|
+
copy_storages = stdin_read_val('Copy storages')
|
43
|
+
storages = FC::Storage.where.map(&:name)
|
44
|
+
copy_storages = copy_storages.split(',').select{|s| storages.member?(s.strip)}.join(',').strip
|
43
45
|
begin
|
44
46
|
path = path +'/' unless path[-1] == '/'
|
45
47
|
path = '/' + path unless path[0] == '/'
|
46
|
-
storage = FC::Storage.new(:name => name, :host => host, :path => path, :url => url, :size_limit => size_limit, :
|
48
|
+
storage = FC::Storage.new(:name => name, :host => host, :path => path, :url => url, :size_limit => size_limit, :copy_storages => copy_storages)
|
47
49
|
print "Calc current size.. "
|
48
50
|
size = storage.file_size('', true)
|
49
51
|
puts "ok"
|
@@ -52,13 +54,13 @@ def storages_add
|
|
52
54
|
exit
|
53
55
|
end
|
54
56
|
puts %Q{\nStorage
|
55
|
-
Name:
|
56
|
-
Host:
|
57
|
-
Path:
|
58
|
-
Url:
|
59
|
-
Size:
|
60
|
-
Size limit:
|
61
|
-
Copy
|
57
|
+
Name: #{name}
|
58
|
+
Host: #{host}
|
59
|
+
Path: #{path}
|
60
|
+
Url: #{url}
|
61
|
+
Size: #{size_to_human size}
|
62
|
+
Size limit: #{size_to_human size_limit}
|
63
|
+
Copy storages #{copy_storages}}
|
62
64
|
s = Readline.readline("Continue? (y/n) ", false).strip.downcase
|
63
65
|
puts ""
|
64
66
|
if s == "y" || s == "yes"
|
@@ -90,9 +92,11 @@ end
|
|
90
92
|
|
91
93
|
def storages_update_size
|
92
94
|
if storage = find_storage
|
95
|
+
FC::DB.close
|
93
96
|
print "Calc current size.. "
|
94
97
|
size = storage.file_size('', true)
|
95
98
|
storage.size = size
|
99
|
+
FC::DB.connect
|
96
100
|
begin
|
97
101
|
storage.save
|
98
102
|
rescue Exception => e
|
@@ -110,7 +114,7 @@ def storages_change
|
|
110
114
|
path = stdin_read_val("Path (now #{storage.path})", true)
|
111
115
|
url = stdin_read_val("Url (now #{storage.url})", true)
|
112
116
|
size_limit = stdin_read_val("Size (now #{size_to_human(storage.size_limit)})", true) {|val| "Size limit not is valid size." if !val.empty? && !human_to_size(val)}
|
113
|
-
|
117
|
+
copy_storages = stdin_read_val("Copy storages (now #{storage.copy_storages})", true)
|
114
118
|
|
115
119
|
storage.host = host unless host.empty?
|
116
120
|
if !path.empty? && path != storage.path
|
@@ -123,16 +127,17 @@ def storages_change
|
|
123
127
|
end
|
124
128
|
storage.url = url unless url.empty?
|
125
129
|
storage.size_limit = human_to_size(size_limit) unless size_limit.empty?
|
126
|
-
|
130
|
+
storages = FC::Storage.where.map(&:name)
|
131
|
+
copy_storages = copy_storages.split(',').select{|s| storages.member?(s.strip)}.join(',').strip unless copy_storages.empty?
|
127
132
|
|
128
133
|
puts %Q{\nStorage
|
129
|
-
Name:
|
130
|
-
Host:
|
131
|
-
Path:
|
132
|
-
Url:
|
133
|
-
Size:
|
134
|
-
Size limit:
|
135
|
-
Copy
|
134
|
+
Name: #{storage.name}
|
135
|
+
Host: #{storage.host}
|
136
|
+
Path: #{storage.path}
|
137
|
+
Url: #{storage.url}
|
138
|
+
Size: #{size_to_human storage.size}
|
139
|
+
Size limit: #{size_to_human storage.size_limit}
|
140
|
+
Copy storages: #{copy_storages}}
|
136
141
|
s = Readline.readline("Continue? (y/n) ", false).strip.downcase
|
137
142
|
puts ""
|
138
143
|
if s == "y" || s == "yes"
|
@@ -167,6 +172,7 @@ def storages_sync
|
|
167
172
|
if s == "y" || s == "yes"
|
168
173
|
make_storages_sync(storage, true)
|
169
174
|
puts "Synchronize done."
|
175
|
+
FC::DB.connect
|
170
176
|
storages_update_size
|
171
177
|
else
|
172
178
|
puts "Canceled."
|
@@ -183,27 +189,30 @@ def find_storage
|
|
183
189
|
storage
|
184
190
|
end
|
185
191
|
|
186
|
-
def make_storages_sync(storage, make_delete, silent = false)
|
192
|
+
def make_storages_sync(storage, make_delete, silent = false, no_reconnect = false)
|
187
193
|
# get all items for storage
|
194
|
+
puts "Getting all items from DB" unless silent
|
188
195
|
db_items = {}
|
189
|
-
FC::DB.query("SELECT i.name, ist.id FROM #{FC::Item.table_name} as i, #{FC::ItemStorage.table_name} as ist WHERE ist.item_id = i.id AND ist.storage_name = '#{storage.name}'").each do |row|
|
196
|
+
FC::DB.query("SELECT i.name, ist.id, ist.status FROM #{FC::Item.table_name} as i, #{FC::ItemStorage.table_name} as ist WHERE ist.item_id = i.id AND ist.storage_name = '#{storage.name}'").each do |row|
|
190
197
|
name = row['name'].sub(/\/$/, '').sub(/^\//, '').strip
|
191
198
|
path = ''
|
192
199
|
name.split('/').each do |dir|
|
193
200
|
path << dir
|
194
|
-
db_items[path] = [false, path == name ? row['id'].to_i : nil]
|
201
|
+
db_items[path] = [false, path == name ? row['id'].to_i : nil, row['status']]
|
195
202
|
path << '/'
|
196
203
|
end
|
197
204
|
end
|
205
|
+
FC::DB.close unless no_reconnect
|
198
206
|
|
199
207
|
# walk on all storage folders and files
|
208
|
+
puts "Getting all files" unless silent
|
200
209
|
delete_files = []
|
201
210
|
process_storage_dir_sync = lambda do |dir = ''|
|
202
211
|
Dir.glob(storage.path+dir+'*').each do |f|
|
203
212
|
path = f.sub(storage.path, '')
|
204
213
|
if db_items[path]
|
205
214
|
db_items[path][0] = true
|
206
|
-
next if db_items[path][1]
|
215
|
+
next if db_items[path][1] && db_items[path][2] != 'delete'
|
207
216
|
end
|
208
217
|
delete_files << path if File.file?(f)
|
209
218
|
process_storage_dir_sync.call(path+'/') if File.directory?(f)
|
@@ -212,24 +221,28 @@ def make_storages_sync(storage, make_delete, silent = false)
|
|
212
221
|
process_storage_dir_sync.call
|
213
222
|
|
214
223
|
# rm delete_files
|
224
|
+
FC::DB.connect unless no_reconnect
|
215
225
|
if make_delete
|
226
|
+
puts "Deleting files" unless silent
|
216
227
|
delete_files.each do |f|
|
217
228
|
# check in DB again
|
218
|
-
next if FC::DB.query("SELECT ist.id FROM #{FC::Item.table_name} as i, #{FC::ItemStorage.table_name} as ist WHERE ist.item_id = i.id AND ist.storage_name = '#{storage.name}' AND i.name='#{f}'").first
|
229
|
+
next if FC::DB.query("SELECT ist.id FROM #{FC::Item.table_name} as i, #{FC::ItemStorage.table_name} as ist WHERE ist.item_id = i.id AND ist.storage_name = '#{storage.name}' AND i.name='#{f}' AND ist.status<>'delete'").first
|
219
230
|
path = storage.path+f
|
220
231
|
File.delete(path) rescue nil
|
221
232
|
end
|
233
|
+
puts "Deleted #{delete_files.count} files" unless silent
|
222
234
|
end
|
223
|
-
puts "Deleted #{delete_files.count} files" unless silent
|
224
235
|
|
225
236
|
# delete non synchronize items_storages
|
237
|
+
puts "Deleting items from DB" unless silent
|
226
238
|
count = 0
|
227
239
|
db_items.values.each do |item|
|
228
|
-
if !item[0] && item[1]
|
240
|
+
if !item[0] && item[1] || item[2] == 'delete' && item[1]
|
229
241
|
count += 1
|
230
242
|
FC::DB.query("DELETE FROM #{FC::ItemStorage.table_name} WHERE id=#{item[1]}") if make_delete
|
231
243
|
end
|
232
244
|
end
|
245
|
+
FC::DB.close unless no_reconnect
|
233
246
|
puts "Deleted #{count} items_storages" unless silent
|
234
247
|
|
235
248
|
# delete empty folders
|
@@ -249,9 +262,9 @@ def make_storages_sync(storage, make_delete, silent = false)
|
|
249
262
|
if (ARGV[4])
|
250
263
|
File.open(ARGV[4], 'w') do |file|
|
251
264
|
db_items.values.each do |item|
|
252
|
-
file.puts item[1] if !item[0] && item[1]
|
265
|
+
file.puts item[1] if !item[0] && item[1] || item[2] == 'delete' && item[1]
|
253
266
|
end
|
254
267
|
end
|
255
268
|
puts "Save deleted items_storages to #{ARGV[4]}" unless silent
|
256
269
|
end
|
257
|
-
end
|
270
|
+
end
|
data/test/daemon_test.rb
CHANGED
@@ -45,12 +45,12 @@ class DaemonTest < Test::Unit::TestCase
|
|
45
45
|
`cp #{@@test_file_path} #{@@test_dir_path}/bbb/test2`
|
46
46
|
|
47
47
|
@@storages = []
|
48
|
-
@@storages << FC::Storage.new(:name => 'host1-sda', :host => 'host1', :path => '/tmp/host1-sda/', :
|
49
|
-
@@storages << FC::Storage.new(:name => 'host1-sdb', :host => 'host1', :path => '/tmp/host1-sdb/', :
|
50
|
-
@@storages << FC::Storage.new(:name => 'host1-sdc', :host => 'host1', :path => '/tmp/host1-sdc/', :
|
48
|
+
@@storages << FC::Storage.new(:name => 'host1-sda', :host => 'host1', :path => '/tmp/host1-sda/', :copy_storages => 'host1-sdb,host1-sdc', :size_limit => 1000000000)
|
49
|
+
@@storages << FC::Storage.new(:name => 'host1-sdb', :host => 'host1', :path => '/tmp/host1-sdb/', :copy_storages => 'host1-sda,host1-sdc', :size_limit => 1000000000)
|
50
|
+
@@storages << FC::Storage.new(:name => 'host1-sdc', :host => 'host1', :path => '/tmp/host1-sdc/', :copy_storages => 'host1-sda,host1-sdb', :size_limit => 1000000000)
|
51
51
|
@@storages.each { |storage| storage.save}
|
52
52
|
|
53
|
-
@@policy = FC::Policy.new(:create_storages => 'host1-sda,host1-sdb,host1-sdc', :
|
53
|
+
@@policy = FC::Policy.new(:create_storages => 'host1-sda,host1-sdb,host1-sdc', :copies => 2, :name => 'policy 1')
|
54
54
|
@@policy.save
|
55
55
|
|
56
56
|
# wait for running fc-daemon
|
@@ -72,7 +72,7 @@ class DaemonTest < Test::Unit::TestCase
|
|
72
72
|
`rm -rf #{@@test_dir_path}`
|
73
73
|
end
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
should "daemon_all" do
|
77
77
|
@@storages.each {|storage| storage.reload}
|
78
78
|
assert @@storages[0].up?, "Storage #{@@storages[0].name} down"
|
data/test/db_test.rb
CHANGED
@@ -15,9 +15,9 @@ class DbTest < Test::Unit::TestCase
|
|
15
15
|
@@storages_ids = storages.map{|storage| storage.save; storage.id }
|
16
16
|
|
17
17
|
policies = []
|
18
|
-
policies << FC::Policy.new(:create_storages => 'rec1-sda,rec1-sdd', :
|
19
|
-
policies << FC::Policy.new(:create_storages => 'rec1-sda,bla,rec2-sdd', :
|
20
|
-
policies << FC::Policy.new(:create_storages => 'bla,rec1-sda,test', :
|
18
|
+
policies << FC::Policy.new(:create_storages => 'rec1-sda,rec1-sdd', :copies => 2, :name => 'policy 1')
|
19
|
+
policies << FC::Policy.new(:create_storages => 'rec1-sda,bla,rec2-sdd', :copies => 3, :name => 'policy 2')
|
20
|
+
policies << FC::Policy.new(:create_storages => 'bla,rec1-sda,test', :copies => 4, :name => 'policy 3')
|
21
21
|
@@policies_ids = policies.map{|policy| policy.save; policy.id }
|
22
22
|
|
23
23
|
items = []
|
@@ -78,13 +78,9 @@ class DbTest < Test::Unit::TestCase
|
|
78
78
|
assert_equal 'rec1-sda,rec1-sdd', @policies[0].create_storages, "Policy (id=#{@policies[0].id}) incorrect create_storages"
|
79
79
|
assert_equal 'rec1-sda,rec2-sdd', @policies[1].create_storages, "Policy (id=#{@policies[0].id}) incorrect create_storages"
|
80
80
|
assert_equal 'rec1-sda', @policies[2].create_storages, "Policy (id=#{@policies[0].id}) incorrect create_storages"
|
81
|
-
assert_equal 'rec2-sda,rec2-sdd', @policies[0].copy_storages, "Policy (id=#{@policies[0].id}) incorrect copy_storages"
|
82
|
-
assert_equal 'rec2-sda,rec1-sdd', @policies[1].copy_storages, "Policy (id=#{@policies[0].id}) incorrect copy_storages"
|
83
|
-
assert_equal 'rec2-sda', @policies[2].copy_storages, "Policy (id=#{@policies[0].id}) incorrect copy_storages"
|
84
81
|
|
85
|
-
assert_raise(Mysql2::Error, 'Create policy with uniq name') { FC::Policy.new(:create_storages => 'bla,test', :
|
86
|
-
assert_raise(Mysql2::Error, 'Create policy with incorrect create_storages') { FC::Policy.new(:create_storages => 'bla,test', :
|
87
|
-
assert_raise(Mysql2::Error, 'Create policy with incorrect copy_storages') { FC::Policy.new(:create_storages => 'rec1-sda', :copy_storages => 'bla,test', :name => 'new policy').save }
|
82
|
+
assert_raise(Mysql2::Error, 'Create policy with uniq name') { FC::Policy.new(:create_storages => 'bla,test', :name => 'policy 1').save }
|
83
|
+
assert_raise(Mysql2::Error, 'Create policy with incorrect create_storages') { FC::Policy.new(:create_storages => 'bla,test', :name => 'new policy').save }
|
88
84
|
|
89
85
|
assert_raise(Mysql2::Error, 'Change storage name with linked polices') { @storages[0].name = 'blabla'; @storages[0].save }
|
90
86
|
assert_raise(Mysql2::Error, 'Delete storage name with linked polices') { @storages[0].delete }
|
@@ -94,19 +90,15 @@ class DbTest < Test::Unit::TestCase
|
|
94
90
|
@policies[0].reload
|
95
91
|
@policies[1].reload
|
96
92
|
assert_equal 'rec1-sda', @policies[0].create_storages, "Policy (id=#{@policies[0].id}) incorrect create_storages after storage change"
|
97
|
-
assert_equal 'rec2-sda', @policies[1].copy_storages, "Policy (id=#{@policies[1].id}) incorrect copy_storages after storage change"
|
98
93
|
@storages[7].delete #rec2-sdd
|
99
94
|
@@storages_ids.delete(@storages[7].id)
|
100
95
|
@policies[0].reload
|
101
96
|
@policies[1].reload
|
102
97
|
assert_equal 'rec1-sda', @policies[1].create_storages, "Policy (id=#{@policies[1].id}) incorrect create_storages after storage delete"
|
103
|
-
assert_equal 'rec2-sda', @policies[0].copy_storages, "Policy (id=#{@policies[0].id}) incorrect copy_storages after storage delete"
|
104
98
|
@policies[0].create_storages = 'rec2-sda,rec1-sda,bla bla'
|
105
|
-
@policies[0].copy_storages = 'rec1-sdb,rec2-sda,bla bla'
|
106
99
|
@policies[0].save
|
107
100
|
@policies[0].reload
|
108
101
|
assert_equal 'rec2-sda,rec1-sda', @policies[0].create_storages, "Policy (id=#{@policies[0].id}) incorrect create_storages after change"
|
109
|
-
assert_equal 'rec1-sdb,rec2-sda', @policies[0].copy_storages, "Policy (id=#{@policies[0].id}) incorrect copy_storages after change"
|
110
102
|
assert_raise(Mysql2::Error, 'Save empty policy storage') { @policies[0].create_storages = 'blabla'; @policies[0].save }
|
111
103
|
end
|
112
104
|
|
data/test/policy_test.rb
CHANGED
@@ -4,14 +4,14 @@ 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, :
|
8
|
-
@@storages << FC::Storage.new(:name => 'rec2-sda', :host => 'rec2', :size => 0, :
|
9
|
-
@@storages << FC::Storage.new(:name => 'rec2-sdb', :host => 'rec2', :size => 0, :
|
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)
|
10
10
|
@@storages.each {|storage| storage.save}
|
11
|
-
@@storage3 = FC::Storage.new(:name => 'rec3-sda', :host => 'rec3', :size => 8, :
|
11
|
+
@@storage3 = FC::Storage.new(:name => 'rec3-sda', :host => 'rec3', :size => 8, :size_limit => 10)
|
12
12
|
@@storage3.save
|
13
13
|
|
14
|
-
@@policy = FC::Policy.new(:create_storages => 'rec1-sda,rec2-sda,rec2-sdb', :
|
14
|
+
@@policy = FC::Policy.new(:create_storages => 'rec1-sda,rec2-sda,rec2-sdb', :copies => 1, :name => 'policy 1')
|
15
15
|
@@policy.save
|
16
16
|
end
|
17
17
|
def shutdown
|
@@ -30,18 +30,6 @@ class PolicyTest < Test::Unit::TestCase
|
|
30
30
|
assert_equal 2, @@policy.get_create_storages.size
|
31
31
|
end
|
32
32
|
|
33
|
-
should "get_copy_storages" do
|
34
|
-
@@policy.copy_storages = 'rec1-sda,rec2-sda,rec2-sdb'
|
35
|
-
@@policy.save
|
36
|
-
FC::Policy.storages_cache_time = 10
|
37
|
-
assert_same_elements @@storages.map(&:id), @@policy.get_copy_storages.map(&:id)
|
38
|
-
@@policy.copy_storages = 'rec1-sda,rec2-sda'
|
39
|
-
@@policy.save
|
40
|
-
assert_equal @@storages.size, @@policy.get_copy_storages.size
|
41
|
-
FC::Policy.storages_cache_time = 0
|
42
|
-
assert_equal 2, @@policy.get_copy_storages.size
|
43
|
-
end
|
44
|
-
|
45
33
|
should "get_proper_storage_for_create" do
|
46
34
|
@@storages.each {|storage| storage.check_time = 0; storage.save}
|
47
35
|
@@storage3.check_time = 0
|
@@ -56,40 +44,6 @@ class PolicyTest < Test::Unit::TestCase
|
|
56
44
|
assert_nil @@policy.get_proper_storage_for_create(1000), 'all storages full'
|
57
45
|
end
|
58
46
|
|
59
|
-
should "get_proper_storage_for_copy" do
|
60
|
-
@@storages.each {|storage| storage.check_time = 0; storage.save}
|
61
|
-
FC::Policy.storages_cache_time = 0
|
62
|
-
assert_nil @@policy.get_proper_storage_for_copy(1), 'all storages down'
|
63
|
-
@@storages[0].update_check_time
|
64
|
-
@@storage3.update_check_time
|
65
|
-
assert_equal @@storages[0].id, @@policy.get_proper_storage_for_copy(5).id, 'first storages up'
|
66
|
-
assert_nil @@policy.get_proper_storage_for_copy(20), 'first storage full'
|
67
|
-
@@storages[1].update_check_time
|
68
|
-
assert_equal @@storages[1].id, @@policy.get_proper_storage_for_copy(20).id, 'second storages up'
|
69
|
-
assert_nil @@policy.get_proper_storage_for_copy(1000), 'all storages full'
|
70
|
-
|
71
|
-
@@policy.copy_storages = 'rec3-sda,rec1-sda,rec2-sda'
|
72
|
-
@@policy.save
|
73
|
-
assert_equal 'rec1-sda', @@policy.get_proper_storage_for_copy(1).name, 'storage with min copy_id in copy_storages'
|
74
|
-
assert_equal 'rec2-sda', @@policy.get_proper_storage_for_copy(1, 2).name, 'storage by copy_id'
|
75
|
-
@@policy.copy_storages = 'rec1-sda,rec3-sda'
|
76
|
-
@@policy.save
|
77
|
-
assert_equal 'rec1-sda', @@policy.get_proper_storage_for_copy(1, 2).name, 'storage by copy_id'
|
78
|
-
@@policy.copy_storages = 'rec3-sda,rec1-sda,rec2-sda,rec2-sdb'
|
79
|
-
@@policy.save
|
80
|
-
assert_equal 'rec2-sda', @@policy.get_proper_storage_for_copy(1, 4).name, 'storage by copy_id'
|
81
|
-
@@policy.copy_storages = 'rec2-sda,rec3-sda,rec1-sda,rec2-sdb'
|
82
|
-
@@policy.save
|
83
|
-
@@storages[2].update_check_time
|
84
|
-
assert_equal 'rec2-sdb', @@policy.get_proper_storage_for_copy(1, 4).name, 'storage by copy_id'
|
85
|
-
|
86
|
-
@@policy.copy_storages = 'rec3-sda,rec1-sda,rec2-sda'
|
87
|
-
@@policy.save
|
88
|
-
@@storages[0].check_time = 0
|
89
|
-
@@storages[0].save
|
90
|
-
assert_equal 'rec2-sda', @@policy.get_proper_storage_for_copy(1, 1).name, 'storage by copy_id'
|
91
|
-
end
|
92
|
-
|
93
47
|
should "filter_by_host" do
|
94
48
|
FC::Storage.stubs(:curr_host).returns('rec2')
|
95
49
|
FC::Policy.new(:create_storages => 'rec3-sda,rec2-sda', :copy_storages => 'rec1-sda,rec2-sda', :copies => 1, :name => 'policy 2').save
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'helper'
|
2
2
|
require 'manage'
|
3
3
|
|
4
|
-
class
|
4
|
+
class StorageSyncTest < Test::Unit::TestCase
|
5
5
|
class << self
|
6
6
|
def startup
|
7
7
|
# tmp fake storage dir
|
@@ -12,9 +12,9 @@ class DaemonTest < Test::Unit::TestCase
|
|
12
12
|
@@test_file_path = '/tmp/fc_test_file'
|
13
13
|
`dd if=/dev/urandom of=#{@@test_file_path} bs=1M count=1 2>&1`
|
14
14
|
|
15
|
-
@@storage = FC::Storage.new(:name => 'host1-sda', :host => 'host1', :path => '/tmp/host1-sda/', :
|
15
|
+
@@storage = FC::Storage.new(:name => 'host1-sda', :host => 'host1', :path => '/tmp/host1-sda/', :size_limit => 1000000000, :check_time => Time.new.to_i)
|
16
16
|
@@storage.save
|
17
|
-
@@policy = FC::Policy.new(:create_storages => 'host1-sda', :
|
17
|
+
@@policy = FC::Policy.new(:create_storages => 'host1-sda', :copies => 1, :name => 'policy 1')
|
18
18
|
@@policy.save
|
19
19
|
end
|
20
20
|
|
@@ -38,13 +38,15 @@ class DaemonTest < Test::Unit::TestCase
|
|
38
38
|
assert_nothing_raised { @item2 = FC::Item.create_from_local(@@test_file_path, 'a/b/test2', @@policy, {:tag => 'test'}) }
|
39
39
|
assert_nothing_raised { @item3 = FC::Item.create_from_local(@@test_file_path, 'a/b/c/test3', @@policy, {:tag => 'test'}) }
|
40
40
|
assert_nothing_raised { @item4 = FC::Item.create_from_local(@@test_file_path, 'a/b/c/d/test4', @@policy, {:tag => 'test'}) }
|
41
|
+
assert_nothing_raised { @item5 = FC::Item.create_from_local(@@test_file_path, 'a/del_file', @@policy, {:tag => 'test'}) }
|
42
|
+
@item5.mark_deleted
|
41
43
|
`mv /tmp/host1-sda/a/test1 /tmp/host1-sda/test1`
|
42
44
|
`mv /tmp/host1-sda/a/b/c/d/test4 /tmp/host1-sda/a/b/c/d/test5`
|
43
45
|
`mkdir /tmp/host1-sda/test_dir`
|
44
46
|
`cp #{@@test_file_path} /tmp/host1-sda/test_dir/t1`
|
45
47
|
`cp #{@@test_file_path} /tmp/host1-sda/test_dir/t2`
|
46
48
|
|
47
|
-
make_storages_sync(@@storage, true, true)
|
49
|
+
make_storages_sync(@@storage, true, true, true)
|
48
50
|
|
49
51
|
@item1.reload
|
50
52
|
@item2.reload
|
@@ -60,6 +62,8 @@ class DaemonTest < Test::Unit::TestCase
|
|
60
62
|
assert_equal size, `du -sb /tmp/host1-sda/a/b/c/test3 2>&1`.to_i
|
61
63
|
assert_equal 0, `du -sb /tmp/host1-sda/a/b/c/d/test5 2>&1`.to_i
|
62
64
|
assert_equal 0, `du -sb /tmp/host1-sda/a/b/c/d 2>&1`.to_i
|
63
|
-
assert_equal 0, `du -sb tmp/host1-sda/test_dir 2>&1`.to_i
|
65
|
+
assert_equal 0, `du -sb /tmp/host1-sda/test_dir 2>&1`.to_i
|
66
|
+
assert_equal 0, @item5.get_item_storages.size
|
67
|
+
assert_equal 0, `du -sb /tmp/host1-sda/a/del_file 2>&1`.to_i
|
64
68
|
end
|
65
69
|
end
|
data/test/storage_test.rb
CHANGED
@@ -1,6 +1,24 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class StorageTest < Test::Unit::TestCase
|
4
|
+
class << self
|
5
|
+
def startup
|
6
|
+
@@storages = []
|
7
|
+
@@storages << FC::Storage.new(:name => 'rec1-sda', :host => 'rec1', :size => 0, :copy_storages => 'rec2-sda,rec3-sda', :size_limit => 10)
|
8
|
+
@@storages << FC::Storage.new(:name => 'rec2-sda', :host => 'rec2', :size => 0, :copy_storages => 'rec1-sda,rec3-sda', :size_limit => 100)
|
9
|
+
@@storages << FC::Storage.new(:name => 'rec3-sda', :host => 'rec3', :size => 8, :copy_storages => 'rec1-sda,rec2-sda', :size_limit => 10)
|
10
|
+
@@storages << FC::Storage.new(:name => 'rec2-sdb', :host => 'rec2', :size => 0, :size_limit => 100)
|
11
|
+
@@storages.each {|storage| storage.save}
|
12
|
+
|
13
|
+
@@policy = FC::Policy.new(:create_storages => 'rec1-sda,rec2-sda,rec2-sdb', :copies => 1, :name => 'policy 1')
|
14
|
+
@@policy.save
|
15
|
+
end
|
16
|
+
def shutdown
|
17
|
+
FC::DB.query("DELETE FROM policies")
|
18
|
+
FC::DB.query("DELETE FROM storages")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
4
22
|
should "curr_host" do
|
5
23
|
assert ! FC::Storage.curr_host.to_s.empty?
|
6
24
|
end
|
@@ -12,7 +30,7 @@ class StorageTest < Test::Unit::TestCase
|
|
12
30
|
end
|
13
31
|
|
14
32
|
should "update_check_time and up?" do
|
15
|
-
storage = FC::Storage.new(:name => 'rec1-
|
33
|
+
storage = FC::Storage.new(:name => 'rec1-test', :host => 'rec1')
|
16
34
|
storage.save
|
17
35
|
assert_equal false, storage.up?
|
18
36
|
storage.update_check_time
|
@@ -25,4 +43,30 @@ class StorageTest < Test::Unit::TestCase
|
|
25
43
|
storage.delete
|
26
44
|
end
|
27
45
|
|
46
|
+
should "get_copy_storages" do
|
47
|
+
@@storages[2].copy_storages = 'rec1-sda,rec2-sda,rec2-sdb'
|
48
|
+
@@storages[2].save
|
49
|
+
FC::Storage.storages_cache_time = 10
|
50
|
+
assert_equal 'rec1-sda,rec2-sda,rec2-sdb', @@storages[2].get_copy_storages.map(&:name).join(',')
|
51
|
+
@@storages[2].copy_storages = 'rec1-sda,rec2-sda'
|
52
|
+
@@storages[2].save
|
53
|
+
assert_equal 'rec1-sda,rec2-sda,rec2-sdb', @@storages[2].get_copy_storages.map(&:name).join(',')
|
54
|
+
FC::Storage.storages_cache_time = 0
|
55
|
+
assert_equal 'rec1-sda,rec2-sda', @@storages[2].get_copy_storages.map(&:name).join(',')
|
56
|
+
end
|
57
|
+
|
58
|
+
should "get_proper_storage_for_copy" do
|
59
|
+
@@storages.each {|storage| storage.check_time = 0; storage.save}
|
60
|
+
@@storages[3].update_check_time
|
61
|
+
assert_nil @@storages[3].get_proper_storage_for_copy(1), 'empty copy_storages'
|
62
|
+
assert_nil @@storages[2].get_proper_storage_for_copy(1), 'all storages down'
|
63
|
+
|
64
|
+
@@storages[0].update_check_time
|
65
|
+
assert_equal 'rec1-sda', @@storages[2].get_proper_storage_for_copy(5).name, 'first storages up'
|
66
|
+
assert_nil @@storages[2].get_proper_storage_for_copy(20), 'first storage full'
|
67
|
+
@@storages[1].update_check_time
|
68
|
+
assert_equal 'rec1-sda', @@storages[2].get_proper_storage_for_copy(5).name, 'second storages up, small file'
|
69
|
+
assert_equal 'rec2-sda', @@storages[2].get_proper_storage_for_copy(20).name, 'second storages up, big file'
|
70
|
+
assert_nil @@storages[2].get_proper_storage_for_copy(1000), 'second storages up, huge file'
|
71
|
+
end
|
28
72
|
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.
|
4
|
+
version: 0.3.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: 2013-
|
12
|
+
date: 2013-11-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rb-readline
|
@@ -174,7 +174,7 @@ files:
|
|
174
174
|
- test/helper.rb
|
175
175
|
- test/item_test.rb
|
176
176
|
- test/policy_test.rb
|
177
|
-
- test/
|
177
|
+
- test/storage_sync_test.rb
|
178
178
|
- test/storage_test.rb
|
179
179
|
- test/var_test.rb
|
180
180
|
- test/version_test.rb
|
@@ -192,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
192
192
|
version: '0'
|
193
193
|
segments:
|
194
194
|
- 0
|
195
|
-
hash:
|
195
|
+
hash: 2037414088552914900
|
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:
|
204
|
+
hash: 2037414088552914900
|
205
205
|
requirements: []
|
206
206
|
rubyforge_project:
|
207
207
|
rubygems_version: 1.8.24
|
@@ -217,7 +217,7 @@ test_files:
|
|
217
217
|
- test/helper.rb
|
218
218
|
- test/item_test.rb
|
219
219
|
- test/policy_test.rb
|
220
|
-
- test/
|
220
|
+
- test/storage_sync_test.rb
|
221
221
|
- test/storage_test.rb
|
222
222
|
- test/var_test.rb
|
223
223
|
- test/version_test.rb
|