nanite 0.4.1.14 → 0.4.1.15
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/nanite.rb +1 -1
- data/lib/nanite/cluster.rb +5 -1
- data/lib/nanite/mapper.rb +25 -15
- data/lib/nanite/security/signature.rb +1 -1
- data/lib/nanite/serializer.rb +31 -18
- metadata +2 -2
data/lib/nanite.rb
CHANGED
@@ -40,7 +40,7 @@ require 'nanite/security/static_certificate_store'
|
|
40
40
|
require 'nanite/serializer'
|
41
41
|
|
42
42
|
module Nanite
|
43
|
-
VERSION = '0.4.1.
|
43
|
+
VERSION = '0.4.1.15' unless defined?(Nanite::VERSION)
|
44
44
|
|
45
45
|
class MapperNotRunning < StandardError; end
|
46
46
|
|
data/lib/nanite/cluster.rb
CHANGED
@@ -67,7 +67,7 @@ module Nanite
|
|
67
67
|
old_target = request.target
|
68
68
|
request.target = target unless target == 'mapper-offline'
|
69
69
|
Nanite::Log.debug("SEND #{request.to_s([:from, :tags, :target])}")
|
70
|
-
amq.queue(target).publish(serializer.dump(request), :persistent => request.persistent)
|
70
|
+
amq.queue(target).publish(serializer.dump(request, enforce_format?(target)), :persistent => request.persistent)
|
71
71
|
ensure
|
72
72
|
request.target = old_target
|
73
73
|
end
|
@@ -75,6 +75,10 @@ module Nanite
|
|
75
75
|
|
76
76
|
protected
|
77
77
|
|
78
|
+
def enforce_format?(target)
|
79
|
+
target == 'mapper-offline' ? :insecure : nil
|
80
|
+
end
|
81
|
+
|
78
82
|
# updates nanite information (last ping timestamps, status)
|
79
83
|
# when heartbeat message is received
|
80
84
|
def handle_ping(ping)
|
data/lib/nanite/mapper.rb
CHANGED
@@ -121,20 +121,13 @@ module Nanite
|
|
121
121
|
@options[:log_path] = (@options[:log_dir] || @options[:root] || Dir.pwd)
|
122
122
|
end
|
123
123
|
@options.freeze
|
124
|
+
@offline_queue = 'mapper-offline'
|
124
125
|
end
|
125
126
|
|
126
127
|
def run
|
127
128
|
setup_logging
|
128
129
|
@serializer = Serializer.new(@options[:format])
|
129
|
-
|
130
|
-
pid_file.check
|
131
|
-
if @options[:daemonize]
|
132
|
-
daemonize(@identity, @options)
|
133
|
-
pid_file.write
|
134
|
-
at_exit { pid_file.remove }
|
135
|
-
else
|
136
|
-
trap("INT") {exit}
|
137
|
-
end
|
130
|
+
setup_process
|
138
131
|
@amq = start_amqp(@options)
|
139
132
|
@job_warden = JobWarden.new(@serializer)
|
140
133
|
setup_cluster
|
@@ -195,9 +188,9 @@ module Nanite
|
|
195
188
|
job = job_warden.new_job(request, targets, intm_handler, blk)
|
196
189
|
cluster.route(request, job.targets)
|
197
190
|
job
|
198
|
-
elsif
|
191
|
+
elsif offline_failsafe?(opts)
|
199
192
|
job_warden.new_job(request, [], intm_handler, blk)
|
200
|
-
cluster.publish(request,
|
193
|
+
cluster.publish(request, @offline_queue)
|
201
194
|
:offline
|
202
195
|
else
|
203
196
|
false
|
@@ -234,14 +227,18 @@ module Nanite
|
|
234
227
|
if !targets.empty?
|
235
228
|
cluster.route(push, targets)
|
236
229
|
true
|
237
|
-
elsif
|
238
|
-
cluster.publish(push,
|
230
|
+
elsif offline_failsafe?(opts)
|
231
|
+
cluster.publish(push, @offline_queue)
|
239
232
|
:offline
|
240
233
|
else
|
241
234
|
false
|
242
235
|
end
|
243
236
|
end
|
244
237
|
|
238
|
+
def offline_failsafe?(opts)
|
239
|
+
opts.key?(:offline_failsafe) ? opts[:offline_failsafe] : options[:offline_failsafe]
|
240
|
+
end
|
241
|
+
|
245
242
|
private
|
246
243
|
|
247
244
|
def build_deliverable(deliverable_type, type, payload, opts)
|
@@ -262,11 +259,12 @@ module Nanite
|
|
262
259
|
end
|
263
260
|
|
264
261
|
def setup_offline_queue
|
265
|
-
offline_queue = amq.queue(
|
262
|
+
offline_queue = amq.queue(@offline_queue, :durable => true)
|
266
263
|
offline_queue.subscribe(:ack => true) do |info, deliverable|
|
267
|
-
deliverable = serializer.load(deliverable)
|
264
|
+
deliverable = serializer.load(deliverable, :insecure)
|
268
265
|
targets = cluster.targets_for(deliverable)
|
269
266
|
unless targets.empty?
|
267
|
+
Nanite::Log.debug("Recovering message from offline queue: #{deliverable.to_s([:from, :tags, :target])}")
|
270
268
|
info.ack
|
271
269
|
if deliverable.kind_of?(Request)
|
272
270
|
if job = job_warden.jobs[deliverable.token]
|
@@ -303,6 +301,18 @@ module Nanite
|
|
303
301
|
def setup_cluster
|
304
302
|
@cluster = Cluster.new(@amq, @options[:agent_timeout], @options[:identity], @serializer, self, @options[:redis], @options[:callbacks])
|
305
303
|
end
|
304
|
+
|
305
|
+
def setup_process
|
306
|
+
pid_file = PidFile.new(@identity, @options)
|
307
|
+
pid_file.check
|
308
|
+
if @options[:daemonize]
|
309
|
+
daemonize(@identity, @options)
|
310
|
+
pid_file.write
|
311
|
+
at_exit { pid_file.remove }
|
312
|
+
else
|
313
|
+
trap("INT") {exit}
|
314
|
+
end
|
315
|
+
end
|
306
316
|
end
|
307
317
|
end
|
308
318
|
|
data/lib/nanite/serializer.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
module Nanite
|
2
2
|
class Serializer
|
3
|
+
SERIALIZERS = {:json => JSON, :marshal => Marshal, :yaml => YAML}.freeze
|
3
4
|
|
5
|
+
attr_reader :preferred_format
|
6
|
+
|
4
7
|
class SerializationError < StandardError
|
5
8
|
attr_accessor :action, :packet
|
6
9
|
def initialize(action, packet, serializers, msg = nil)
|
@@ -11,42 +14,52 @@ module Nanite
|
|
11
14
|
end # SerializationError
|
12
15
|
|
13
16
|
# The secure serializer should not be part of the cascading
|
14
|
-
def initialize(preferred_format =
|
15
|
-
preferred_format
|
16
|
-
if preferred_format.to_s == 'secure'
|
17
|
+
def initialize(preferred_format = nil)
|
18
|
+
@preferred_format = preferred_format || :marshal
|
19
|
+
if @preferred_format.to_s == 'secure'
|
17
20
|
@serializers = [ SecureSerializer ]
|
18
21
|
else
|
19
|
-
preferred_serializer = SERIALIZERS[preferred_format.to_sym]
|
22
|
+
preferred_serializer = SERIALIZERS[@preferred_format.to_sym]
|
20
23
|
@serializers = SERIALIZERS.values.clone
|
21
24
|
@serializers.unshift(@serializers.delete(preferred_serializer)) if preferred_serializer
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
25
|
-
def dump(packet)
|
26
|
-
cascade_serializers(:dump, packet)
|
28
|
+
def dump(packet, format = nil)
|
29
|
+
cascade_serializers(:dump, packet, format)
|
27
30
|
end
|
28
31
|
|
29
|
-
def load(packet)
|
30
|
-
cascade_serializers(:load, packet)
|
32
|
+
def load(packet, format = nil)
|
33
|
+
cascade_serializers(:load, packet, format)
|
31
34
|
end
|
32
35
|
|
33
36
|
private
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
def cascade_serializers(action, packet)
|
38
|
+
def cascade_serializers(action, packet, format)
|
38
39
|
errors = []
|
39
|
-
|
40
|
+
determine_serializers(format).map do |serializer|
|
40
41
|
begin
|
41
|
-
|
42
|
+
serialized = serializer.send(action, packet)
|
42
43
|
rescue Exception => e
|
43
|
-
|
44
|
+
serialized = nil
|
44
45
|
errors << "#{e.message}\n\t#{e.backtrace[0]}"
|
45
46
|
end
|
46
|
-
return
|
47
|
+
return serialized if serialized
|
47
48
|
end
|
48
49
|
raise SerializationError.new(action, packet, @serializers, errors.join("\n"))
|
49
50
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
51
|
+
|
52
|
+
def determine_serializers(format)
|
53
|
+
if secure_serialization? and format == :insecure
|
54
|
+
SERIALIZERS.values
|
55
|
+
else
|
56
|
+
@serializers
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def secure_serialization?
|
61
|
+
@preferred_format.to_s == 'secure'
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nanite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.1.
|
4
|
+
version: 0.4.1.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ezra Zygmuntowicz
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-10 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|