filecluster 0.2.9 → 0.3.0
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.
- 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
         
     |