bud 0.0.8 → 0.1.0.pre1

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.
metadata CHANGED
@@ -1,27 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bud
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
5
- prerelease:
4
+ hash: 1923831995
5
+ prerelease: 6
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 8
10
- version: 0.0.8
10
+ - pre
11
+ - 1
12
+ version: 0.1.0.pre1
11
13
  platform: ruby
12
14
  authors:
13
15
  - Peter Alvaro
14
16
  - Neil Conway
15
17
  - Joseph M. Hellerstein
16
18
  - William R. Marczak
19
+ - Sriram Srinivasan
17
20
  autorequire:
18
21
  bindir: bin
19
22
  cert_chain: []
20
23
 
21
- date: 2011-10-10 00:00:00 Z
24
+ date: 2012-03-14 00:00:00 Z
22
25
  dependencies:
23
26
  - !ruby/object:Gem::Dependency
24
- name: backports
27
+ name: eventmachine
25
28
  prerelease: false
26
29
  requirement: &id001 !ruby/object:Gem::Requirement
27
30
  none: false
@@ -35,7 +38,7 @@ dependencies:
35
38
  type: :runtime
36
39
  version_requirements: *id001
37
40
  - !ruby/object:Gem::Dependency
38
- name: eventmachine
41
+ name: fastercsv
39
42
  prerelease: false
40
43
  requirement: &id002 !ruby/object:Gem::Requirement
41
44
  none: false
@@ -49,7 +52,7 @@ dependencies:
49
52
  type: :runtime
50
53
  version_requirements: *id002
51
54
  - !ruby/object:Gem::Dependency
52
- name: fastercsv
55
+ name: gchart
53
56
  prerelease: false
54
57
  requirement: &id003 !ruby/object:Gem::Requirement
55
58
  none: false
@@ -63,7 +66,7 @@ dependencies:
63
66
  type: :runtime
64
67
  version_requirements: *id003
65
68
  - !ruby/object:Gem::Dependency
66
- name: gchart
69
+ name: getopt
67
70
  prerelease: false
68
71
  requirement: &id004 !ruby/object:Gem::Requirement
69
72
  none: false
@@ -77,7 +80,7 @@ dependencies:
77
80
  type: :runtime
78
81
  version_requirements: *id004
79
82
  - !ruby/object:Gem::Dependency
80
- name: getopt
83
+ name: i18n
81
84
  prerelease: false
82
85
  requirement: &id005 !ruby/object:Gem::Requirement
83
86
  none: false
@@ -91,7 +94,7 @@ dependencies:
91
94
  type: :runtime
92
95
  version_requirements: *id005
93
96
  - !ruby/object:Gem::Dependency
94
- name: i18n
97
+ name: json
95
98
  prerelease: false
96
99
  requirement: &id006 !ruby/object:Gem::Requirement
97
100
  none: false
@@ -105,7 +108,7 @@ dependencies:
105
108
  type: :runtime
106
109
  version_requirements: *id006
107
110
  - !ruby/object:Gem::Dependency
108
- name: json
111
+ name: minitest
109
112
  prerelease: false
110
113
  requirement: &id007 !ruby/object:Gem::Requirement
111
114
  none: false
@@ -147,7 +150,7 @@ dependencies:
147
150
  type: :runtime
148
151
  version_requirements: *id009
149
152
  - !ruby/object:Gem::Dependency
150
- name: ParseTree
153
+ name: ruby-graphviz
151
154
  prerelease: false
152
155
  requirement: &id010 !ruby/object:Gem::Requirement
153
156
  none: false
@@ -160,24 +163,10 @@ dependencies:
160
163
  version: "0"
161
164
  type: :runtime
162
165
  version_requirements: *id010
163
- - !ruby/object:Gem::Dependency
164
- name: ruby-graphviz
165
- prerelease: false
166
- requirement: &id011 !ruby/object:Gem::Requirement
167
- none: false
168
- requirements:
169
- - - ">="
170
- - !ruby/object:Gem::Version
171
- hash: 3
172
- segments:
173
- - 0
174
- version: "0"
175
- type: :runtime
176
- version_requirements: *id011
177
166
  - !ruby/object:Gem::Dependency
178
167
  name: ruby2ruby
179
168
  prerelease: false
180
- requirement: &id012 !ruby/object:Gem::Requirement
169
+ requirement: &id011 !ruby/object:Gem::Requirement
181
170
  none: false
182
171
  requirements:
183
172
  - - <
@@ -189,11 +178,11 @@ dependencies:
189
178
  - 1
190
179
  version: 1.3.1
191
180
  type: :runtime
192
- version_requirements: *id012
181
+ version_requirements: *id011
193
182
  - !ruby/object:Gem::Dependency
194
- name: sexp_path
183
+ name: ruby_parser
195
184
  prerelease: false
196
- requirement: &id013 !ruby/object:Gem::Requirement
185
+ requirement: &id012 !ruby/object:Gem::Requirement
197
186
  none: false
198
187
  requirements:
199
188
  - - ">="
@@ -203,11 +192,11 @@ dependencies:
203
192
  - 0
204
193
  version: "0"
205
194
  type: :runtime
206
- version_requirements: *id013
195
+ version_requirements: *id012
207
196
  - !ruby/object:Gem::Dependency
208
- name: superators
197
+ name: superators19
209
198
  prerelease: false
210
- requirement: &id014 !ruby/object:Gem::Requirement
199
+ requirement: &id013 !ruby/object:Gem::Requirement
211
200
  none: false
212
201
  requirements:
213
202
  - - ">="
@@ -217,11 +206,11 @@ dependencies:
217
206
  - 0
218
207
  version: "0"
219
208
  type: :runtime
220
- version_requirements: *id014
209
+ version_requirements: *id013
221
210
  - !ruby/object:Gem::Dependency
222
211
  name: syntax
223
212
  prerelease: false
224
- requirement: &id015 !ruby/object:Gem::Requirement
213
+ requirement: &id014 !ruby/object:Gem::Requirement
225
214
  none: false
226
215
  requirements:
227
216
  - - ">="
@@ -231,11 +220,11 @@ dependencies:
231
220
  - 0
232
221
  version: "0"
233
222
  type: :runtime
234
- version_requirements: *id015
223
+ version_requirements: *id014
235
224
  - !ruby/object:Gem::Dependency
236
225
  name: uuid
237
226
  prerelease: false
238
- requirement: &id016 !ruby/object:Gem::Requirement
227
+ requirement: &id015 !ruby/object:Gem::Requirement
239
228
  none: false
240
229
  requirements:
241
230
  - - ">="
@@ -245,7 +234,7 @@ dependencies:
245
234
  - 0
246
235
  version: "0"
247
236
  type: :runtime
248
- version_requirements: *id016
237
+ version_requirements: *id015
249
238
  description: A prototype of the Bloom distributed programming language, as a Ruby DSL.
250
239
  email:
251
240
  - bloomdevs@gmail.com
@@ -267,11 +256,10 @@ files:
267
256
  - lib/bud/collections.rb
268
257
  - lib/bud/depanalysis.rb
269
258
  - lib/bud/deploy/countatomicdelivery.rb
270
- - lib/bud/deploy/deployer.rb
271
- - lib/bud/deploy/ec2deploy.rb
272
- - lib/bud/deploy/forkdeploy.rb
273
- - lib/bud/deploy/threaddeploy.rb
274
259
  - lib/bud/errors.rb
260
+ - lib/bud/executor/elements.rb
261
+ - lib/bud/executor/group.rb
262
+ - lib/bud/executor/join.rb
275
263
  - lib/bud/graphs.rb
276
264
  - lib/bud/joins.rb
277
265
  - lib/bud/meta_algebra.rb
@@ -281,11 +269,10 @@ files:
281
269
  - lib/bud/rewrite.rb
282
270
  - lib/bud/rtrace.rb
283
271
  - lib/bud/server.rb
272
+ - lib/bud/source.rb
284
273
  - lib/bud/state.rb
285
274
  - lib/bud/storage/dbm.rb
286
- - lib/bud/storage/tokyocabinet.rb
287
275
  - lib/bud/storage/zookeeper.rb
288
- - lib/bud/stratify.rb
289
276
  - lib/bud/viz.rb
290
277
  - lib/bud/viz_util.rb
291
278
  - lib/bud.rb
@@ -317,10 +304,6 @@ files:
317
304
  - examples/chat/chat_protocol.rb
318
305
  - examples/chat/chat_server.rb
319
306
  - examples/chat/README.md
320
- - examples/deploy/tokenring-ec2.rb
321
- - examples/deploy/tokenring-fork.rb
322
- - examples/deploy/tokenring-thread.rb
323
- - examples/deploy/tokenring.rb
324
307
  - examples/README
325
308
  - README
326
309
  - LICENSE
@@ -335,7 +318,7 @@ require_paths:
335
318
  required_ruby_version: !ruby/object:Gem::Requirement
336
319
  none: false
337
320
  requirements:
338
- - - ~>
321
+ - - ">="
339
322
  - !ruby/object:Gem::Version
340
323
  hash: 57
341
324
  segments:
@@ -346,16 +329,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
346
329
  required_rubygems_version: !ruby/object:Gem::Requirement
347
330
  none: false
348
331
  requirements:
349
- - - ">="
332
+ - - ">"
350
333
  - !ruby/object:Gem::Version
351
- hash: 3
334
+ hash: 25
352
335
  segments:
353
- - 0
354
- version: "0"
336
+ - 1
337
+ - 3
338
+ - 1
339
+ version: 1.3.1
355
340
  requirements: []
356
341
 
357
342
  rubyforge_project: bloom-lang
358
- rubygems_version: 1.8.6
343
+ rubygems_version: 1.8.17
359
344
  signing_key:
360
345
  specification_version: 3
361
346
  summary: A prototype Bloom DSL for distributed programming.
@@ -1,26 +0,0 @@
1
- require 'rubygems'
2
- require 'bud'
3
- require 'bud/deploy/ec2deploy'
4
- require 'tokenring'
5
-
6
- class RingEC2
7
- include Bud
8
- include TokenRing
9
- include EC2Deploy
10
-
11
- deploystrap do
12
- raise "keys.rb must exist in the current directory" unless File.exists? "keys.rb"
13
- eval(IO.read('keys.rb'), binding)
14
- node_count << [10]
15
- ruby_command << ["ruby tokenring-ec2.rb"]
16
- init_dir << ["."]
17
- end
18
- end
19
-
20
- ip, port = ARGV[0].split(':')
21
- ext_ip, ext_port = ARGV[1].split(':')
22
- RingEC2.new(:ip => ip,
23
- :port => port,
24
- :ext_ip => ext_ip,
25
- :ext_port => ext_port,
26
- :deploy => ARGV[2]).run_fg
@@ -1,15 +0,0 @@
1
- require 'rubygems'
2
- require 'bud'
3
- require 'tokenring'
4
-
5
- class RingFork
6
- include Bud
7
- include TokenRing
8
- include ForkDeploy
9
-
10
- deploystrap do
11
- node_count << [10]
12
- end
13
- end
14
-
15
- RingFork.new(:deploy => true).run_fg
@@ -1,15 +0,0 @@
1
- require 'rubygems'
2
- require 'bud'
3
- require 'tokenring'
4
-
5
- class RingThread
6
- include Bud
7
- include TokenRing
8
- include ThreadDeploy
9
-
10
- deploystrap do
11
- node_count << [10]
12
- end
13
- end
14
-
15
- RingThread.new(:deploy => true).run_fg
@@ -1,47 +0,0 @@
1
- require 'rubygems'
2
- require 'bud'
3
-
4
- module TokenRing
5
- state do
6
- table :next_node, [] => [:addr]
7
- channel :next_node_chan, [:@loc] => [:next]
8
- scratch :send_next_node, [:node, :next]
9
- table :sent_next_node, [:addr]
10
- channel :token, [:@loc]
11
- table :token_persist, [:loc]
12
- end
13
-
14
- bloom :make_ring do
15
- # Once a node and its successor have both been computed, send a message to
16
- # the node with the address of its successor
17
- send_next_node <= (node * node * node_ready).combos do |n1, n2, nr|
18
- succ_id = (n1.uid + 1) % node_count[[]].num
19
- if n2.uid == succ_id and not sent_next_node.has_key? [n1.uid]
20
- [n1.addr, n2.addr]
21
- end
22
- end
23
- next_node_chan <~ send_next_node
24
- sent_next_node <+ send_next_node {|n| [n.node]}
25
-
26
- next_node <= next_node_chan {|n| [n.next]}
27
-
28
- # The deployer sends an initial message to the node with ID 0
29
- token <~ (node_ready * node).rights(:uid => :uid) do |n|
30
- [n.addr] if (@options[:deploy] and n.uid == 0)
31
- end
32
- end
33
-
34
- bloom :pass_token do
35
- # Persist the token for as long as necessary
36
- token_persist <= token
37
- token_persist <- (token_persist * next_node).lefts
38
- # Pass on the token
39
- token <~ (token_persist * next_node).rights do |nn|
40
- [nn.addr]
41
- end
42
- end
43
-
44
- bloom :print_token do
45
- stdio <~ token {["#{@node_id}: Got token! (@ #{ip_port})"]}
46
- end
47
- end
@@ -1,67 +0,0 @@
1
- require 'rubygems'
2
- require 'bud'
3
- require 'bud/deploy/countatomicdelivery'
4
-
5
- class Module
6
- def deploystrap(&block)
7
- meth_name = "__deploystrap__#{Module.get_class_name(self)}".to_sym
8
- define_method(meth_name, &block)
9
- end
10
- end
11
-
12
- module Deployer # :nodoc: all
13
- include CountAtomicDelivery
14
-
15
- state do
16
- table :node, [:uid] => [:addr]
17
- table :node_count, [] => [:num]
18
- # At the deployer node, this collection will contain a fact for the first
19
- # tick in which the given node is ready
20
- scratch :node_ready, [:uid]
21
-
22
- table :initial_data, [:uid, :pred, :data]
23
- channel :dont_care, [:@loc]
24
- table :dead, [:dead]
25
- end
26
-
27
- def depl_idempotent(r) (dead.include? r) ? false : dead.insert(r) end
28
-
29
- def do_deploystrap
30
- self.class.ancestors.each do |anc|
31
- anc.instance_methods(false).each do |m|
32
- if /^__deploystrap__/.match m
33
- self.method(m.to_sym).call
34
- end
35
- end
36
- end
37
- end
38
-
39
- def initialize(opt={})
40
- super
41
- do_deploystrap if opt[:deploy]
42
- end
43
-
44
- # Distribute the EDB to each node.
45
- #
46
- # XXX: this may break coordination protocols that assume the EDB is present
47
- # before any messages are received. In order to fix this, we would probably
48
- # need to globally synchronize to ensure that "timestamp 0" gets "fully
49
- # evaluated" before any messages can be sent.
50
- bloom :distribute_data do
51
- atomic_data_in <= (node_ready * node * initial_data).combos(node_ready.uid => node.uid, node.uid => initial_data.uid) do |nr, n, i|
52
- [n.addr, [i.pred, i.data]]
53
- end
54
-
55
- # Add all tuples at once.
56
- dont_care <~ atomic_data_out do |a|
57
- a.tuple[1].map do |d|
58
- eval a.tuple[0].to_s + " <+ [" + d.inspect + "]"
59
- end
60
- [ip_port]
61
- end
62
- end
63
-
64
- bloom :print_ready do
65
- stdio <~ node_ready {|nr| ["Child node ready: #{nr.uid}"]}
66
- end
67
- end
@@ -1,199 +0,0 @@
1
- require 'rubygems'
2
- require 'AWS'
3
- require 'pp'
4
- require 'net/ssh'
5
- require 'net/scp'
6
- require 'bud'
7
- require 'bud/deploy/deployer'
8
-
9
- # Logic to deploy Bloom programs on EC2
10
- # TODO:
11
- # * add support for deploy_child_opts
12
- # * avoid blocking I/O calls
13
- # * emit "node_ready" event when each node is ready
14
- module EC2Deploy
15
- include Deployer
16
-
17
- state do
18
- table :access_key_id, [] => [:key]
19
- table :secret_access_key, [] => [:key]
20
- table :image_id, [] => [:img]
21
- table :key_name, [] => [:name]
22
- table :ec2_key_location, [] => [:loc]
23
- table :ec2_conn, [] => [:conn]
24
- table :ec2_insts, [] => [:insts]
25
- table :reservation_id, [] => [:rid]
26
- periodic :spinup_timer, 6
27
- scratch :the_reservation, [] => [:reservation]
28
- scratch :the_reservation_next, [] => [:reservation]
29
- scratch :node_up, [:node] => [:bool]
30
- table :init_dir, [] => [:dir]
31
- table :temp_node, [:uid, :node, :localip]
32
- table :all_up, [:bool]
33
- table :ruby_command, [] => [:cmd]
34
- table :deploy_node, [:uid] => [:node]
35
- channel :ready, [:@loc, :sender]
36
- table :ready_tab, [:sender]
37
- scratch :ready_count, [:num]
38
- end
39
-
40
- deploystrap do
41
- # Write the IP & port to a file; we'll send this to each EC2 node.
42
- File.open("deploy_ip_port", "w") do |f|
43
- f.puts ip_port
44
- end
45
- end
46
-
47
- bootstrap do
48
- # The official BUD AMI.
49
- image_id <= [["ami-f434c99d"]]
50
- unless @options[:deploy]
51
- # Send message to the deployer telling 'em we's up.
52
- File.open("deploy_ip_port", "r") do |f|
53
- ready <~ [[f.readline.rstrip, ip_port]]
54
- end
55
- end
56
- end
57
-
58
- bloom :spinup do
59
- ec2_conn <= (access_key_id * secret_access_key).pairs do
60
- if depl_idempotent [:ec2_comm]
61
- [AWS::EC2::Base.new(:access_key_id => access_key_id[[]].key,
62
- :secret_access_key => secret_access_key[[]].key)]
63
- end
64
- end
65
-
66
- ec2_insts <= (image_id * node_count * key_name * ec2_conn).combos do
67
- if depl_idempotent [:ec2_insts]
68
- print "Starting up EC2 instances"
69
- $stdout.flush
70
- # First, we create the security group.
71
- begin
72
- ec2_conn[[]].conn.create_security_group(:group_name => "bud", :group_description => "bud")
73
- rescue AWS::InvalidGroupDuplicate
74
- # Group already exists; ok, maybe we created it previously.
75
- else
76
- # Add SSH permission.
77
- ec2_conn[[]].conn.authorize_security_group_ingress(:group_name => "bud",
78
- :ip_protocol => "tcp",
79
- :from_port => 22,
80
- :to_port => 22,
81
- :cidr_ip => "0.0.0.0/0")
82
- # Add unlimited UDP permission from any node not in the security group.
83
- # XXX: make this more restrictive?
84
- ec2_conn[[]].conn.authorize_security_group_ingress(:group_name => "bud",
85
- :ip_protocol => "udp",
86
- :from_port => 0,
87
- :to_port => 65535,
88
- :cidr_ip => "0.0.0.0/0")
89
- end
90
-
91
- # Finally, start up the instances.
92
- [ec2_conn[[]].conn.run_instances(:image_id => image_id[[]].img,
93
- :min_count => node_count[[]].num,
94
- :max_count => node_count[[]].num,
95
- :key_name => key_name[[]].name,
96
- :security_group => "bud")]
97
- end
98
- end
99
-
100
- the_reservation <= (spinup_timer * ec2_conn * ec2_insts).combos do |t,c,i|
101
- if depl_idempotent [[:the_reservation, t.val]] and not all_up.include? [true]
102
- to_ret = nil
103
- begin
104
- to_ret = [ec2_conn[[]].conn.describe_instances()["reservationSet"]["item"].find do |j|
105
- j["reservationId"] == ec2_insts[[]].insts["reservationId"]
106
- end]
107
- rescue SocketError
108
- print "E"
109
- else
110
- print "."
111
- end
112
- $stdout.flush
113
- to_ret
114
- end
115
- end
116
-
117
- # XXX: No upsert operator, so we have to do this.
118
- the_reservation_next <+ the_reservation
119
-
120
- node_up <= (((ec2_insts * the_reservation).pairs do
121
- if not all_up.include? [true]
122
- the_reservation[[]].reservation["instancesSet"]["item"].map do |i|
123
- [i, i["instanceState"]["code"] == "16"]
124
- end
125
- end
126
- end)[0] or [])
127
-
128
- all_up <+ node_up do
129
- if node_up.find {|n1| n1.bool == false} == nil and node_up.find {|n2| n2.bool == true} != nil
130
- if depl_idempotent [:nodes_all_up]
131
- puts "done"
132
- $stdout.flush
133
- [true]
134
- end
135
- end
136
- end
137
-
138
- # XXX: Fixed port 54321
139
- temp_node <= (all_up * the_reservation_next).pairs do
140
- break(((0..(the_reservation_next[[]].reservation["instancesSet"]["item"].size-1)).to_a.zip(the_reservation_next[[]].reservation["instancesSet"]["item"].map {|i| [i["ipAddress"], i["privateIpAddress"]]})).map {|n,ips| [n, ips[0] + ":54321", ips[1] + ":54321"]})
141
- end
142
-
143
- deploy_node <= (temp_node * init_dir * ruby_command).combos do |t, i, r|
144
- if depl_idempotent [[:node_startup, t.node]]
145
- ip = t.node.split(":")[0]
146
- port = t.node.split(":")[1]
147
- print "Deploying to #{ip} (#{t.uid}/#{node_count[[]].num-1})."
148
- $stdout.flush
149
-
150
- # Upload files and run commands.
151
- ctr = 0
152
- while ctr < 10
153
- begin
154
- Net::SSH.start(ip, 'ec2-user', :keys => [ec2_key_location[[]].loc],
155
- :timeout => 5, :paranoid => false) do |session|
156
- # Upload init_dir, and the IP and port of the deployer
157
- session.scp.upload!("deploy_ip_port", "/home/ec2-user")
158
- session.scp.upload!(init_dir[[]].dir, "/home/ec2-user",
159
- :recursive => true)
160
- # Update the Bud gem
161
- channel = session.open_channel do |ch|
162
- channel.request_pty do |_, success|
163
- raise "couldn't open a PTY on #{t.node}" if !success
164
- end
165
- channel.exec("sudo gem update --no-ri --no-rdoc bud")
166
- end
167
- channel.wait
168
- # Run the ruby_command
169
- session.exec!('nohup ' + ruby_command[[]].cmd + ' ' + t.localip +
170
- ' ' + t.node + ' >metarecv.out 2>metarecv.err </dev/null &')
171
- end
172
- break true
173
- rescue Exception
174
- ctr += 1
175
- print "."
176
- $stdout.flush
177
- sleep 10
178
- next
179
- end
180
- end or raise "EC2 SSH failed after 10 retries"
181
-
182
- puts "done"
183
- [t.uid, t.node]
184
- end
185
- end
186
- end
187
-
188
- bloom :all_nodes do
189
- stdio <~ ready {|_,s| ["Ready: #{s}"]}
190
- # Persist ready messages
191
- ready_tab <= ready {|_, s| [s]}
192
- # Compute a count of ready messages
193
- ready_count <= ready_tab.group(nil, count)
194
- # Copy deploy_node into node when all nodes are up
195
- node <= (ready_count * node_count).pairs(:num => :num) do
196
- break deploy_node
197
- end
198
- end
199
- end