dizby 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +10 -0
  3. data/LICENSE +24 -0
  4. data/dizby.gemspec +27 -0
  5. data/lib/dizby.rb +12 -0
  6. data/lib/dizby/access/control_list.rb +78 -0
  7. data/lib/dizby/access/entry.rb +61 -0
  8. data/lib/dizby/access/insecure.rb +30 -0
  9. data/lib/dizby/access/list.rb +10 -0
  10. data/lib/dizby/converter/simple.rb +12 -0
  11. data/lib/dizby/converter/timed.rb +23 -0
  12. data/lib/dizby/distributed/array.rb +30 -0
  13. data/lib/dizby/distributed/object.rb +44 -0
  14. data/lib/dizby/distributed/proxy.rb +41 -0
  15. data/lib/dizby/distributed/semi_proxy.rb +26 -0
  16. data/lib/dizby/distributed/undumpable.rb +8 -0
  17. data/lib/dizby/distributed/unknown.rb +57 -0
  18. data/lib/dizby/error.rb +29 -0
  19. data/lib/dizby/protocol/basic.rb +31 -0
  20. data/lib/dizby/protocol/manager.rb +62 -0
  21. data/lib/dizby/protocol/refined.rb +23 -0
  22. data/lib/dizby/protocols/dead.rb +24 -0
  23. data/lib/dizby/protocols/secure.rb +87 -0
  24. data/lib/dizby/protocols/tcp.rb +98 -0
  25. data/lib/dizby/protocols/unix.rb +95 -0
  26. data/lib/dizby/server/abstract.rb +42 -0
  27. data/lib/dizby/server/basic.rb +101 -0
  28. data/lib/dizby/server/registration.rb +23 -0
  29. data/lib/dizby/service.rb +64 -0
  30. data/lib/dizby/stream/client.rb +26 -0
  31. data/lib/dizby/stream/connection.rb +63 -0
  32. data/lib/dizby/stream/messenger.rb +28 -0
  33. data/lib/dizby/stream/query_ref.rb +13 -0
  34. data/lib/dizby/stream/readable.rb +65 -0
  35. data/lib/dizby/stream/writable.rb +37 -0
  36. data/lib/dizby/tunnel/abstract.rb +52 -0
  37. data/lib/dizby/tunnel/basic.rb +21 -0
  38. data/lib/dizby/tunnel/basic_spawn.rb +50 -0
  39. data/lib/dizby/tunnel/bidirectional_strategy.rb +29 -0
  40. data/lib/dizby/tunnel/factory.rb +29 -0
  41. data/lib/dizby/tunnel/local_strategy.rb +24 -0
  42. data/lib/dizby/tunnel/spawn_command.rb +49 -0
  43. data/lib/dizby/tunnel/spawned.rb +43 -0
  44. data/lib/dizby/tunnel/tunnelable_local.rb +8 -0
  45. data/lib/dizby/tunnel/tunnelable_remote.rb +21 -0
  46. data/lib/dizby/utility/classic_access.rb +25 -0
  47. data/lib/dizby/utility/configurable.rb +25 -0
  48. data/lib/dizby/utility/delegator.rb +28 -0
  49. data/lib/dizby/utility/io_barrier.rb +18 -0
  50. data/lib/dizby/utility/log.rb +23 -0
  51. data/lib/dizby/utility/monitor.rb +9 -0
  52. data/lib/dizby/utility/polymorphic_delegated.rb +58 -0
  53. data/lib/dizby/utility/self_pipe.rb +12 -0
  54. data/lib/dizby/utility/semi_built.rb +17 -0
  55. data/lib/dizby/utility/string.rb +8 -0
  56. data/lib/dizby/utility/timed_collection.rb +39 -0
  57. data/lib/dizby/utility/timed_state.rb +41 -0
  58. data/lib/dizby/version.rb +4 -0
  59. data/lib/dizby/worker/connection.rb +44 -0
  60. data/lib/dizby/worker/invoke_method.rb +55 -0
  61. data/lib/dizby/worker/server.rb +39 -0
  62. metadata +146 -0
@@ -0,0 +1,9 @@
1
+
2
+ require 'monitor'
3
+
4
+ module Dizby
5
+ def self.monitor(obj)
6
+ obj.extend(MonitorMixin)
7
+ obj
8
+ end
9
+ end
@@ -0,0 +1,58 @@
1
+
2
+ require 'dizby/utility/classic_access'
3
+ require 'dizby/utility/delegator'
4
+
5
+ module Dizby
6
+ module PolymorphicDelegated
7
+ def self.included(base)
8
+ base.extend(ClassMethods)
9
+ base.send(:include, InstanceMethods)
10
+
11
+ base.class_eval do
12
+ intercepted = [base, Object, Kernel, BasicObject, InstanceMethods]
13
+ intercepted = intercepted.map(&:instance_methods).inject(&:-)
14
+
15
+ @__delegated_methods__ =
16
+ intercepted.each_with_object({}) do |name, methods|
17
+ methods[name.to_sym] = base.instance_method(name)
18
+ base.send(:undef_method, name)
19
+ end
20
+ end
21
+ end
22
+
23
+ module ClassMethods
24
+ include ClassicAttributeAccess
25
+
26
+ def __delegated_methods__
27
+ instance_variable_get(:@__delegated_methods__)
28
+ end
29
+
30
+ def method_added(name)
31
+ return if [:method_missing, :initialize].include?(name)
32
+ @__delegated_methods__[name] = instance_method(name)
33
+ send(:undef_method, name)
34
+ nil
35
+ end
36
+ end
37
+
38
+ module InstanceMethods
39
+ def __delegate__(name, delegator, *args, &block)
40
+ method = self.class.__delegated_methods__[name]
41
+ method_args = [method.defined_in, method.executable, method.name]
42
+
43
+ # NOTE: This only works in Rubinius
44
+ Method.new(delegator, *method_args).call(*args, &block)
45
+ end
46
+
47
+ def method_missing(name, *args, &block)
48
+ args.unshift(self) if args.empty? || !args.first.is_a?(Delegator)
49
+
50
+ __delegate__ name, *args, &block
51
+ end
52
+
53
+ def respond_to?(sym, _priv = false)
54
+ super || self.class.__delegated_methods__.keys.include?(sym)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module Dizby
3
+ SelfPipe = Struct.new(:read, :write) do
4
+ def close_read
5
+ read.close if read && !read.closed?
6
+ end
7
+
8
+ def close_write
9
+ write.close if write && !write.closed?
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+
2
+ module Dizby
3
+ class SemibuiltObject
4
+ def initialize(klass, *args)
5
+ @klass = klass
6
+ @base_args = args
7
+ end
8
+
9
+ def with(*args, &block)
10
+ @klass.new(*@base_args, *args, &block)
11
+ end
12
+
13
+ def done
14
+ with
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+
2
+ module Dizby
3
+ def self.any_to_s(obj)
4
+ "#{obj}:#{obj.class}"
5
+ rescue
6
+ format '#<%s:0x%1x>', obj.class, obj.__id__
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+
2
+ require 'dizby/utility/monitor'
3
+ require 'dizby/utility/timed_state'
4
+
5
+ module Dizby
6
+ class InvalidIdentifier < RuntimeError; end
7
+
8
+ class TimedCollection
9
+ def initialize(timeout, step = timeout)
10
+ @timeout = timeout
11
+ @step = [timeout, step].min # don't allow a larger step than timeout
12
+ @states = Dizby.monitor({})
13
+ @updater = Thread.start { update }
14
+ end
15
+
16
+ def revive(id)
17
+ @states.synchronize { @states.fetch(id).revive }
18
+ rescue KeyError
19
+ raise InvalidIdentifier, 'identifier timed out or did not exist'
20
+ end
21
+
22
+ def add(id)
23
+ @states.synchronize { @states[id] = TimedState.new(@timeout) }
24
+ end
25
+
26
+ private
27
+
28
+ def update
29
+ loop do
30
+ sleep(@step)
31
+
32
+ @states.synchronize do
33
+ @states.each_value(&:update)
34
+ @states.keep_if { |_, state| state.alive? }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,41 @@
1
+
2
+ module Dizby
3
+ class TimedState
4
+ def initialize(timeout)
5
+ @timeout = timeout
6
+ revive
7
+ end
8
+
9
+ def update
10
+ previous = @last_update
11
+ @last_update = Time.now
12
+ timediff = (@last_update - previous) * 1000
13
+
14
+ @time += timediff
15
+ progress if @time >= @timeout
16
+ end
17
+
18
+ def alive?
19
+ @state != :dead
20
+ end
21
+
22
+ def revive
23
+ @state = :active
24
+ @time = 0
25
+ @last_update = Time.now
26
+ end
27
+
28
+ private
29
+
30
+ def progress
31
+ @time = 0
32
+ @state =
33
+ case @state
34
+ when :active
35
+ :inactive
36
+ when :inactive
37
+ :dead
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,4 @@
1
+
2
+ module Dizby
3
+ VERSION = '1.3.0'
4
+ end
@@ -0,0 +1,44 @@
1
+
2
+ require 'dizby/worker/invoke_method'
3
+
4
+ module Dizby
5
+ class ConnectionWorker
6
+ def initialize(server, conn)
7
+ @server = server
8
+ @conn = conn
9
+
10
+ @thread = Thread.start { process_requests }
11
+ end
12
+
13
+ def close
14
+ @conn.close unless @conn.closed?
15
+
16
+ # TODO: @thread gets set to nil for some reason...
17
+ @thread.join if @thread
18
+ end
19
+
20
+ private
21
+
22
+ def process_requests
23
+ loop { break unless process_request }
24
+ rescue RemoteServerShutdown
25
+ @server.log.debug("lost connection to server at #{@conn.remote_uri}")
26
+ ensure
27
+ @conn.close unless @conn.closed?
28
+ end
29
+
30
+ def process_request
31
+ succ, result = InvokeMethod.new(@server, *@conn.recv_request).perform
32
+
33
+ @server.log.backtrace(result) unless succ
34
+
35
+ begin
36
+ @conn.send_reply(succ, result)
37
+ rescue
38
+ @server.log.backtrace($!)
39
+ end
40
+
41
+ succ
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,55 @@
1
+
2
+ require 'dizby/distributed/array'
3
+
4
+ module Dizby
5
+ class InvokeMethod
6
+ def initialize(server, obj, msg, argv, block)
7
+ @obj = obj
8
+ @msg_id = msg.intern
9
+ @argv = argv
10
+ @block = block && proc { |*args| call_block(block, *args) }
11
+
12
+ @server = server
13
+ end
14
+
15
+ def perform
16
+ result = send_to_object
17
+
18
+ # TODO: do we care what the @msg_id is?
19
+ # Should we convert to a DistributedArray regardless?
20
+ if @msg_id == :to_ary && result.class == Array
21
+ result = DistributedArray.new(result, @server)
22
+ end
23
+
24
+ [true, result]
25
+ rescue StandardError, ScriptError, Interrupt
26
+ @server.log.backtrace($!)
27
+ [false, $!]
28
+ end
29
+
30
+ private
31
+
32
+ def call_block(block, *args)
33
+ if args.size == 1 && args[0].is_a?(Array)
34
+ args[0] = DistributedArray.new(args[0], @server)
35
+ end
36
+
37
+ block.call(*args)
38
+ rescue LocalJumpError
39
+ handle_jump_error($!)
40
+ end
41
+
42
+ def handle_jump_error(err)
43
+ case err.reason
44
+ when :break
45
+ err.exit_value
46
+ else
47
+ fail err
48
+ end
49
+ end
50
+
51
+ def send_to_object
52
+ @obj.__send__(@msg_id, *@argv, &@block)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,39 @@
1
+
2
+ require 'dizby/worker/connection'
3
+
4
+ module Dizby
5
+ class ServiceWorker
6
+ def initialize(server)
7
+ @server = server
8
+ @thread = Thread.start { run }
9
+ end
10
+
11
+ def join
12
+ @thread.join if @thread
13
+ end
14
+
15
+ private
16
+
17
+ def run
18
+ connections = []
19
+ loop do
20
+ conn = accept_connection
21
+ connections << conn if conn
22
+ end
23
+ rescue LocalServerShutdown
24
+ @server.log.debug('Server shutdown')
25
+ ensure
26
+ @server.close if @server.alive?
27
+
28
+ connections.each(&:close)
29
+ end
30
+
31
+ def accept_connection
32
+ connection = @server.accept
33
+ return nil unless connection
34
+
35
+ @server.add_uri_alias connection.remote_uri
36
+ ConnectionWorker.new(@server, connection)
37
+ end
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dizby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Nathan Currier
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ type: :runtime
15
+ name: net-ssh
16
+ prerelease: false
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '3.0'
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ type: :development
29
+ name: rubocop
30
+ prerelease: false
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '0.35'
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.35'
41
+ - !ruby/object:Gem::Dependency
42
+ type: :development
43
+ name: reek
44
+ prerelease: false
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '3.7'
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.7'
55
+ description: Distributed Ruby
56
+ email:
57
+ - nathan.currier@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".rubocop.yml"
63
+ - LICENSE
64
+ - dizby.gemspec
65
+ - lib/dizby.rb
66
+ - lib/dizby/access/control_list.rb
67
+ - lib/dizby/access/entry.rb
68
+ - lib/dizby/access/insecure.rb
69
+ - lib/dizby/access/list.rb
70
+ - lib/dizby/converter/simple.rb
71
+ - lib/dizby/converter/timed.rb
72
+ - lib/dizby/distributed/array.rb
73
+ - lib/dizby/distributed/object.rb
74
+ - lib/dizby/distributed/proxy.rb
75
+ - lib/dizby/distributed/semi_proxy.rb
76
+ - lib/dizby/distributed/undumpable.rb
77
+ - lib/dizby/distributed/unknown.rb
78
+ - lib/dizby/error.rb
79
+ - lib/dizby/protocol/basic.rb
80
+ - lib/dizby/protocol/manager.rb
81
+ - lib/dizby/protocol/refined.rb
82
+ - lib/dizby/protocols/dead.rb
83
+ - lib/dizby/protocols/secure.rb
84
+ - lib/dizby/protocols/tcp.rb
85
+ - lib/dizby/protocols/unix.rb
86
+ - lib/dizby/server/abstract.rb
87
+ - lib/dizby/server/basic.rb
88
+ - lib/dizby/server/registration.rb
89
+ - lib/dizby/service.rb
90
+ - lib/dizby/stream/client.rb
91
+ - lib/dizby/stream/connection.rb
92
+ - lib/dizby/stream/messenger.rb
93
+ - lib/dizby/stream/query_ref.rb
94
+ - lib/dizby/stream/readable.rb
95
+ - lib/dizby/stream/writable.rb
96
+ - lib/dizby/tunnel/abstract.rb
97
+ - lib/dizby/tunnel/basic.rb
98
+ - lib/dizby/tunnel/basic_spawn.rb
99
+ - lib/dizby/tunnel/bidirectional_strategy.rb
100
+ - lib/dizby/tunnel/factory.rb
101
+ - lib/dizby/tunnel/local_strategy.rb
102
+ - lib/dizby/tunnel/spawn_command.rb
103
+ - lib/dizby/tunnel/spawned.rb
104
+ - lib/dizby/tunnel/tunnelable_local.rb
105
+ - lib/dizby/tunnel/tunnelable_remote.rb
106
+ - lib/dizby/utility/classic_access.rb
107
+ - lib/dizby/utility/configurable.rb
108
+ - lib/dizby/utility/delegator.rb
109
+ - lib/dizby/utility/io_barrier.rb
110
+ - lib/dizby/utility/log.rb
111
+ - lib/dizby/utility/monitor.rb
112
+ - lib/dizby/utility/polymorphic_delegated.rb
113
+ - lib/dizby/utility/self_pipe.rb
114
+ - lib/dizby/utility/semi_built.rb
115
+ - lib/dizby/utility/string.rb
116
+ - lib/dizby/utility/timed_collection.rb
117
+ - lib/dizby/utility/timed_state.rb
118
+ - lib/dizby/version.rb
119
+ - lib/dizby/worker/connection.rb
120
+ - lib/dizby/worker/invoke_method.rb
121
+ - lib/dizby/worker/server.rb
122
+ homepage: https://gem.rideliner.net
123
+ licenses:
124
+ - BSD-3-Clause
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '2.0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.4.8
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Distributed Ruby
146
+ test_files: []