peplum 0.3.1 → 0.3.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
  SHA256:
3
- metadata.gz: a833d561020be57a98a105e264e6acd79ebe1a93b17de86e7bd3bb7f34bb88a4
4
- data.tar.gz: f25b64342453bc340139bceea007d2baf8d95115afd5dc890be29413c3210405
3
+ metadata.gz: 3568df5f67778e52d60fdadfc43365b8a73560ee2a7a432d7f00f911d1b54c74
4
+ data.tar.gz: 4b72178fc2b3b948a76e04fe86b039b3cd545b3c857b21fdfbe8698d8e8ee094
5
5
  SHA512:
6
- metadata.gz: 0311c9ba56ad671e05146bdbc5449ce5d8c2c533a07e48a8de55e062813b7865624fc400e4fb9b955a156eabc0b16077bcf7ddca45cbf04e7fd3f002aed4bbdb
7
- data.tar.gz: 3d9b8e8cc3a45a5f73a4466ecef138dfdd459b8655aeb679b54724881c64ab7873ffff9843226e5a0e61c6bcf1a4d06b3a95da56c022702795d988487a1fd08b
6
+ metadata.gz: 65f7fe80859499e249207f9d88d3d68701959b4511b0d8c0470c4d61a78b25dc5734fcf7b63e45001bbfe9323ed2b657dc2bea934a597d19a25833e5fd71b67e
7
+ data.tar.gz: 1c74b1a6cf7df7b9db5daf1fc76190f55bc0c45f6acc242667cf2a29a769d00b209369c36dd105996b150148ea6fe5aa65e8b38fd24dd16f337a0610cde3554d
@@ -0,0 +1,19 @@
1
+ module Peplum
2
+ class Application
3
+
4
+ module Worker
5
+
6
+ # @return [Cuboid::RPC::Server::Instance::Peers]
7
+ attr_reader :peers
8
+
9
+ # @return [Cuboid::RPC::Client::Instance, NilClass]
10
+ attr_reader :scheduler
11
+
12
+ def peers
13
+ @peers ||= Cuboid::RPC::Server::Instance::Peers.new
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
@@ -4,60 +4,53 @@ require 'peplum'
4
4
 
5
5
  module Peplum
6
6
  class Application < Cuboid::Application
7
+ require 'peplum/application/worker'
7
8
  require 'peplum/application/payload'
8
9
 
9
10
  require 'peplum/application/services/shared_hash'
10
11
  require 'peplum/application/services/scheduler'
11
12
 
12
- class Error < Peplum::Error; end
13
+ class Error < Peplum::Error
14
+ class PayloadMissing < Error
15
+ end
16
+ end
13
17
 
18
+ # Hijack Cuboid to set ourselves up.
14
19
  class <<self
15
20
  def inherited( application )
16
21
  super
17
22
 
23
+ # Don't trust Cuboid's auto-detection for this, make sure the inheriting class is the Cuboid application.
18
24
  Cuboid::Application.application = application
19
25
 
20
26
  application.validate_options_with :validate_options
21
- application.serialize_with JSON
22
27
 
23
28
  application.instance_service_for :scheduler, Services::Scheduler
29
+
30
+ # Shared, in-memory key-value store for the workers, the scheduler will not be participate.
24
31
  application.instance_service_for :shared_hash, Services::SharedHash
25
32
  end
26
33
  end
27
34
 
28
- # @return [Cuboid::RPC::Server::Instance::Peers]
29
- attr_reader :peers
30
-
31
- # @return [Cuboid::RPC::Client::Instance]
32
- attr_reader :master
33
-
34
- def initialize(*)
35
- super
36
-
37
- @peers = Cuboid::RPC::Server::Instance::Peers.new
38
- end
39
-
40
35
  def run
41
36
  options = @options.dup
37
+
38
+ # System options.
42
39
  peplum_options = options.delete( 'peplum' )
40
+
41
+ # Payload options.
43
42
  payload_options = options.delete( 'payload' )
44
43
 
45
- # We have a master so we're not the scheduler, run the payload.
44
+ # We have a master so we're a worker, run the payload.
46
45
  if peplum_options['master']
47
- execute( peplum_options, payload_options )
46
+ work( peplum_options, payload_options )
48
47
 
49
- # We're the scheduler Instance, get to grouping and spawning.
48
+ # We're the scheduler Instance, get to grouping objects and spawning workers.
50
49
  else
51
50
  schedule( peplum_options, payload_options )
52
51
  end
53
52
  end
54
53
 
55
- # @return [TrueClass, FalseClass] Are we a worker Instance?
56
- def worker?
57
- # Has a master?
58
- !!@master
59
- end
60
-
61
54
  # @return [#run, #split, #merge]
62
55
  #
63
56
  # * `#run` -- Worker; executes its payload against `objects`.
@@ -68,23 +61,32 @@ module Peplum
68
61
  #
69
62
  # @abstract
70
63
  def payload
71
- fail Error, 'Missing #payload!'
64
+ fail Error::PayloadMissing, 'Missing #payload implementation!'
72
65
  end
73
66
 
67
+ # Overload {Cuboid#report} and delegate to the {Payload.merge} prior passing it on to {Cuboid}.
68
+ # @private
74
69
  def report( data )
75
70
  super payload.merge( data )
76
71
  end
77
72
 
78
73
  private
79
74
 
80
- def execute( peplum_options, payload_options )
75
+ def work( peplum_options, payload_options )
76
+ # We're now a worker class!
77
+ self.class.include Worker
78
+
81
79
  master_info = peplum_options.delete( 'master' )
82
80
  @master = Processes::Instances.connect( master_info['url'], master_info['token'] )
83
81
 
82
+ # Configure us to know the rest of our worker peers.
83
+ # Required for the SharedHash service.
84
84
  self.peers.set( peplum_options.delete( 'peers' ) || {} )
85
85
 
86
+ # Deliver the payload.
86
87
  report_data = payload.run( peplum_options['objects'], payload_options )
87
88
 
89
+ # Signal that we're done by passing our report to the scheduler.
88
90
  @master.scheduler.report report_data, Cuboid::Options.rpc.url
89
91
  end
90
92
 
@@ -153,9 +155,20 @@ module Peplum
153
155
  fail Error, 'Options: Missing :max_workers'
154
156
  end
155
157
 
158
+ validate_payload
159
+
156
160
  @options = options
157
161
  true
158
162
  end
159
163
 
164
+ def validate_payload
165
+ p = self.payload
166
+
167
+ %w(run merge split).each do |m|
168
+ next if p.respond_to? m
169
+ fail Payload::Error::ImplementationMissing, "#{payload} missing implementation for: ##{m}"
170
+ end
171
+ end
172
+
160
173
  end
161
174
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Peplum
4
- VERSION = "0.3.1"
4
+ VERSION = "0.3.3"
5
5
  end
data/peplum.gemspec CHANGED
@@ -9,8 +9,10 @@ Gem::Specification.new do |spec|
9
9
  spec.email = ["tasos.laskos@gmail.com"]
10
10
 
11
11
  spec.summary = "Distributed parallel computing made easy."
12
- spec.description = "Distributed parallel computing made easy."
13
- spec.homepage = "http://ecsypno.com/"
12
+ spec.description = <<EOTXT
13
+ Peplum allows you to easily combine the resources of multiple machines and build a Beowulf (or otherwise) cluster/super-computer.
14
+ EOTXT
15
+ spec.homepage = "https://github.com/peplum/peplum"
14
16
  spec.required_ruby_version = ">= 2.6.0"
15
17
 
16
18
  spec.files = Dir.glob( 'bin/*')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: peplum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tasos Laskos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-25 00:00:00.000000000 Z
11
+ date: 2023-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cuboid
@@ -24,7 +24,10 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- description: Distributed parallel computing made easy.
27
+ description: 'Peplum allows you to easily combine the resources of multiple machines
28
+ and build a Beowulf (or otherwise) cluster/super-computer.
29
+
30
+ '
28
31
  email:
29
32
  - tasos.laskos@gmail.com
30
33
  executables: []
@@ -37,10 +40,11 @@ files:
37
40
  - lib/peplum/application/payload.rb
38
41
  - lib/peplum/application/services/scheduler.rb
39
42
  - lib/peplum/application/services/shared_hash.rb
43
+ - lib/peplum/application/worker.rb
40
44
  - lib/peplum/core_ext/array.rb
41
45
  - lib/peplum/version.rb
42
46
  - peplum.gemspec
43
- homepage: http://ecsypno.com/
47
+ homepage: https://github.com/peplum/peplum
44
48
  licenses: []
45
49
  metadata: {}
46
50
  post_install_message: