synapse-nginx 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
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