Class: FC::Policy

Inherits:
DbBase show all
Defined in:
lib/fc/policy.rb

Class Attribute Summary collapse

Attributes inherited from DbBase

#additional_fields, #database_fields, #id

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from DbBase

apply!, create_from_fiels, #delete, #dump, find, #initialize, #load, #reload, #save, set_table, where

Constructor Details

This class inherits a constructor from FC::DbBase

Class Attribute Details

.get_create_storages_mutexObject

Returns the value of attribute get_create_storages_mutex.



8
9
10
# File 'lib/fc/policy.rb', line 8

def get_create_storages_mutex
  @get_create_storages_mutex
end

.storages_cache_timeObject

Returns the value of attribute storages_cache_time.



8
9
10
# File 'lib/fc/policy.rb', line 8

def storages_cache_time
  @storages_cache_time
end

Class Method Details

.filter_by_host(host = nil) ⇒ Object



13
14
15
16
17
18
# File 'lib/fc/policy.rb', line 13

def self.filter_by_host(host = nil)
  host = FC::Storage.curr_host unless host
  self.where.select do |policy|
    policy.get_create_storages.detect{|storage| storage.host == host}
  end
end

Instance Method Details

#get_create_storagesObject



20
21
22
23
24
25
26
27
28
29
# File 'lib/fc/policy.rb', line 20

def get_create_storages
  self.class.get_create_storages_mutex.synchronize do
    unless @create_storages_cache && Time.new.to_i - @get_create_storages_time.to_i < self.class.storages_cache_time
      @get_create_storages_time = Time.new.to_i
      names = create_storages.to_s.split(',').map{|s| "'#{s}'"}.join(',')
      @create_storages_cache = names.empty? ? [] : FC::Storage.where("name IN (#{names}) ORDER BY FIELD(name, #{names})")
    end
  end
  @create_storages_cache
end

#get_proper_storage_for_create(size, local_path = nil) ⇒ Object

get available storage for create by size and local item path



32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/fc/policy.rb', line 32

def get_proper_storage_for_create(size, local_path = nil)
  FC::Storage.select_proper_storage_for_create(get_create_storages, size) do |storages|
    local_storages = storages.select{|storage| FC::Storage.curr_host == storage.host}
    # find same storage device as local_path device
    if local_path && !local_storages.empty?
      dev = File.stat(local_path).dev
      dev_storage = local_storages.select{|storage| dev == File.stat(storage.path).dev}.first
      local_storages = [dev_storage] if dev_storage
    end
    # if no local storages - use all storages
    local_storages = storages if local_storages.empty?
    local_storages
  end
end