synapse-nginx 0.2.2 → 0.2.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ba905f50502b486b5a4424be003efe1fe69fbcbc
4
- data.tar.gz: 334c1aaac7042a351aad7f71d06a40b61459c98e
3
+ metadata.gz: 73199a08eec1e313f37926a0c8c38dd00ebca0b5
4
+ data.tar.gz: a36bede5643dbd71b4fb5baf9c886c876adf609b
5
5
  SHA512:
6
- metadata.gz: c4ae8565ad2015c84a186be078cffd0c1ed76546b996cbfd384ef1e907a88e6a75cb405f8069c680e5bbe4c8b185e00ae8303ea5cee03d844a0070721d0d107e
7
- data.tar.gz: b05887839ce9c41cc1136985208c418461367f343360d3e407caa40f6cfd2281b33691e00bbba699bac962edd5a8226c0c653f6d009a2988e6f1e5c33304b8b6
6
+ metadata.gz: ac9a2eb24360488f1f04ba77049fce586f0ba73d7af8df5f69209c95d528ba09eb3eccdc1aa5f58d9563dfa06ed07d9a22724cce5bc40297fa8f07e10d5c28a1
7
+ data.tar.gz: 60a8611e1acd216065d9674006c11d212d4615c9e45fbeb6e94e942f6daca3cc100c448b568d4af0f1c9dcd6a6dad2381f901c7f583f2f0cae6868feaf8cc4bd
data/README.md CHANGED
@@ -85,7 +85,12 @@ Setting `listen_address` on a per service basis overrides the global `listen_add
85
85
  in the top level `nginx` config hash.
86
86
  * `listen_options`: additional listen options provided as a string,
87
87
  such as `reuseport`, to append to the listen line. (default is empty string)
88
- * `upstream_order`: how servers should be ordered in the `upstream` stanza. Setting to `asc` means sorting backends in ascending alphabetical order before generating stanza. `desc` means descending alphabetical order. `no_shuffle` means no shuffling or sorting. (default: `shuffle`, which results in random ordering of upstream servers)
88
+ * `upstream_order`: how servers should be ordered in the `upstream` stanza.
89
+ This defaults to `asc` to prevent reloads, and can be set to:
90
+ * `asc` sort upstreams in ascending alphabetical order.
91
+ * `desc` sort upstreams in descending alphabetical order.
92
+ * `shuffle` means random ordering of servers.
93
+ * `no_shuffle` means no shuffling or sorting.
89
94
  * `upstream_name`: The name of the generated nginx backend for this service
90
95
  (defaults to the service's key in the `services` section)
91
96
 
@@ -38,15 +38,18 @@ class Synapse::ConfigGenerator
38
38
  # how to restart nginx
39
39
  @restart_interval = @opts.fetch('restart_interval', 2).to_i
40
40
  @restart_jitter = @opts.fetch('restart_jitter', 0).to_f
41
- @restart_required = true
41
+ @restart_required = false
42
42
  @has_started = false
43
43
 
44
44
  # virtual clock bookkeeping for controlling how often nginx restarts
45
45
  @time = 0
46
46
  @next_restart = @time
47
47
 
48
- # a place to store the parsed nginx config from each watcher
49
- @watcher_configs = {}
48
+ # a place to store generated server + upstream stanzas, and watcher
49
+ # revisions so we can save CPU on updates by not re-computing stanzas
50
+ @servers_cache = {}
51
+ @upstreams_cache = {}
52
+ @watcher_revisions = {}
50
53
  end
51
54
 
52
55
  def normalize_watcher_provided_config(service_watcher_name, service_watcher_config)
@@ -57,9 +60,11 @@ class Synapse::ConfigGenerator
57
60
  'server' => [],
58
61
  'disabled' => false,
59
62
  }
60
- unless service_watcher_config.include?('port')
63
+
64
+ unless service_watcher_config.include?('port') || service_watcher_config['disabled']
61
65
  log.warn "synapse: service #{service_watcher_name}: nginx config does not include a port; only upstream sections for the service will be created; you must move traffic there manually using server sections"
62
66
  end
67
+
63
68
  defaults.merge(service_watcher_config)
64
69
  end
65
70
 
@@ -96,6 +101,19 @@ class Synapse::ConfigGenerator
96
101
  # don't bind the port at all? ... idk
97
102
  next if watcher_config['mode'] == 'tcp' && watcher.backends.empty?
98
103
 
104
+
105
+ # Only regenerate if something actually changed. This saves a lot
106
+ # of CPU load for high churn systems
107
+ regenerate = watcher.revision != @watcher_revisions[watcher.name] ||
108
+ @servers_cache[watcher.name].nil? ||
109
+ @upstreams_cache[watcher.name].nil?
110
+
111
+ if regenerate
112
+ @servers_cache[watcher.name] = generate_server(watcher).flatten
113
+ @upstreams_cache[watcher.name] = generate_upstream(watcher).flatten
114
+ @watcher_revisions[watcher.name] = watcher.revision
115
+ end
116
+
99
117
  section = case watcher_config['mode']
100
118
  when 'http'
101
119
  http
@@ -104,8 +122,8 @@ class Synapse::ConfigGenerator
104
122
  else
105
123
  raise ArgumentError, "synapse does not understand #{watcher_config['mode']} as a service mode"
106
124
  end
107
- section << generate_server(watcher).flatten
108
- section << generate_upstream(watcher).flatten
125
+ section << @servers_cache[watcher.name]
126
+ section << @upstreams_cache[watcher.name]
109
127
  end
110
128
 
111
129
  unless http.empty?
@@ -214,15 +232,18 @@ class Synapse::ConfigGenerator
214
232
  # nginx doesn't like upstreams with no backends?
215
233
  return [] if backends.empty?
216
234
 
235
+ # Note that because we use the config file as the source of truth
236
+ # for whether or not to reload, we want some kind of sorted order
237
+ # by default, in this case we choose asc
217
238
  keys = case watcher_config['upstream_order']
218
- when 'asc'
219
- backends.keys.sort
220
239
  when 'desc'
221
240
  backends.keys.sort.reverse
241
+ when 'shuffle'
242
+ backends.keys.shuffle
222
243
  when 'no_shuffle'
223
244
  backends.keys
224
245
  else
225
- backends.keys.shuffle
246
+ backends.keys.sort
226
247
  end
227
248
 
228
249
  stanza = [
@@ -247,7 +268,13 @@ class Synapse::ConfigGenerator
247
268
  old_config = ""
248
269
  end
249
270
 
250
- if old_config == new_config
271
+ # The first line of the config files contain a timestamp, so to prevent
272
+ # un-needed restarts, only compare after that. We do not split on
273
+ # newlines and compare because this is called a lot, and we need to be
274
+ # as CPU efficient as possible.
275
+ old_version = old_config[(old_config.index("\n") || 0) + 1..-1]
276
+ new_version = new_config[(new_config.index("\n") || 0) + 1..-1]
277
+ if old_version == new_version
251
278
  return false
252
279
  else
253
280
  File.open(opts['config_file_path'],'w') {|f| f.write(new_config)}
data/lib/synapse-nginx.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Synapse
2
2
  module Nginx
3
3
  # Version information for Synapse::Nginx
4
- VERSION = "0.2.2"
4
+ VERSION = "0.2.3"
5
5
  end
6
6
  end
@@ -16,6 +16,7 @@ describe Synapse::ConfigGenerator::Nginx do
16
16
  allow(mockWatcher).to receive(:config_for_generator).and_return({
17
17
  'nginx' => watcher_config
18
18
  })
19
+ allow(mockWatcher).to receive(:revision).and_return(1)
19
20
  mockWatcher
20
21
  end
21
22
 
@@ -28,6 +29,7 @@ describe Synapse::ConfigGenerator::Nginx do
28
29
  allow(mockWatcher).to receive(:config_for_generator).and_return({
29
30
  'nginx' => watcher_config
30
31
  })
32
+ allow(mockWatcher).to receive(:revision).and_return(1)
31
33
  mockWatcher
32
34
  end
33
35
 
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
 
20
- gem.add_runtime_dependency "synapse", "~> 0.14"
20
+ gem.add_runtime_dependency "synapse", "~> 0.14.4"
21
21
 
22
22
  gem.add_development_dependency "rake", "~> 0"
23
23
  gem.add_development_dependency "rspec", "~> 3.1"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synapse-nginx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Lynch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-29 00:00:00.000000000 Z
11
+ date: 2017-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: synapse
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.14'
19
+ version: 0.14.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.14'
26
+ version: 0.14.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement