Class: Unleash::ToggleFetcher
- Inherits:
-
Object
- Object
- Unleash::ToggleFetcher
- Defined in:
- lib/unleash/toggle_fetcher.rb
Instance Attribute Summary collapse
-
#etag ⇒ Object
Returns the value of attribute etag.
-
#retry_count ⇒ Object
Returns the value of attribute retry_count.
-
#toggle_cache ⇒ Object
Returns the value of attribute toggle_cache.
-
#toggle_lock ⇒ Object
Returns the value of attribute toggle_lock.
-
#toggle_resource ⇒ Object
Returns the value of attribute toggle_resource.
Instance Method Summary collapse
-
#fetch ⇒ Object
rename to refresh_from_server! ?? TODO: should simplify by moving uri / http initialization elsewhere.
-
#initialize ⇒ ToggleFetcher
constructor
A new instance of ToggleFetcher.
- #save! ⇒ Object
- #toggles ⇒ Object
Constructor Details
#initialize ⇒ ToggleFetcher
Returns a new instance of ToggleFetcher.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/unleash/toggle_fetcher.rb', line 11 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." Unleash.logger.debug "Exception Caught: #{e}" read! end # once initialized, somewhere else you will want to start a loop with fetch() end |
Instance Attribute Details
#etag ⇒ Object
Returns the value of attribute etag.
9 10 11 |
# File 'lib/unleash/toggle_fetcher.rb', line 9 def etag @etag end |
#retry_count ⇒ Object
Returns the value of attribute retry_count.
9 10 11 |
# File 'lib/unleash/toggle_fetcher.rb', line 9 def retry_count @retry_count end |
#toggle_cache ⇒ Object
Returns the value of attribute toggle_cache.
9 10 11 |
# File 'lib/unleash/toggle_fetcher.rb', line 9 def toggle_cache @toggle_cache end |
#toggle_lock ⇒ Object
Returns the value of attribute toggle_lock.
9 10 11 |
# File 'lib/unleash/toggle_fetcher.rb', line 9 def toggle_lock @toggle_lock end |
#toggle_resource ⇒ Object
Returns the value of attribute toggle_resource.
9 10 11 |
# File 'lib/unleash/toggle_fetcher.rb', line 9 def toggle_resource @toggle_resource end |
Instance Method Details
#fetch ⇒ Object
rename to refresh_from_server! ?? TODO: should simplify by moving uri / http initialization elsewhere
40 41 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 79 80 81 |
# File 'lib/unleash/toggle_fetcher.rb', line 40 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.use_ssl = true if uri.scheme == 'https' http.open_timeout = Unleash.configuration.timeout # in seconds http.read_timeout = Unleash.configuration.timeout # in seconds headers = (Unleash.configuration.get_http_headers || {}).dup headers['Content-Type'] = 'application/json' headers['If-None-Match'] = self.etag unless self.etag.nil? request = Net::HTTP::Get.new(uri.request_uri, headers) 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 |
#save! ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/unleash/toggle_fetcher.rb', line 83 def save! begin backup_file = Unleash.configuration.backup_file backup_file_tmp = "#{backup_file}.tmp" self.toggle_lock.synchronize do file = File.open(backup_file_tmp, "w") file.write(self.toggle_cache.to_json) File.rename(backup_file_tmp, backup_file) end rescue Exception => e # This is not really the end of the world. Swallowing the exception. Unleash.logger.error "Unable to save backup file. Exception thrown #{e.class}:'#{e}'" Unleash.logger.error "stacktrace: #{e.backtrace}" ensure file.close if defined?(file) && ! file.nil? self.toggle_lock.unlock if self.toggle_lock.locked? end end |
#toggles ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/unleash/toggle_fetcher.rb', line 30 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 |