Class: Unleash::ToggleFetcher

Inherits:
Object
  • Object
show all
Defined in:
lib/unleash/toggle_fetcher.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeToggleFetcher

Returns a new instance of ToggleFetcher.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/unleash/toggle_fetcher.rb', line 12

def initialize
  self.etag = nil
  self.toggle_cache = nil
  self.toggle_lock = Mutex.new
  self.toggle_resource = ConditionVariable.new
  self.retry_count = 0

  # start by fetching synchronously, and failing back to reading the backup file.
  begin
    fetch
  rescue Exception => e
    Unleash.logger.warn "ToggleFetcher was unable to fetch from the network, attempting to read from backup file."
    read!
    raise e
  end

  # once we have initialized, start the fetcher loop
  scheduledExecutor = Unleash::ScheduledExecutor.new('ToggleFetcher', Unleash.configuration.refresh_interval)
  scheduledExecutor.run { remote_toggles = fetch() }
end

Instance Attribute Details

#etagObject

Returns the value of attribute etag.



10
11
12
# File 'lib/unleash/toggle_fetcher.rb', line 10

def etag
  @etag
end

#retry_countObject

Returns the value of attribute retry_count.



10
11
12
# File 'lib/unleash/toggle_fetcher.rb', line 10

def retry_count
  @retry_count
end

#toggle_cacheObject

Returns the value of attribute toggle_cache.



10
11
12
# File 'lib/unleash/toggle_fetcher.rb', line 10

def toggle_cache
  @toggle_cache
end

#toggle_lockObject

Returns the value of attribute toggle_lock.



10
11
12
# File 'lib/unleash/toggle_fetcher.rb', line 10

def toggle_lock
  @toggle_lock
end

#toggle_resourceObject

Returns the value of attribute toggle_resource.



10
11
12
# File 'lib/unleash/toggle_fetcher.rb', line 10

def toggle_resource
  @toggle_resource
end

Instance Method Details

#fetchObject

rename to refresh_from_server! ??

Raises:

  • (IOError)


42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/unleash/toggle_fetcher.rb', line 42

def fetch
  Unleash.logger.debug "fetch()"
  Unleash.logger.debug "ETag: #{self.etag}" unless self.etag.nil?

  uri = URI(Unleash.configuration.fetch_toggles_url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.open_timeout = Unleash.configuration.timeout # in seconds
  http.read_timeout = Unleash.configuration.timeout # in seconds
  request = Net::HTTP::Get.new(uri.request_uri)
  request['If-None-Match'] = self.etag unless self.etag.nil?

  response = http.request(request)

  Unleash.logger.debug "No changes according to the unleash server, nothing to do." if response.code == '304'
  return if response.code == '304'

  raise IOError, "Unleash server returned a non 200/304 HTTP result." if response.code != '200'

  self.etag = response['ETag']
  response_hash = JSON.parse(response.body)

  if response_hash['version'] == 1
    features = response_hash['features']
  else
    raise NotImplemented, "Version of features provided by unleash server" \
      " is unsupported by this client."
  end

  # always synchronize with the local cache when fetching:
  synchronize_with_local_cache!(features)

  Unleash.logger.info "Flush changes to running client variable"
  update_client!

  Unleash.logger.info "Saved to toggle cache, will save to disk now"
  save!
end

#togglesObject



33
34
35
36
37
38
39
# File 'lib/unleash/toggle_fetcher.rb', line 33

def toggles
  self.toggle_lock.synchronize do
    # wait for resource, only if it is null
    self.toggle_resource.wait(self.toggle_lock) if self.toggle_cache.nil?
    return self.toggle_cache
  end
end