bud 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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