bud 0.0.3 → 0.0.4

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.
Files changed (50) hide show
  1. data/README +33 -16
  2. data/bin/budplot +42 -65
  3. data/bin/budtimelines +235 -0
  4. data/bin/budvis +24 -122
  5. data/bin/rebl +1 -0
  6. data/docs/README.md +21 -10
  7. data/docs/bfs.md +4 -6
  8. data/docs/c.html +251 -0
  9. data/docs/cheat.md +45 -30
  10. data/docs/deploy.md +26 -26
  11. data/docs/getstarted.md +6 -4
  12. data/docs/visualizations.md +43 -31
  13. data/examples/chat/chat.rb +4 -9
  14. data/examples/chat/chat_server.rb +1 -8
  15. data/examples/deploy/deploy_ip_port +1 -0
  16. data/examples/deploy/keys.rb +5 -0
  17. data/examples/deploy/tokenring-ec2.rb +9 -9
  18. data/examples/deploy/{tokenring-local.rb → tokenring-fork.rb} +3 -5
  19. data/examples/deploy/tokenring-thread.rb +15 -0
  20. data/examples/deploy/tokenring.rb +25 -17
  21. data/lib/bud/aggs.rb +87 -25
  22. data/lib/bud/bud_meta.rb +48 -31
  23. data/lib/bud/bust/bust.rb +16 -15
  24. data/lib/bud/collections.rb +207 -232
  25. data/lib/bud/depanalysis.rb +1 -0
  26. data/lib/bud/deploy/countatomicdelivery.rb +8 -20
  27. data/lib/bud/deploy/deployer.rb +16 -16
  28. data/lib/bud/deploy/ec2deploy.rb +34 -35
  29. data/lib/bud/deploy/forkdeploy.rb +90 -0
  30. data/lib/bud/deploy/threaddeploy.rb +38 -0
  31. data/lib/bud/graphs.rb +103 -199
  32. data/lib/bud/joins.rb +190 -41
  33. data/lib/bud/monkeypatch.rb +84 -0
  34. data/lib/bud/rebl.rb +8 -1
  35. data/lib/bud/rewrite.rb +152 -49
  36. data/lib/bud/server.rb +1 -0
  37. data/lib/bud/state.rb +24 -10
  38. data/lib/bud/storage/dbm.rb +170 -0
  39. data/lib/bud/storage/tokyocabinet.rb +5 -1
  40. data/lib/bud/stratify.rb +6 -7
  41. data/lib/bud/viz.rb +31 -17
  42. data/lib/bud/viz_util.rb +204 -0
  43. data/lib/bud.rb +271 -244
  44. data/lib/bud.rb.orig +806 -0
  45. metadata +43 -22
  46. data/docs/bfs.raw +0 -251
  47. data/docs/diffs +0 -181
  48. data/examples/basics/out +0 -1103
  49. data/examples/basics/out.new +0 -856
  50. data/lib/bud/deploy/localdeploy.rb +0 -53
data/lib/bud/viz.rb CHANGED
@@ -9,19 +9,17 @@ class VizOnline #:nodoc: all
9
9
  @bud_instance = bud_instance
10
10
  return if bud_instance.class == Stratification or @bud_instance.class == DepAnalysis
11
11
  @meta_tables = {'t_rules' => 1, 't_depends' => 1, 't_table_info' => 1, 't_cycle' => 1, 't_stratum' => 1, 't_depends_tc' => 1, 't_table_schema' => 1}
12
- @bud_instance.options[:tc_dir] = "TC_#{@bud_instance.class}_#{bud_instance.options[:tag]}_#{bud_instance.object_id}_#{bud_instance.port}"
13
- @table_info = new_tab(:t_table_info, [:tab_name, :tab_type], @bud_instance)
14
- @table_schema = new_tab(:t_table_schema, [:tab_name, :col_name, :ord], @bud_instance)
15
-
16
- @logtab = {}
12
+ @bud_instance.options[:dbm_dir] = "DBM_#{@bud_instance.class}_#{bud_instance.options[:tag]}_#{bud_instance.object_id}_#{bud_instance.port}"
13
+ @table_info = bud_instance.tables[:t_table_info]
14
+ @table_schema = bud_instance.tables[:t_table_schema]
15
+ @logtab = new_tab("the_big_log", [:table, :time, :contents], bud_instance)
17
16
  tmp_set = []
18
17
  @bud_instance.tables.each do |name, tbl|
19
- next if name.to_s =~ /_vizlog\z/
20
-
18
+ next if name == "the_big_log"
21
19
  # Temp collections don't have a schema until a fact has been inserted into
22
20
  # them; for now, we just include an empty schema for them in the viz
23
21
  if tbl.schema.nil?
24
- schema = []
22
+ schema = [:a, :b, :c, :d]
25
23
  else
26
24
  schema = tbl.schema.clone
27
25
  end
@@ -30,36 +28,52 @@ class VizOnline #:nodoc: all
30
28
 
31
29
  tmp_set.each do |t|
32
30
  news = [:c_bud_time]
31
+ snd_alias = t[0].to_s + "_snd"
33
32
  @table_schema << [t[0], :c_bud_time, 0]
34
33
  t[1].each_with_index do |s, i|
35
34
  news << s
36
35
  @table_schema << [t[0], s, i+1]
36
+ if t[2] == "Bud::BudChannel"
37
+ @table_schema << [snd_alias, s, i+1]
38
+ end
37
39
  end
38
40
  lt = "#{t[0]}_vizlog".to_sym
39
- @logtab[t[0]] = new_tab(lt, news, @bud_instance)
41
+ if t[2] == "Bud::BudChannel"
42
+ lts = "#{snd_alias}_vizlog".to_sym
43
+ @table_info << [snd_alias, t[2]]
44
+ end
40
45
  @table_info << [t[0], t[2]]
41
46
  end
42
47
  end
43
48
 
44
49
  def new_tab(name, schema, instance)
45
- ret = Bud::BudTcTable.new(name, instance, schema)
50
+ ret = Bud::BudDbmTable.new(name, instance, schema)
46
51
  instance.tables[name] = ret
47
52
  return ret
48
53
  end
49
54
 
55
+ def add_rows(collection, tab)
56
+ collection.each do |row|
57
+ if collection.class == Hash
58
+ row = row[1]
59
+ end
60
+ newrow = [tab, @bud_instance.budtime, row]
61
+ @logtab << newrow
62
+
63
+ end
64
+ end
65
+
50
66
  def do_cards
51
67
  return if @bud_instance.class == Stratification or @bud_instance.class == DepAnalysis
52
68
  @bud_instance.tables.each do |t|
53
69
  tab = t[0]
54
- next if tab.to_s =~ /_vizlog\z/
70
+ next if tab == "the_big_log"
55
71
  next if @meta_tables[tab.to_s] and @bud_instance.budtime > 0
56
- next unless @logtab[tab]
57
- t[1].each do |row|
58
- newrow = [@bud_instance.budtime]
59
- row.each{ |r| newrow << r }
60
- @logtab[tab] << newrow
72
+ add_rows(t[1], tab) unless t[1].class == Bud::BudPeriodic
73
+ if t[1].class == Bud::BudChannel
74
+ add_rows(t[1].pending, "#{tab}_snd")
61
75
  end
62
- @logtab[tab].tick
76
+ @logtab.tick
63
77
  end
64
78
  end
65
79
  end
@@ -0,0 +1,204 @@
1
+ require 'rubygems'
2
+ require 'bud/graphs'
3
+
4
+ module TraceCardinality
5
+ state do
6
+ table :full_info, [:bud_time, :table, :row]
7
+ scratch :cardinalities, [:bud_time, :table] => [:cnt]
8
+ scratch :times, [:bud_time]
9
+ end
10
+
11
+ bloom do
12
+ cardinalities <= full_info.group([full_info.bud_time, full_info.table], count)
13
+ times <= full_info {|f| [f.bud_time]}
14
+ end
15
+ end
16
+
17
+ module VizUtil #:nodoc: all
18
+ def graph_from_instance(bud_instance, viz_name, output_base, collapse=true, fmt=nil)
19
+ tabinf = {}
20
+ bud_instance.tables.each do |t|
21
+ tab = t[0].to_s
22
+ tabinf[tab] = t[1].class.to_s
23
+ end
24
+ write_graphs(tabinf, bud_instance.t_cycle, bud_instance.t_depends, bud_instance.t_rules, viz_name, output_base, fmt, collapse, bud_instance.meta_parser.depanalysis)
25
+ end
26
+
27
+ def write_graphs(tabinf, cycle, depends, rules, viz_name, output_base, fmt, collapse, depanalysis=nil, budtime=-1, card_info=nil)
28
+ staging = "#{viz_name}.staging"
29
+ gv = GraphGen.new(tabinf, cycle, staging, budtime, collapse, card_info)
30
+ gv.process(depends)
31
+ dump(rules, output_base, gv)
32
+ gv.finish(depanalysis, fmt)
33
+ inject_js(staging, "#{viz_name}.svg")
34
+ File.delete(staging)
35
+ end
36
+
37
+ def inject_js(input, fname)
38
+ fin = File.open(input, "r")
39
+ fout = File.open(fname, "w")
40
+ while line = fin.gets
41
+ fout.puts line.gsub("<title>G</title>", svg_javascript)
42
+ end
43
+ fin.close
44
+ fout.close
45
+ end
46
+
47
+ def dump(shredded_rules, output_base, gv_obj)
48
+ return if shredded_rules.nil?
49
+
50
+ fout = File.new("#{output_base}/style.css", "w")
51
+ fout.puts css
52
+ fout.close
53
+ code = {}
54
+ rules = {}
55
+ convertor = Syntax::Convertors::HTML.for_syntax "ruby"
56
+ shredded_rules.each do |s|
57
+ fout = File.new("#{output_base}/#{s[0]}.html", "w+")
58
+ fout.puts header
59
+ fout.puts "<h1>Rule #{s[0]}</h1><br>"
60
+
61
+ c = convertor.convert(s[4])
62
+ c.sub!(/^<pre>/, "<pre class=\"code\" style='font-size:20px'>\n")
63
+ fout.puts c
64
+ rules[s[0]] = [s[1], s[4]]
65
+ fout.close
66
+ end
67
+
68
+ rules.each_pair do |k, v|
69
+ if !code[v[0]]
70
+ code[v[0]] = ""
71
+ end
72
+ #code[v[0]] = "<br># RULE #{k}<br> " + code[v[0]] + "<br>" + v[1]
73
+ code[v[0]] = "\n# RULE #{k}\n " + code[v[0]] + "\n" + v[1]
74
+ end
75
+ gv_obj.nodes.each_pair do |k, v|
76
+ fout = File.new("#{output_base}/#{k}.html", "w+")
77
+ fout.puts header
78
+ k.split(", ").each do |i|
79
+ unless code[i].nil?
80
+ c = convertor.convert(code[i])
81
+ c.sub!(/^<pre>/, "<pre class=\"code\">\n")
82
+ fout.puts c
83
+ end
84
+ end
85
+ fout.puts("</body></html>")
86
+ fout.close
87
+ end
88
+ end
89
+
90
+ def header
91
+ return "<html><meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>\n<head><link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\" /></head><body>"
92
+ end
93
+
94
+ def css
95
+ return <<END_CSS
96
+ pre.code {
97
+ padding: 1ex 1ex 1ex 1ex;
98
+ border: 4px groove #CC0000;
99
+ overflow-x: auto;
100
+ }
101
+
102
+ pre.code span.attribute { color: #009900; }
103
+ pre.code span.char { color: #F00; }
104
+ pre.code span.class { color: #A020F0; font-weight: bold; }
105
+ pre.code span.comment { color: #0000FF; }
106
+ pre.code span.constant { color: #008B8B; }
107
+ pre.code span.escape { color: #6A5ACD; }
108
+ pre.code span.expr { color: #2222CC; }
109
+ pre.code span.global { color: #11AA44; }
110
+ pre.code span.ident { color: #000000; }
111
+ pre.code span.keyword { color: #A52A2A; font-weight: bold; }
112
+ pre.code span.method { color: #008B8B; }
113
+ pre.code span.module { color: #A020F0; font-weight: bold; }
114
+ pre.code span.number { color: #DD00DD; }
115
+ pre.code span.punct { color: #6A5ACD; }
116
+ pre.code span.regex { color: #DD00DD; }
117
+ pre.code span.string { color: #DD00DD; }
118
+ pre.code span.symbol { color: #008B8B; }
119
+ END_CSS
120
+ end
121
+
122
+ def svg_javascript
123
+ return <<END_JS
124
+ <script type='text/javascript'>
125
+ <![CDATA[
126
+
127
+ var windows = new Array()
128
+ var info = new Array()
129
+
130
+ function openWin(target, time) {
131
+ win = window.open(target + \"_\" + time + \".html\", target, \"location=no,width=400,height=180,left=0,status=no\");
132
+ // hm, an associative array, how strange.
133
+ info[target] = 1
134
+ }
135
+
136
+ function advanceTo(time) {
137
+ arr = gup(\"wins\").split(\",\");
138
+ for (i=0; i < arr.length; i++) {
139
+ if (arr[i] != \"\") {
140
+ openWin(arr[i], time);
141
+ }
142
+ }
143
+ str = '';
144
+ // getting 'key_cols'
145
+ for (var i in info) {
146
+ str = str + ',' + i;
147
+ }
148
+ self.window.location.href = 'tm_' + time + '.svg?wins=' + str;
149
+ }
150
+
151
+ // off the netz
152
+ function gup(name) {
153
+ name = name.replace(/[\[]/,\"\\\[\").replace(/[\]]/,\"\\\]\");
154
+ var regexS = \"[\\?&]\"+name+\"=([^&#]*)\";
155
+ var regex = new RegExp(regexS);
156
+ var results = regex.exec(window.location.href);
157
+ if (results == null)
158
+ return \"\";
159
+ else
160
+ return results[1];
161
+ }
162
+
163
+ ]]>
164
+ </script>
165
+ END_JS
166
+ end
167
+
168
+ def get_meta2(dir)
169
+ meta_tabs = {"t_table_info" => :tabinf, "t_table_schema" => :tabscm, "t_cycle" => :cycle, "t_depends" => :depends, "t_rules" => :rules}
170
+ meta = {}
171
+ data = []
172
+ ret = DBM.open("#{dir}/the_big_log.dbm")
173
+ ret.each_pair do |k, v|
174
+ key = MessagePack.unpack(k)
175
+ tab = key.shift
176
+ time = key.shift
177
+ # paa
178
+ tup = key[0]
179
+ MessagePack.unpack(v).each {|val| tup << val}
180
+ if meta_tabs[tab]
181
+ raise "non-zero budtime. sure this is metadata?" if time != 0 and strict
182
+ meta[meta_tabs[tab]] ||= []
183
+ meta[meta_tabs[tab]] << tup
184
+ #ret << tup
185
+ else
186
+ data << [time, tab, tup]
187
+ end
188
+ end
189
+
190
+ meta_tabs.each_value do |tab|
191
+ meta[tab] ||= []
192
+ end
193
+
194
+ meta[:schminf] = {}
195
+ meta[:tabscm].each do |ts|
196
+ tab = ts[0].to_s
197
+ unless meta[:schminf][tab]
198
+ meta[:schminf][tab] = []
199
+ end
200
+ meta[:schminf][tab][ts[2]] = ts[1]
201
+ end
202
+ return meta, data
203
+ end
204
+ end