filecluster 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/daemon.rb +2 -1
- data/lib/daemon/task_thread.rb +1 -1
- data/lib/fc/db.rb +2 -5
- data/lib/fc/item.rb +5 -3
- data/lib/fc/policy.rb +7 -1
- data/lib/fc/version.rb +1 -1
- data/test/policy_test.rb +6 -0
- metadata +4 -4
data/lib/daemon.rb
CHANGED
@@ -39,7 +39,8 @@ end
|
|
39
39
|
|
40
40
|
def update_storages
|
41
41
|
$log.debug('Update storages')
|
42
|
-
$
|
42
|
+
$all_storages = FC::Storage.where
|
43
|
+
$storages = $all_storages.select{|s| s.host == FC::Storage.curr_host}
|
43
44
|
end
|
44
45
|
|
45
46
|
def storages_check
|
data/lib/daemon/task_thread.rb
CHANGED
@@ -29,7 +29,7 @@ class TaskThread < BaseThread
|
|
29
29
|
storage = $storages.detect{|s| s.name == item_storage.storage_name}
|
30
30
|
item = FC::Item.find(item_storage.item_id)
|
31
31
|
src_item_storage = FC::ItemStorage.where("item_id = ? AND status = 'ready'", item.id).sample
|
32
|
-
src_storage = $
|
32
|
+
src_storage = $all_storages.detect{|s| s.name == src_item_storage.storage_name}
|
33
33
|
item.copy_item_storage(src_storage, storage, item_storage)
|
34
34
|
rescue Exception => e
|
35
35
|
error "Copy item_storage error: #{e.message}; #{e.backtrace.join(', ')}", :item_id => item_storage.item_id, :item_storage_id => item_storage.id
|
data/lib/fc/db.rb
CHANGED
@@ -21,10 +21,7 @@ module FC
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def self.connect=(connect, options = {})
|
24
|
-
|
25
|
-
@prefix = @options[:prefix].to_s
|
26
|
-
@connects = {}
|
27
|
-
@connects[Thread.current.object_id] = connect
|
24
|
+
self.connect_by_config connect.query_options.merge(options).merge(:as => :hash)
|
28
25
|
end
|
29
26
|
|
30
27
|
def self.close
|
@@ -52,7 +49,7 @@ module FC
|
|
52
49
|
time int DEFAULT NULL,
|
53
50
|
copies int NOT NULL DEFAULT 0,
|
54
51
|
PRIMARY KEY (id), UNIQUE KEY (name(255), policy_id),
|
55
|
-
KEY (outer_id), KEY (time, status), KEY (status),
|
52
|
+
KEY (outer_id), KEY (time, status), KEY (status, policy_id, copies), KEY (copies, status, policy_id)
|
56
53
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
|
57
54
|
})
|
58
55
|
proc_time = %{
|
data/lib/fc/item.rb
CHANGED
@@ -23,16 +23,18 @@ module FC
|
|
23
23
|
raise 'Zero size path' if item_params[:size] == 0
|
24
24
|
|
25
25
|
if local_path.include?(item_name)
|
26
|
-
storage = policy.get_create_storages.detect
|
26
|
+
storage = policy.get_create_storages.detect do |s|
|
27
|
+
s.host == FC::Storage.curr_host && local_path.index(s.path) == 0 && local_path.sub(s.path, '') == item_params[:name]
|
28
|
+
end
|
27
29
|
FC::Error.raise "local_path #{local_path} is not valid path for policy ##{policy.id}" unless storage
|
28
30
|
end
|
29
31
|
|
30
32
|
# new item?
|
31
33
|
item = FC::Item.where('name=? AND policy_id=?', item_params[:name], policy.id).first
|
32
34
|
if item
|
33
|
-
if options[:replace]
|
35
|
+
if options[:replace] || storage
|
34
36
|
# mark delete item_storages on replace
|
35
|
-
FC::DB.connect.query("UPDATE #{FC::ItemStorage.table_name} SET status='delete' WHERE item_id = #{item.id}")
|
37
|
+
FC::DB.connect.query("UPDATE #{FC::ItemStorage.table_name} SET status='delete' WHERE item_id = #{item.id}") if options[:replace] && !storage
|
36
38
|
# replace all fields
|
37
39
|
item_params.each{|key, val| item.send("#{key}=", val)}
|
38
40
|
else
|
data/lib/fc/policy.rb
CHANGED
@@ -32,7 +32,13 @@ module FC
|
|
32
32
|
|
33
33
|
# get available storage for copy by copy_id and size
|
34
34
|
def get_proper_storage_for_copy(size, copy_id = nil, exclude = [])
|
35
|
-
storages = get_copy_storages
|
35
|
+
storages = get_copy_storages
|
36
|
+
start_storage_index = nil
|
37
|
+
storages.each_with_index do |s, i|
|
38
|
+
start_storage_index = i if copy_id.to_i == s.copy_id.to_i
|
39
|
+
end
|
40
|
+
storages = storages[start_storage_index..-1]+storages[0..start_storage_index-1] if storages.size > 0 && start_storage_index
|
41
|
+
storages = storages.select do |storage|
|
36
42
|
!exclude.include?(storage.name) && storage.up? && storage.size + size < storage.size_limit
|
37
43
|
end
|
38
44
|
storage = storages.detect{|s| copy_id.to_i == s.copy_id.to_i}
|
data/lib/fc/version.rb
CHANGED
data/test/policy_test.rb
CHANGED
@@ -77,5 +77,11 @@ class PolicyTest < Test::Unit::TestCase
|
|
77
77
|
@@policy.copy_storages = 'rec2-sda,rec3-sda,rec1-sda'
|
78
78
|
@@policy.save
|
79
79
|
assert_equal 'rec2-sda', @@policy.get_proper_storage_for_copy(1, 4).name, 'storage by copy_id'
|
80
|
+
|
81
|
+
@@policy.copy_storages = 'rec3-sda,rec1-sda,rec2-sda,'
|
82
|
+
@@policy.save
|
83
|
+
@@storages[0].check_time = 0
|
84
|
+
@@storages[0].save
|
85
|
+
assert_equal 'rec2-sda', @@policy.get_proper_storage_for_copy(1, 1).name, 'storage by copy_id'
|
80
86
|
end
|
81
87
|
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.0
|
4
|
+
version: 0.1.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-04-
|
12
|
+
date: 2013-04-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rb-readline
|
@@ -186,7 +186,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
186
186
|
version: '0'
|
187
187
|
segments:
|
188
188
|
- 0
|
189
|
-
hash:
|
189
|
+
hash: 2418971618198205266
|
190
190
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
191
191
|
none: false
|
192
192
|
requirements:
|
@@ -195,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
195
|
version: '0'
|
196
196
|
segments:
|
197
197
|
- 0
|
198
|
-
hash:
|
198
|
+
hash: 2418971618198205266
|
199
199
|
requirements: []
|
200
200
|
rubyforge_project:
|
201
201
|
rubygems_version: 1.8.24
|